天天看点

freemarker模板引擎的使用

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}、