1.为什么使用freemarker替代jsp?
(1)不能写java代码,只做数据显示,不进行业务逻辑处理,更加符合mvc模式。
(2)性能比较好,在复杂页面如:在做大量的判断、日期金额格式化的页面上,freemarker的性能高于使用tag和el的jsp。因为jsp的el表达式一般都是解释执行,而且大量使用反射,性能很低。在性能方面,使用java原生代码最快,所以无论使用哪种模板引擎,都不能超越使用原生的java脚本代码。
(3)支持jsp标签。
(4)jsp会编译成class文件,但是freemaker不用编译成类,并不需要新的类加载器加载。
2.使用freemarker+springmvc+sitemesh
(1)添加maven依赖:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.21</version>
</dependency>
<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>2.4.2</version>
</dependency>
(2)在web.xml中配置sitemesh
<filter>
<filter-name>siteMeshFilter</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>siteMeshFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(3)在springmvc中配置freemarker
<!-- 定义JSP文件的位置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="contentType" value="text/html; charset=utf-8" />
<property name="suffix" value=".jsp" />
<property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" />
<property name="order" value="1" />
</bean>
<!-- 配置freeMarker视图解析器 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<property name="contentType" value="text/html; charset=utf-8" />
<property name="cache" value="false" />
<property name="suffix" value=".ftl" />
<property name="order" value="0" />
<!-- 上下文,这里配置之后,fkt文件中可以使用${rc.getContextPath()} 来获取文件上下文,类似jsp的request.getContextPath() -->
<property name="requestContextAttribute" value="rc" />
</bean>
<!-- 配置freeMarker的模板路径 -->
<bean class="com.coracle.xsimple.shiro.ShiroTagFreeMarkerConfigurer"><!--org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer-->
<!-- freemarker模板位置 -->
<property name="templateLoaderPaths" value="classpath:ftl/" />
<property name="preferFileSystemAccess" value="false" />
<property name="defaultEncoding" value="utf-8" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="classic_compatible">true</prop>
<prop key="number_format">0.######</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
</bean>
(4)在WEB-INF下面配置decortor.xnl文件
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/layouts/"> <!--装饰文件存放的目录-->
<excludes> <!--过滤不被装饰的页面-->
<pattern>/assets/*</pattern>
</excludes>
<decorator name="default" page="default.jsp">
<pattern>/main</pattern><!--要被装饰的页面-->
</decorator>
</decorators>
(5)在WEB-INF下添加sitmesh.xml(我这里是没有添加,使用sitemesh.jar中自带的默认配置)
<sitemesh>
<property name="decorators-file" value="/WEB-INF/decorators.xml"/>
<excludes file="${decorators-file}"/>
<page-parsers>
<parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
</page-parsers>
<decorator-mappers>
<mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
<param name="property.1" value="meta.decorator" />
<param name="property.2" value="decorator" />
</mapper>
<mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper"/>
<mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
<param name="decorator" value="printable" />
<param name="parameter.name" value="printable" />
<param name="parameter.value" value="true" />
</mapper>
<mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper"/>
<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
<param name="config" value="${decorators-file}" />
</mapper>
</decorator-mappers>
</sitemesh>
3.freemarker语法使用:
关于freeemarker的语法使用参考:http://www.cnblogs.com/linjiqin/p/3388298.html
list的遍历 :
<#list employeeeList as employee>
<tr>
<td>${employee.id}</td>
<td>${employee.name}</td>
</tr>
</#list>
if判断是否为空:
<#if m.name()?? >
if/else的使用:
<#if m.name() == certificate.workStatus>
<option value='${m.name()}' selected>${m.getTypeName()}</option>
<#elseif m.name() == 'usable' || m.name() == 'unusable'>
<option value='${m.name()}'>${m.getTypeName()}</option>
</#if>
格式化日期
(1)自己指定格式:
<th width="8%" class="synchrotime">${synchroRecord.updatetime?string('yyyy−MM−dd hh:mm:ss')}</th>
(2)使用date:只使用年、月、日
${dateVar?date}
(3)使用time:只使用时、分、秒
${dateVar?time}
(4)datetime:日期和时间两部分都被使用
${dateVar?datetime}、