- 配置
了解和學習一下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
解決辦法:
模板路徑不對,需要找到模板所在文件夾的上一級再往下找。