FreeMarker概要
FreeMarker是一款模板引擎,即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Languager(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据,而在模板之外注意要展示什么数据。
FreeMarker配置
maven项目添加POM依赖:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
SpringMVC配置视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!--是否启用缓存 -->
<property name="cache" value="true" />
<!--自动添加到路径中的前缀 -->
<property name="prefix" value="" />
<!--自动添加到路径中的后缀 -->
<property name="suffix" value=".html" />
<!--指定视图渲染类 -->
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<!-- 设置是否暴露Spring的macro辅助类库,默认为true -->
<property name="exposeSpringMacroHelpers" value="true" />
<!-- 是否应将所有request属性添加到与模板合并之前的模型。默认为false。 -->
<property name="exposeRequestAttributes" value="true" />
<!-- 是否应将所有session属性添加到与模板合并之前的模型。默认为false。 -->
<property name="exposeSessionAttributes" value="true" />
<!-- 在页面中使用${rc.contextPath}就可获得contextPath -->
<property name="requestContextAttribute" value="rc" />
<!--设置所有视图的内容类型,如果视图本身设置内容类型视图类可以忽略 -->
<property name="contentType" value="text/html;charset=UTF-8" />
<!-- 优先级,越小越前 -->
<property name="order" value="1" />
</bean>
模板引擎的配置细节
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/html" /> <!-- 模板路径 -->
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">5</prop><!-- 刷新模板的周期,单位为秒 -->
<prop key="defaultEncoding">UTF-8</prop><!--模板的编码格式 -->
<prop key="url_escaping_charset">UTF-8</prop><!--url编码格式 -->
<prop key="classic_compatible">true</prop> <!--此属性可以防止模板解析空值时的错误 -->
<prop key="locale">zh_CN</prop> <!--该模板所使用的国际化语言环境选项-->
<prop key="boolean_format">true,false</prop> <!--布尔值格式-->
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <!--日期时间格式-->
<prop key="time_format">HH:mm:ss</prop><!--时间格式-->
<prop key="number_format">0.######</prop><!--数字格式-->
<prop key="whitespace_stripping">true</prop><!--自动开启/关闭空白移除,默认为true-->
</props>
</property>
</bean>
FreeMarker标签
输出标签
输出散列变量:${ModelKey}
字符串常用操作:
${ModelKey?html} 对HTML进行编码(替换特殊符号)
${ModelKey?cap_first} 首字母大写
${ModelKey?lower_case} 字符串转小写
${ModelKey?upper_case} 字符串转大写
${ModelKey?trim} 首位去空格
数字类型常用操作:
${ModelKey?int} 显示转换成int类型
日期类型常用操作:
${ModelKey?string("yyyy-MM-dd HH:mm:ss")} 格式化时间
获取会话级变量Session中的值:
${Session.key}
判断标签
<#if(score>=90)>
优秀
<#elseif(score>=80)>
良好
<#elseif(score>=70)>
中等
<#elseif(score>=60)>
及格
<#else>
不及格
</#if>
遍历标签
<#list products as prod>
<tr>
<td>${prod.prodSn}</td>
<td>${prod.prodName}</td>
<td>${prod.prodPrice}</td>
<td>${prod.prodStock}</td>
<td>${prod.prodSale}</td>
</tr>
</#list>
导入标签
<#include "url"/>
生成静态页面
public static void buildPage(
String modulePath,
String moduleFile,
String targetPath,
Map map ) throws Exception{
// 生成Freemarker模板配置对象
Configuration configuration = new Configuration();
// 设置模板加载器
configuration.setDirectoryForTemplateLoading(new File(modulePath));
// 设置编码格式
configuration.setDefaultEncoding("UTF-8");
// 获取或创建一个模版。
Template template = configuration.getTemplate(moduleFile);
// 设置文件输入流编码,不然生成的html文件会中文乱码
FileWriterWithEncoding out = new FileWriterWithEncoding(targetPath,"UTF-8");
// 开始生成静态页面
template.process(map, out);
out.close();
}