1.1 FreeMarker简介
l FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java 编写
l FreeMarker 被设计用来生成HTML Web 页面,特别是基于MVC 模式的应用程序
l 虽然FreeMarker 具有一些编程的能力,但通常由Java 程序准备要显示的数据,由FreeMarker 生成页面,通过模板显示准备的数据(如下图)

l FreeMarker 不是一个Web 应用框架,而适合作为Web 应用框架一个组件
l FreeMarker 与容器无关,因为它并不知道HTTP 或Servlet ;FreeMarker 同样可以应用于非Web 应用程序环境
l FreeMarker 更适合作为Model2 框架(如Struts )的视图组件,你也可以在模板中使用JSP 标记库
l FreeMarker 是免费的
1.2 使用引入
1. 需要导入freemark 的jar 包, freemarker-2.3.20.jar
2. 这里使用的是SSM 框架,在SpringMVC 的配置文件中配置freemark 的模版路径和模版解析器,如下:
<!-- freemarker模版路径配置-->
<bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/xxx/xxx" />
<property name="defaultEncoding" value="UTF-8" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">10</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">#.##</prop>
</props>
</property>
</bean>
3. Spring 本身支持了对Freemarker 的集成。只需要配置一个针对Freemarker 的视图解析器即可。这里我们使用的是Spring 与Freemarker 整合需要用到的FreeMarkerViewResolver 解析器
<!-- 配置FreeMark视图解析器 -->
<bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="suffix" value=".ftl"/>
<property name="cache" value="true"/>
<property name="exposeSessionAttributes" value="true"/>
<property name="exposeRequestAttributes" value="true"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="allowSessionOverride" value="true"/>
<property name="order" value="1"/>
</bean>
2 ftl基本语法
2.1 if else 语句
1、if语句:<#if boolean表达式> </#if>
(1)判断后端返回的Java对象是否为空(null):<#if Java对象或者属性??> 执行代码 </#if>
说明:Java对象可以是集合、普通Java类或者属性。
(2)判断集合size:<#if 集合对象?size == 0> 执行代码 </#if>
(3)判断值相等:<#if 属性变量 == 2> 执行代码 </#if>
2、if else 语句:<#if orgList?size == 0> 执行代码 <#else> 执行代码 </#if>
2.2 list循环语句
1、遍历集合:
<#list 后端返回的集合对象 as 自定义对象> 执行代码 </#list>
示例:<#list orgList as org> 执行代码</#list>
2、范围内遍历:
示例:<#list startPage..endPage as index> </#list>
类似java代码:
int startPage =5;
int endPage =10;
for(int index=startPage;index<endPage ;index++){
System.out.println(index)
}
2.2 输出展示
1、输出后台返回的普通字符串或者数值:
<#if 变量名??>${变量名}</#if>
示例:<#if total??>${total}</#if>
2、输出后台返回的对象属性:
<#if 对象名.对象属性??>${对象名.对象属性}</#if>
示例::<#if org.orgName??>${org.orgName}</#if>
3、时间输出:
示例:<#if org.createdDate??>${org.createdDate?string("yyyy-MM-dd HH:mm:ss")}</#if>
3示例
以下是使用freemark 语法来展示数据,如下图:

视图解析器的工作流程大致是这样的:
1.Controller 的某个方法执行完成以后,返回一个视图(比如:listUser )
2. 视图解析器要做的工作就是找到某个对象来完成视图的渲染,或者跳转到其他的逻辑视图。这里的渲染对象通常就是我们的jsp 文件或者我们下面用的Freemarker( 例如listUser.jsp 或者listUser.ftl) 。
3 渲染完成以后,将解析结果发送到客户端浏览器