1. 与spring 集成
<!-- 模板信息设置 --> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/themes/${mop.cms.theme}"/> <property name="defaultEncoding" value="utf-8"/> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">1</prop> <prop key="url_escaping_charset">utf-8</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="date_format">yyyy-MM-dd</prop> <prop key="time_format">HH:mm:ss</prop> <prop key="number_format">0.######</prop> <prop key="whitespace_stripping">true</prop> <prop key="auto_import"/> </props> </property> </bean> <bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="prefix" value=""/> <property name="suffix" value=".ftl"/> <property name="contentType" value="text/html; charset=utf-8"/> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> <property name="requestContextAttribute" value="request"/> </bean>
2. 结合sitemesh使用
1) 在web.xml里加入配置
<filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class> </filter> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>sitemesh-freemarker</servlet-name> <servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class> <init-param> <param-name>TemplatePath</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>default_encoding</param-name> <param-value>UTF-8</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>sitemesh-freemarker</servlet-name> <url-pattern>*.ftl</url-pattern> </servlet-mapping>
2) 修改decorators.xml(必须要在根目录下)
<?xml version="1.0" encoding="UTF-8"?> <decorators defaultdir="/WEB-INF/themes/adminLTE/layouts"> <!-- 此处定义不需要过滤的页面 --> <excludes> <pattern>/css/*</pattern> <pattern>/images/*</pattern> <pattern>/js/*</pattern> <pattern>/error</pattern> </excludes> <!-- 此处用来定义装饰器需要过滤的页面 --> <decorator name="default" page="main.ftl"> <pattern>*</pattern> </decorator> </decorators>
3) 需要用的jar包
<dependency> <groupId>opensymphony</groupId> <artifactId>sitemesh</artifactId> <version>2.4.2</version> </dependency>
3. freemarker 常见语法
1)保留两位小数点${orderDetail.price?string("#.##")}
2)格式化时间${orderDetail.order.createTime?string("yyyy-MM-dd HH:mm:ss")}
4. 宏和函数定义和使用
1)宏
写法:
<#macro page url page maskSize=5>
<#if (number == pages)>
<li><a href="javascript:void(0);">下一页</a></li>
<li><a href="javascript:void(0);">尾页</a></li>
<#else>
<li><a href="${buildPageUrl(url2,page.pageNum+1,page)}">
(注:这个地方可以直接调用宏所在的FTL中的函数)下一页</a>
</li>
<li><a href="${buildPageUrl(url2,page.pages,page)}">尾页</a></li>
</#if>
</#macro>
引入方式: <#import "/user/common/macro/page.ftl" as pg >
调用方式:<@pg.page url="${queryUrl}" page=page maskSize=10 />
2).函数(function)
写法:
<#function buildPageUrl url pageNum data>
<#assign pageUrl = "${url}?pageNum=${pageNum}&pageSize=${data.pageSize}">
<#return pageUrl/>
</#function>
引入方式:<#include "/user/common/macro/date.ftl"/>
调用方式: ${buildPageUrl(url2,page.pageNum+1,page)}
3.不同的地方
1) <#return/> 的用途、引入方式、 调用方式 都不同。
2) 宏:可以提前返回,比如<#return/> 但是不能<#return 1>, A macro cannot return a value
宏,主要作用是,拼接内容,把宏内部的字符串展示出来,return返回值没有意义。
函数:与宏的调用方式不同,直接 ${buildPageUrl(url2,page.pageNum+1,page)}执行函数。
返回值才是最关键的结果,不是为了显示函数内部的字符串内容。
补充一点,在宏所在的ftl中,同时定义了函数,宏中可以直接使用这个函数。