1. 程式人生 > >Spring mvc整合freemarker詳解

Spring mvc整合freemarker詳解

1.什麼是FreeMarker

FreeMarker是一個模板引擎,一個基於模板生成文字輸出的通用工具,使用純Java編寫 FreeMarker被設計用來生成HTML Web頁面,特別是基於MVC模式的應用程式 雖然FreeMarker具有一些程式設計的能力,但通常由Java程式準備要顯示的資料,由FreeMarker生成頁面,通過模板顯示準備的資料(如下圖) 在這裡插入圖片描述

2.FreeMarker特性

能夠生成各種文字:HTML、XML、RTF、Java原始碼等等 易於嵌入到你的產品中:輕量級;不需要Servlet環境 外掛式模板載入器:可以從任何源載入模板,如本地檔案、資料庫等等 你可以按你所需生成文字:儲存到本地檔案;作為Email傳送;從Web應用程式傳送它返回給Web瀏覽器

3. springMVC整合Freemarker

1.新增jar包 新增freemarker的jar,還需要額外新增spring-content-support的jar包,不然會報錯。

2.然後再Spring的配置檔案中新增對freemarker的配置

<!-- 配置freeMarker的模板路徑 -->  
     <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
        <property name="templateLoaderPath" value="WEB-INF/ftl/" />  
        <property name="defaultEncoding" value="UTF-8" />  
     </bean>  
     <!-- freemarker檢視解析器 -->  
     <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
        <property name="suffix" value=".html" />  
        <property name="contentType" value="text/html;charset=UTF-8" />  
        <!-- 此變數值為pageContext.request, 頁面使用方法:rc.contextPath -->  
        <property name="requestContextAttribute" value="rc" />  
     </bean> 

3.寫一個User類:

package com.my.springmvc.bean;

public class User {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

4.一個FreeMarkerController類:

@Controller
@RequestMapping("/home")
public class FreeMarkerController {

    @RequestMapping("/index")
    public ModelAndView Add(HttpServletRequest request,HttpServletResponse response){
        User user = new User();
        user.setUsername("sg");
        user.setPassword("1234");
        List<User> users  = new ArrayList<User>();
        users.add(user);

        ModelAndView mv = new ModelAndView();
        mv.setViewName("index");
        mv.addObject("users",users);
        return mv;
    }
}

5.然後再WEB-INF/ftl目錄下建立一個index.html檔案:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>another</title>
</head>
<body>  
<#list users as user>  
username : ${user.username}<br/>  
password : ${user.password}  
</#list>  
</body>  
</html>

結果: 在這裡插入圖片描述

4.freemarker語法介紹:

1. FreeMarker模板檔案主要由如下4個部分組成 文字:直接輸出的部分 註釋:<#– … –> 格式部分,不會輸出 插值:即 ${…} 或 #{…} 格式的部分,將使用資料模型中的部分替代輸出 指令:FreeMarker 指定,和 HTML 標記類似,名字前加 # 予以區分,不會輸出

<html>
<head>
    <title>Welcome!</title>
</head>
<body>
    <#-- 註釋部分 -->
    <#-- 下面使用插值 -->
    <h1>Welcome ${username} !</h1>

    <p>We have these animals:</p>
    <u1>
        <!-- 使用FTL指令 -->
        <#list animals as animal>
        <li>${animal.name} for ${animal.price} Euros</li>
        </#list>
    </u1>
</body>
</html>

2.控制語句

<#if condition> 
    ... 
<#elseif condition2> 
    ... 
<#elseif condition3> 
    ... 
<#else>
<#switch value> 
    <#case refValue1> 
        ... 
        <#break> 
    <#case refValue2> 
        ... 
        <#break> 
    <#case refValueN> 
        ... 
        <#break> 
    <#default> 
        ... 
</#switch>

3判斷變數是否存在

<#if readonly??></#if>

4.防止空指標報錯 變數名後用 ! 加預設值:${foo!”Default”},如果 foo 為 null 則輸出 Default 5.普通的變數 這是最簡單的情況,直接變數名稱,如{name}

需要注意的是有的變數是需要轉義的如雙引號 6…遍歷List集合

<#list ["克里斯埃文斯", "斯嘉麗約翰遜", "小羅伯特唐尼"]  as x>  
${x}  
</#list>  

此外,迭代集合物件時,還包含兩個特殊的迴圈變數: item_index:當前變數的索引值 item_has_next:是否存在下一個物件 也可以使用<#break>指令跳出迭代 7.運算子 FreeMarker表示式中完全支援算術運算,FreeMarker支援的算術運算子包括:+, - , * , / , % 比較運算子

表示式中支援的比較運算子有如下幾個: 1,=或者==:判斷兩個值是否相等. 2,!=:判斷兩個值是否不等. 3,>或者gt:判斷左邊值是否大於右邊值 4,>=或者gte:判斷左邊值是否大於等於右邊值 5,<或者lt:判斷左邊值是否小於右邊值 6,<=或者lte:判斷左邊值是否小於等於右邊值

注意:=和!=可以用於字串,數值和日期來比較是否相等,但=和!=兩邊必須是相同型別的值,否則會產生錯誤,而且FreeMarker是精確比較,”x”,”x “,”X”是不等的.其它的執行符可以作用於數字和日期,但不能作用於字串,大部分的時候,使用gt等字母運算子代替>會有更好的效果,因為FreeMarker會把>解釋成FTL標籤的結束字元,當然,也可以使用括號來避免這種情況,如:<#if (x>y)>

邏輯運算子

和普通程式一樣,freemarker也有&&,|| ,!三種 8.變數的宣告

<#assign num=0/>

9.include指令 include指令的作用類似於JSP的包含指令,用於包含指定頁.include指令的語法格式如下: <#include filename [options]> 在上面的語法格式中,兩個引數的解釋如下: filename:該引數指定被包含的模板檔案 options:該引數可以省略,指定包含時的選項,包含encoding和parse兩個選項,其中encoding指定包含頁面時所用的解碼集,而parse指定被包含檔案是否作為FTL檔案來解析,如果省略了parse選項值,則該選項預設是true. 10.import指令 該指令用於匯入FreeMarker模板中的所有變數,並將該變數放置在指定的Map物件中,import指令的語法格式如下: <#import “/lib/common.ftl” as com> 上面的程式碼將匯入/lib/common.ftl模板檔案中的所有變數,交將這些變數放置在一個名為com的Map物件中. 11 macro的使用 這個可以用來實現自定義指令,一般用來做公共元件,例如分頁條 最後說下list中含有map的遍歷,這種情況可以使用點語法或方括號語法.假如有下面的資料模型: Map root = new HashMap(); Book book = new Book(); Author author = new Author(); author.setName(“annlee”); author.setAddress(“gz”); book.setName(“struts2”); book.setAuthor(author); root.put(“info”,”struts”); root.put(“book”, book);