一、背景
1、什么是FreeMarker
FreeMarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,使用純Java編寫
FreeMarker被設計用來生成HTML Web頁面,特別是基於MVC模式的應用程序
雖然FreeMarker具有一些編程的能力,但通常由Java程序准備要顯示的數據,由FreeMarker生成頁面,通過模板顯示准備的數據(如下圖)
2、FreeMarker特性
-
- 能夠生成各種文本:HTML、XML、RTF、Java源代碼等等
- 易於嵌入到你的產品中:輕量級;不需要Servlet環境
- 插件式模板載入器:可以從任何源載入模板,如本地文件、數據庫等等
- 你可以按你所需生成文本:保存到本地文件;作為Email發送;從Web應用程序發送它返回給Web瀏覽器
二、整合
本示例是在spring的基礎上整合freeMarker,所以對於spring的部分配置不重點關注;
1、項目目錄結構
其中:springmvc-servlet是spring與freeMarker整合配置文件,而WEB-INF下的文件夾中,ftl為freeMarker的模板,jsp為spring的模板,resource為一些靜態文件;
2、pom.xml中加入freeMarker的依賴
1 <!-- freemarker模板 --> 2 <dependency> 3 <groupId>org.freemarker</groupId> 4 <artifactId>freemarker</artifactId> 5 <version>2.3.23</version> 6 </dependency> 7
3、springmvc-servlet中的配置
1 <!-- 配置Jsp視圖解析器 --> 2 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 3 <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView" /> 4 <property name="prefix" value="/WEB-INF/jsp/" /> 5 <property name="suffix" value=".jsp" /> 6 <property name="order" value="1" /> 7 </bean> 8 9 <!-- 配置freeMarker的模板路徑 --> 10 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 11 <property name="templateLoaderPath" value="/WEB-INF/ftl/" /><!--注意這兒不要添加classpath--> 12 <property name="defaultEncoding" value="utf-8" /> 13 <property name="freemarkerVariables"> 14 <map> 15 <entry key="xml_escape" value-ref="fmXmlEscape" /> 16 </map> 17 </property> 18 <property name="freemarkerSettings"> 19 <props> 20 <prop key="template_update_delay">0</prop> 21 <prop key="default_encoding">UTF-8</prop> 22 <prop key="number_format">0.##########</prop> 23 <prop key="date_format">yyyy-MM-dd</prop> 24 <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> 25 <prop key="locale">zh_CN</prop> 26 <prop key="classic_compatible">true</prop> 27 <prop key="template_exception_handler">ignore</prop> 28 </props> 29 </property> 30 </bean> 31 <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/> 32 33 <!-- 配置freeMarker視圖解析器 --> 34 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 35 <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> 36 <property name="contentType" value="text/html;charset=UTF-8"></property> 37 <property name="requestContextAttribute" value="request" /> 38 <property name="exposeSpringMacroHelpers" value="true" /> 39 <property name="exposeRequestAttributes" value="true" /> 40 <property name="exposeSessionAttributes" value="true" /> 41 <property name="cache" value="true" /> 42 <property name="prefix" value="" /> 43 <property name="suffix" value=".ftl" /> 44 <property name="order" value="0"/> 45 </bean>
其中:
1)jsp視圖解析器與freeMarker視圖解析器中的order屬性,只有在spring項目多視圖時才配置。上面配置中把freemarker的order設置為0,jsp為1。意思是找view時,先找ftl文件,再找jsp文件做為視圖;
2)我感覺配置中最重要的屬性是templateLoaderPath,即ftl模板的位置。沒有這個屬性的支持,其他的屬性不起作用。我按照網上的一個配置給他的value加了classPaht,結果spring找不到ftl模板位置,讓我吃了不少苦頭。所以classPath不能有。我的建議是,在spring整合freeMarker時,暫時先不用管jsp是不是404,freeMarker配置完成后,先來一個小示例,如果跳轉之后,出現404並且路徑后面有jsp,那證明要么是templateLoaderPath屬性有問題,要么是order屬性有問題。而且跳轉成功后看看flt頁面${}中的數據有沒有解析,如果沒有也是不成功的。等到ftl頁面顯示正常,再考慮jsp與ftl兩種視圖共存的問題吧。
4、ftl模板。在WEB-INF/ftl下新建test.ftl
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>測試</title> 6 </head> 7 <body> 8 9 姓名:${userName} 10 <br/> 11 年齡:${userAge} 12 13 </body> 14 </html>
5、后端代碼。跳轉到test.ftl
1 @Controller 2 public class FreemarkerController { 3 4 @RequestMapping("/test") 5 public String sayHello1(ModelMap map){ 6 map.put("userName","小明"); 7 map.put("userAge",23); 8 return "test"; 9 } 10 11 }
6、瀏覽器顯示
備注:Idea和Eclipse為了開發方便,都有ftl的插件,各位有興趣可以看看。
到此為止,已經成功整合了SpringMVC和Freemarker!