freemarker 整理

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中,同时定义了函数,宏中可以直接使用这个函数。

     


你可能感兴趣的:(freemarker 整理)