模板引擎freemarker的使用(一)

  1. 配置
    瞭解和學習一下freemarker在項目中的配置與使用,順便記錄下來,知識源於分享,進步源於交流。。。
    我是在ssm中配置的。

maven 中需要引入的依賴

<!-- freemarker的版本號 -->
<freemarker.version>2.3.20</freemarker.version>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>${freemarker.version}</version>
</dependency>

配置文件如下:

    <!-- ViewResolver For FreeMarker -->
    <bean id="freemarkerResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
        </property>
        <property name="suffix" value=".ftl"/>
        <property name="contentType" value="text/html;charset=utf-8"/>
        <property name="requestContextAttribute" value="request"/>
        <property name="order" value="0"/>
    </bean>
<!-- ViewResolver For FreeMarkerConfigurer -->
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPaths">
            <list>
                <value>/front-end/</value>
                <value>/front-end/main-frame</value>
                <value>/</value><!-- 配置文件路徑 -->
            </list>
        </property>
        <property name="freemarkerSettings"><!-- 設置FreeMarker環境屬性 -->
            <props>
                <prop key="template_update_delay">5</prop><!--刷新模板的週期,單位爲秒 -->
                <prop key="default_encoding">UTF-8</prop><!--模板的編碼格式 -->
                <prop key="locale">UTF-8</prop><!-- 本地化設置 -->
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                <prop key="time_format">HH:mm:ss</prop>
                <prop key="number_format">0.####</prop>
                <prop key="boolean_format">true,false</prop>
                <prop key="whitespace_stripping">true</prop>
                <prop key="tag_syntax">auto_detect</prop>
                <prop key="url_escaping_charset">UTF-8</prop>
            </props>
        </property>
    </bean>

.ftl 文件結構:

controller:

ModelAndView mav = new ModelAndView();
mav.setViewName("/main-frame");
return mav;

2.佈局模板拆分(轉自http://www.hawu.me/coding/733
使用freemarker的macro、import、include指令,我們可以將佈局模板拆分爲如下幾個文件


<#macro layout>
<html>
<head>
</head>
<body>
    <div style="width: 700px; text-align:center; font-size:30px;">
        <#include "header.ftl">
        
        <#include "sidebar.ftl">
    
        <#-- 在這裏嵌入main content -->
        <#nested>
        
        <#include "footer.ftl">
    </div>
</body>
</html>
</#macro>
<#macro layout>
<html>
<head>
</head>
<body>
    <div style="width: 700px; text-align:center; font-size:30px;">
        <#include "header.ftl">
        
        <#include "sidebar.ftl">
    
        <#-- 在這裏嵌入main content -->
        <#nested>
        
        <#include "footer.ftl">
    </div>
</body>
</html>
</#macro>
<div style="background-color: #b4efb8;">header</div>
<div style="width:30%; height:300px; float:left; background-color: #8825ae;">
    sidebar
</div>
<div style="background-color: #B3D3F3;">fotter</div>

那麼在任何一個使用該佈局的頁面,我們只要寫如下的代碼,修改要嵌入到layout中的main content就好了。

<#-- 引入佈局指令的命名空間 -->
<#import "../layout/defaultLayout.ftl" as defaultLayout>

<#-- 調用佈局指令 -->
<@defaultLayout.layout>

    <#-- 將下面這個main content嵌入到layout指令的nested塊中 -->
    <div style="width:70%; height:300px; float:left; background-color: #12c5ae;">
           main content</div>

</@defaultLayout.layout>

<#-- 引入佈局指令的命名空間 -->
<#import "../layout/defaultLayout.ftl" as defaultLayout>
 
<#-- 調用佈局指令 -->
<@defaultLayout.layout>
 
    <#-- 將下面這個main content嵌入到layout指令的nested塊中 -->
    <div style="width:70%; height:300px; float:left; background-color: #12c5ae;">
           main content</div>
 
</@defaultLayout.layout>

而且如果要更換佈局,比如修改header,也不用每個頁面都去改一遍了。這就實現了模板的可複用。

使用模板拆分,遇到的問題:

Caused by: java.io.FileNotFoundException: Template "../main-frame/main-frame.ftl" not found.
    at freemarker.template.Configuration.getTemplate(Configuration.java:742)
    at freemarker.core.Environment.getTemplateForInclusion(Environment.java:1694)
    at freemarker.core.Environment.getTemplateForImporting(Environment.java:1748)
    at freemarker.core.LibraryLoad.accept(LibraryLoad.java:111)
    ... 48 more

解決辦法:

模板路徑不對,需要找到模板所在文件夾的上一級再往下找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章