天天看點

模闆引擎二 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、效果展示

模闆引擎二 FreeMarker