《j2ee 简单网站搭建:(一) windows 操作系统下使用 eclipse 建立 maven web 项目》
《j2ee 简单网站搭建:(二)添加和配置 spring + spring-mvc 的 mvc 开发环境》
《j2ee 简单网站搭建:(三)在搭建好的 spring maven web 项目中加入 mybatis 访问数据库》
《j2ee 简单网站搭建:(四)将 freemaker 模板引擎作为 spring-mvc 展现层》
《j2ee 简单网站搭建:(五)使用 jcaptcha 生成验证码图片》
《j2ee 简单网站搭建:(六)使用 hibernate validation 实现 domain 层实体类验证》
《j2ee 简单网站搭建:(七)使用 shiro 结合 jcaptcha 实现用户验证登录》
《j2ee 简单网站搭建:(八)使用 jquery-validate 实现页面验证入门》
《j2ee 简单网站搭建:(九)jquery datatables + jquery ui dialog 插件使用入门》
《j2ee 简单网站搭建:(十)jquery ztree 插件使用入门》
《j2ee 简单网站搭建:(十一)ckeditor 控件使用入门》
很多开源 java web 项目都在用 freemaker 作为展现层模板引擎,在之前查资料的时候很多人说 velocity 执行最快、jsp 次之、freemaker执行最慢,而且 jsp 更适合复杂的模板定制环境,但越来越多人使用 freemaker 肯定有原因,其次本人在做项目公共代码生成工具的时候使用过 freemaker ,确实挺好用,此外 freemaker 通过 <#include "/***.ftl"/> 标签能够将页面中固定的页头、页脚等部分进行分离和统一引用,相比 SiteMesh 的模板要好配置一些,所以本文特意介绍在 spring-mvc 已搭建环境下的 freemaker集成,供初学者参考。
注:1 freemaker 版本 2.3.23
2 spring-mvc maven web 项目已完成搭建和配置一 在 pom.xml 中添加 freemaker 需要的库
<properties>
<fasterxml.version>2.7.0-rc1</fasterxml.version>
<freemarker.version>2.3.23</freemarker.version>
</properties>
<dependencies>
<!-- freemaker包 start -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${fasterxml.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${fasterxml.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${fasterxml.version}</version>
</dependency>
<!-- freemaker包 start -->
</dependencies>
二 新建 freemarker.properties 和 spring-freemaker-config.xml 两个配置文件
其中 freemaker.properties 文件包含 freemaker 引擎初始化的各种参数,其中比较关键的是 freemaker 模板文件的存放位置 templateLoaderPaths ,该位置是相对网站根目录而言的,一般都会放在网站 WEB-INF 文件夹下,因为这个文件夹下的文件无法被客户端浏览器下载。其次是文件后缀属性 suffix=.ftl 设置模板文件后缀名称,在 controller 层设置转向页面或者加载页面时只写名字不写后缀就可以加载对应的 freemaker 模板。
spring-freemaker-config.xml 是 freemaker 和 spring 的结合配置文件
freemarker.templateLoaderPaths=/WEB-INF/ftl/
freemarker.defaultEncoding=UTF-8
freemarker.freemarkerSettings.template_update_delay=10
freemarker.freemarkerSettings.defaultEncoding=UTF-8
freemarker.freemarkerSettings.url_escaping_charset=UTF-8
freemarker.freemarkerSettings.locale=zh_CN
freemarker.freemarkerSettings.boolean_format=true,false
freemarker.freemarkerSettings.time_format=HH:mm:ss
freemarker.freemarkerSettings.datetime_format=yyyy-MM-dd HH:mm:ss
freemarker.freemarkerSettings.date_format=yyyy-MM-dd
freemarker.freemarkerSettings.number_format=#.##
freemarker.freemarkerSettings.whitespace_stripping=true
freemarker.cache=true
freemarker.prefix=
freemarker.suffix=.ftl
freemarker.contentType=text/html;charset=UTF-8
freemarker.requestContextAttribute=request
freemarker.exposeSpringMacroHelpers=true
freemarker.exposeRequestAttributes=true
freemarker.exposeSessionAttributes=true
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<description>freemaker configuration</description>
<!-- 引入资源目录下的所有properties属性文件 -->
<context:property-placeholder location="classpath*:freemarker.properties"/>
<!-- FreeMarker的配置开始 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPaths" value="${freemarker.templateLoaderPaths}" />
<property name="defaultEncoding" value="${freemarker.defaultEncoding}" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">${freemarker.freemarkerSettings.template_update_delay}</prop>
<prop key="defaultEncoding">${freemarker.freemarkerSettings.defaultEncoding}</prop>
<prop key="url_escaping_charset">${freemarker.freemarkerSettings.url_escaping_charset}</prop>
<prop key="locale">${freemarker.freemarkerSettings.locale}</prop>
<prop key="boolean_format">${freemarker.freemarkerSettings.boolean_format}</prop>
<prop key="time_format">${freemarker.freemarkerSettings.time_format}</prop>
<prop key="datetime_format">${freemarker.freemarkerSettings.datetime_format}</prop>
<prop key="date_format">${freemarker.freemarkerSettings.date_format}</prop>
<prop key="number_format">${freemarker.freemarkerSettings.number_format}</prop>
<prop key="whitespace_stripping">${freemarker.freemarkerSettings.whitespace_stripping}</prop>
</props>
</property>
</bean>
<!-- 配置 FreeMarker视图解析器 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="${freemarker.cache}" />
<property name="prefix" value="${freemarker.prefix}" />
<property name="suffix" value="${freemarker.suffix}" />
<property name="contentType" value="${freemarker.contentType}" />
<property name="requestContextAttribute" value="${freemarker.requestContextAttribute}" />
<property name="exposeSpringMacroHelpers" value="${freemarker.exposeSpringMacroHelpers}" />
<property name="exposeRequestAttributes" value="${freemarker.exposeRequestAttributes}" />
<property name="exposeSessionAttributes" value="${freemarker.exposeSessionAttributes}" />
</bean>
<!-- FreeMarker的配置结束 -->
</beans>
三 在 web.xml 文件 <context-param> 节点的 <param-value> 参数节点中添加一行 spring-freemaker-config.xml 的配置信息,格式为 classpath*:spring-freemaker-config.xml
四 在 src/main/webapp/WEB-INF/ftl 文件夹下新建测试模板 freemakertest.ftl
freemaker 模板加载成功
五 在 com.binux.webdemo.controller 包 TestController.java 文件中增加 freemakerShow 方法,调用并输出 freemakertest.ftl 模板,启动项目用浏览器打开地址 http://localhost:8080/webdemo/test/freemakerShow 应该正确输出 freemaker 模板加载成功。
package com.binux.webdemo.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.binux.webdemo.service.TestService;
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping(value="/freemakerShow")
public ModelAndView freemakerShow() {
ModelAndView mv = new ModelAndView();
mv.setViewName("freemakertest");
return mv;
}
}