SpringMVC整合freeMarker實現頁面靜態化+SpringMVC配置多視圖


 

一、背景

  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!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM