模板引擎二 FreeMarker

目錄

一、瞭解FreeMarker

二、FreeMarker基本語法

三、FreeMarker快速入門

四、FreeMarker高級指令--list

五、FreeMarker--內建函數

六、FreeMarker在web項目中的應用


在線中文參考手冊:http://freeMarker.foofun.cn/toc.html
在線模板測試網站:https://try.freeMarker.apache.org

一、瞭解FreeMarker

模板引擎,基於模板和要改變的數據,用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼)的通用工具。是一個Java類庫,一款組件。
與JSP區別:FreeMarker是根據模板生成各種文件,而JSP是需要jsp的引擎,來解析成servlet,然後把servlet編譯成字節碼文件來執行。

FreeMarker的特點:
    徹底分離表現層和業務邏輯
    性能好,提高開發效率
    使得開發過程中的人員分工更加明確
    學習成本低
    支持表達式、宏定義(類似jsp標籤)

二、FreeMarker基本語法

1、數據類型:

標量:基本數據類型。字符串、數字、布爾值、日期/時間
容器:哈希表(類似於HashMap)、序列(類似於List)、集合
子程序:方法和函數、用戶自定義指令

2、算術運算符

數字運算:+-*/%
字符串運算:${name}、${"hello,${name}"}、${"hello,"+name}、<#if isBig>Wow!</#if>、變量下標爲0和4的字符:${name[0]}${name[4]}、下標爲0到4的字符:${name[0..4]}
    指令:以<#標識:錯誤:<#if ${isBig}>Wow!</#if>    正確:<#if isBig>Wow!</#if>,isBig變量不需要加表達式,可以直接寫
邏輯運算符:與&&、或||、非!
比較運算符:>(gt) <(lt) >=(gte) <=(lte) ==(或=) != (推薦使用英文符號)
    只能比較數字和日期,不能比較字符串,返回爲布爾類型不能直接輸出
    由於FreeMarker會將>解釋成FTL標記的結束字符,所以對於>和>=可以使用括號來避免這種情況,比如<#if (x>y)>
空值運算符:
    ??(判斷是否爲空):FreeMarker中沒有null的定義,需要判斷是否爲空。
        檢查對象的屬性是否爲空:<#if object.attribute??></#if>,檢查對象或屬性是否爲空:<#if (object.attribute)??></#if>
    !(指定缺少變量的默認值,如果不指定則默認值是空字符串、長度爲0的序列或長度爲0的Map對象)
        ${aaa!}:如果aaa變量沒定義,不報錯,默認沒有任何輸出
        ${aaa!'-'}:如果aaa變量沒定義,爲空,就默認設置該表達式輸出的值爲橫槓-,這裏不會爲aaa變量賦值
        ${(user.name)!"默認值"}:如果user或name爲空,就輸出默認值
        ${user.name!"默認值"}:如果user爲空會報錯,如果name爲空會輸出默認值
        
3、模板中的代碼片段

    ${...}:表達式,稱爲interpolation插值
    註釋:<#-- --> 註釋的內容不會輸出
    FTL標籤:FreeMarker的指令。這些標籤的名字以#開頭。用戶自定義的標籤則需要使用@來代替#。
    
4、基本指令
    
條件判斷指令:
    if指令:<#if 條件>輸出</#if>
    if-else指令:<#if 條件>輸出<#else>輸出</#if>
    if-elseif-else指令:<#if 條件1>輸出<#elseif 條件2>輸出<#else>輸出</#if>
    switch、case、break、default指令:參數可以爲數字、字符串。<#switch var><#case 條件1>輸出<#break><#case 條件2>輸出<#break><#default>輸出</#switch>

三、FreeMarker快速入門

靜態網頁、動態網頁

頁面靜態化:適用於高併發、要求響應速度快、大規模且數據變化不太頻繁的頁面場景

使用FreeMarker生成HTML文件
使用FreeMarker生成Java類

還寫什麼curl,通通搞個模板一鍵生成!!!

四、FreeMarker高級指令--list

1、list指令:兩種寫法

<#list users as user>
    ${user}
<#else>
    "list爲空"
</#list>

<#list users>
  <ul>
    <#items as user>
      <li>${user}</li>
    </#items>
  </ul>
<#else>
  <p>"list爲空"
</#list>

2、sep指令:可在每一個迭代項中間放一些內容,不會把內容插入到第一項之前或最後一項之後。可結合迭代指令List使用

<#list users as user>
    ${user}<#sep>, </#sep>
</#list>

通過內建函數實現sep指令效果:

<#list users as user>
    ${user}<#if user?has_next>, </#if>
</#list>

3、break指令:配合if指令使用,滿足條件時跳出迭代

<#list 1..10 as x>
    ${x}
    <#if x=3><#break></#if>
</#list>
1..10:代表1到10

4、list指令排序

升序:sort、sort_by()
對users升序排序:
<#list users?sort as user>
</#list>
根據年齡對用戶list升序排序:
<#list users?sort_by("age") as user>
</#list>
降序:sort_by()?reverse
<#list users?sort_by("age")?reverse as user>
</#list>

5、list遍歷Map

<#list dataMap?keys as key>
    <option value="${key}">${dataMap[key]}</option>
    ${key}-${dataMap[key]}<#if key?has_next>, </#if>
</#list>

像else、items、break只能在指令體內部使用,而不能移出到宏或被包含的模板中

五、FreeMarker--內建函數

內建函數:由語法規定存在的內建函數。包含在編譯器的運行時庫中,直接調用即可,其實現由編譯器對應的廠商完成。
使用到的內建函數:sort、sort_by、reverse、keys、has_next
特點:都是寫在?後面,實現某個功能(函數)
編譯器提供了針對各種數據類型的內建函數、結點(xml)內建函數、循環變量內建函數、獨立類型內建函數、其他內建函數(很少使用或專家級的)
相關內建函數參考可見:http://freemarker.foofun.cn/ref_builtins.html

六、FreeMarker在web項目中的應用

1、添加依賴:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

2、指定freemarker文件的後綴爲ftl,默認爲ftlh
spring.freemarker.suffix=.ftl

3、創建一個以.ftl爲後綴的文件 src\main\resources\templates\test.ftl

<html>
<body>
<div class="container">
    <table class="table table-dark table-hover">
        <thead>
        <tr>
            <th>name</th>
            <th>age</th>
            <th>sex</th>
        </tr>
        </thead>
        <tbody>
        <#list userlist?sort_by("age") as user>
        <tr>
            <td>
                <#if (user.name)??>
                    ${user.name}
                <#else>
                    姓名不詳
                </#if>
            </td>
            <td>${user.age!"年齡不詳"}</td>
            <td>${user.sex!"性別不詳"}</td>
        </tr>
        </#list>
        </tbody>
    </table>
</div>
</body>
</html>

4、編寫Controller,跳轉到freemarker文件

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestUser {
    private String name;
    private String age;
    private String sex;
}
@Controller
public class TestController {
    @RequestMapping("/test")
    public String test(HttpSession session){
        TestUser user1 = new TestUser("zhangsan","23","男");
        TestUser user2 = new TestUser("lisi","18",null);
        TestUser user3 = new TestUser(null,"20","女");
        List<TestUser> userlist = new ArrayList();
        userlist.add(user1);
        userlist.add(user2);
        userlist.add(user3);
        session.setAttribute("userlist",userlist);
        return "test";
    }
}

5、效果展示

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