整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Spring Boot使用freemarker并且生成靜態html頁面

          pring Boot使用freemarker并且生成靜態html頁面

          之前我介紹了在spring boot中使用thymeleaf模板,這次我會給大家介紹在spring boot中使用freemarker模板技術,同時利用freemarker生成靜態html頁面。生成靜態html頁面就能實現網站的靜態化進而提高網站的訪問速度以及提高SEO能力。

          首先在pom.xml中添加依賴

          添加依賴

          <dependency>
           <groupId>org.freemarker</groupId>
           <artifactId>freemarker</artifactId>
           <version>2.3.23</version>
           </dependency>
          

          application配置

          在application.properties中添加freemarker的配置參數

          ##freemarker
          spring.freemarker.cache=false
          spring.freemarker.charset=UTF-8
          spring.freemarker.check-template-location=true
          spring.freemarker.content-type=text/html
          spring.freemarker.enabled=true
          spring.freemarker.suffix=.ftl
          spring.freemarker.template-loader-path=classpath:/templates
          

          Controller和ftl模板

          下一步我們就建一個基礎Controller類和配套的ftl模板

          Controller類

          package com.hw.myp2c.common.controller;
          import freemarker.template.Configuration;
          import freemarker.template.Template;
          import freemarker.template.TemplateException;
          import org.springframework.stereotype.Controller;
          import org.springframework.ui.Model;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          import javax.annotation.Resource;
          import java.io.*;
          import java.net.URISyntaxException;
          import java.util.HashMap;
          import java.util.Map;
          @Controller
          @RequestMapping("")
          public class MainController {
           @GetMapping
           public String main(Model model){
           String w="Welcome FreeMarker!";
           Map root = new HashMap();
           root.put("w",w);
           model.addAttribute("w","Welcome FreeMarker!");
           return "test";
           }
          }
          

          可以看到很簡單,跟之前的thymelefa和jsp的沒有區別。

          freemarker模板

          <html>
          <head>
           <title>Welcome!</title>
           <link rel="stylesheet" href="/bootstrap.min.css">
           <script src="/lib/jquery.min.js"></script>
          </head>
          <body>
          <h1>Hello ${w}!</h1>
          </body>
          </html>
          

          這樣之后我們就能完成了基礎freemarker的使用,更多的使用參見freemarker官方網站,這里不做過多的描述。

          這里我們已經完成了標準的freemarker集成,下面我們將介紹如何利用freemarker生成靜態html頁面,直接上代碼,作為演示我們還是在Controller中完成,在實際應用中我們可以按照自己的實際需要進行封裝。

          package com.hw.myp2c.common.controller;
          import freemarker.template.Configuration;
          import freemarker.template.Template;
          import freemarker.template.TemplateException;
          import org.springframework.stereotype.Controller;
          import org.springframework.ui.Model;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RequestMapping;
          import javax.annotation.Resource;
          import java.io.*;
          import java.net.URISyntaxException;
          import java.util.HashMap;
          import java.util.Map;
          @Controller
          @RequestMapping("")
          public class MainController {
           @Resource
           Configuration cfg;
           @GetMapping
           public String main(Model model){
           String w="Welcome FreeMarker!";
           Map root = new HashMap();
           root.put("w",w);
           freeMarkerContent(root);
           model.addAttribute("w","Welcome FreeMarker!");
           return "test";
           }
           private void freeMarkerContent(Map<String,Object> root){
           try {
           Template temp = cfg.getTemplate("test.ftl");
           //以classpath下面的static目錄作為靜態頁面的存儲目錄,同時命名生成的靜態html文件名稱
           String path=this.getClass().getResource("/").toURI().getPath()+"static/test.html";
           Writer file = new FileWriter(new File(path.substring(path.indexOf("/"))));
           temp.process(root, file);
           file.flush();
           file.close();
           } catch (IOException e) {
           e.printStackTrace();
           } catch (TemplateException e) {
           e.printStackTrace();
           } catch (URISyntaxException e) {
           e.printStackTrace();
           }
           }
          }
          

          利用freemarker生成靜態頁面我理解的流程是這樣的

          1.利用Configuration讀取想生成靜態頁面的模板,這里是test.ftl

          2.解析模板文件,并將模板中的${}!包含的參數替換成真實的數據

          3.最終將讀取了真實數據的模板生成相應的html文件,并寫入指定目錄

          這樣我們就完成了spring boot中使用freemarker模板,并且利用freemarker生成靜態html文件

          擊右上方,關注開源中國OSC頭條號,獲取最新技術資訊

          一、前言

          上一篇 <從現在開始,試著學會用官方文檔去學習一個技術框架> 提倡大家多去從官方文檔學習技術,沒有講到具體的實踐,本篇就拿一個案例具體的說一說,就是FreeMarker,選擇這個框架沒什么特別的含義,最近要用,就拿這個做個典型。

          二、套路

          上篇文章最后說到技術學習沒有套路,無招勝有招,無招即是有招,解讀一下實際上就是說 本身還是有些招式套路,但是要靈活運用,不要什么都往上套,應該忘掉固有的套路,讓其化為你的一種本能,見招拆招。

          下面就介紹一種常規學習套路給大家,如下圖:

          下面就根據上面的套路結合FreeMarker官網溜一遍,來學習FreeMarker,重點在前4部分,后面兩部分需要一些積累和經驗后才更容易上手,所以本篇不會重點講

          三、實踐

          3.1 了解框架

          首先我們應該了解FreeMarker是用來干什么的,這時候我看打開官網 https://freemarker.apache.org/

          上圖來自官網首頁上方的導航,依次為 Home(主頁)Manual(手冊)JavaApi(API接口)、Contribute(貢獻)、 Report a Bug(反饋BUG)、 Download(下載) , 單詞不認識,找工具翻譯一下,沒有別的辦法,上篇也提到了。從字面意思理解可以看出跟我們有關的就是標紅的那4個,好的來看看首頁的介紹(大部分框架首頁都會有簡要介紹,說明框架的用途):

          這是首頁的兩段介紹,自行翻譯一下,這里就不在翻譯了,解讀一下,我們從這兩段內容中可以得到如下信息:

          (1)這是一個Java模板引擎

          (2)用模板語言(FTL)編寫

          (3)基本思想:java或其他編程語言準備數據,FreeMarker顯示數據,配合官方給的圖,更直觀

          (4)在模板中,您關注的是如何顯示數據,而在模板之外,您關注的是顯示什么數據,這也是所有模板引擎解決的核心問題 數據與顯示分離

          (5)用于MVC模式,有助于分離Java開發人員和web設計人員,設計人員不會在模板中面對復雜的邏輯,并且可以在不需要程序員更改或重新編譯代碼的情況下更改頁面的外觀,這里就說明了模板的好處,面試問你,為什么用模板技術啊,結合上面的一點就可以完美回答這個問題了

          (6)不依賴Servlet,也就是web環境和非Web環境都可以使用

          (7)更多細節內容看 manual (手冊)

          通過解讀官方的文檔,我們就可以得到以上7個方面的信息。也就了解了Freemarker的作用、基本思想、好處、應用環境,這些東西,相信在很多FreeMarker的教程中,都不會這么詳細,而且上面的信息基本上只要你把英文翻譯過來都可以直觀看到,我并沒有做太多總結性歸納。 這是基本內容,首頁還標出了一些特性我們再來看一下

          解讀一下得到的信息如下

          (1)強大的模板語言,支持條件塊、迭代、賦值、字符串和算術操作等

          (2)零依賴,任何輸出格式,可以從任何地方加載模板

          (3)支持國際化

          (4)支持xml數據模型,也就是可以將xml數據填充到模板上

          (5)支持java對象暴露在模板,簡單理解模板中可以調用對象的方法

          結合上面的基本內容和特性部分的內容,相信大家對freemarker有了較為完整的認識,包括能不能滿足自己的一些場景,也會有一些基本的判斷,方便技術選型。

          3.2 Helloworld

          看完基本內容,有了大致了解后,是不是迫不及待想去敲代碼試一下,小階段的輸出成果更容易促使學習的動力。看文檔首頁顯然沒有告訴我們怎么用,怎么去開始寫代碼,但提到了更多內容看manual,那我們就點到manual去看一下

          從這里我看看到了Getting Started(開始),大部分的官網都會有Getting Started,點進去看一下,這里要多做一件事,寫代碼肯定要使用freemarler的jar,我們就從download去拿一下,進到download

          可以看到,我們可以直接下freemarker.jar、源碼,或者通過maven引入,這里大家隨意,導入工程,然后回到剛才的地方,看quick start

          三塊內容

          (1)模板 + 數據模型 = 輸出

          (2)一睹數據模型

          (3)一睹模板

          分別點進去看一下,可以了解到

          (1) 模板有表達式和指令

          (2) 數據模型是樹形結果

          但是我們沒有看到代碼,只看到一段模板代碼和最終的結果輸出,這里沒有怎么辦?我們再掃一眼目錄,發現這里還有個Getting Started(一些框架官網沒有直接給demo,我們可以去框架托管代碼(github、gitee)的地方去找一下,基本上都會有demo)

          然后看一下它的分類是 Programmer's Guide(程序員指南),那就應該是這里了,點進去看一下,可以看到,除過最后最后的 Putting all together, 其他部分是使用模板的每一個步驟,分為:創建配置實例 -> 創建數據模型 -> 獲取模板 -> 合并數據模型到模板,這也是使用freemaker的基本步驟,分步驟的就不看了,我們直接看最后的Putting all together(所有合到一起的內容)

          測試類

          public class Test {
           public static void main(String[] args) throws Exception {
           /* ------------------------------------------------------------------------ */
           /* You should do this ONLY ONCE in the whole application life-cycle: */
           /* Create and adjust the configuration singleton */
           Configuration cfg = new Configuration(Configuration.VERSION_2_3_27);
           cfg.setDirectoryForTemplateLoading(new File("/where/you/store/templates"));
           cfg.setDefaultEncoding("UTF-8");
           cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
           cfg.setLogTemplateExceptions(false);
           cfg.setWrapUncheckedExceptions(true);
           /* ------------------------------------------------------------------------ */
           /* You usually do these for MULTIPLE TIMES in the application life-cycle: */
           /* Create a data-model */
           Map root = new HashMap();
           root.put("user", "Big Joe");
           Product latest = new Product();
           latest.setUrl("products/greenmouse.html");
           latest.setName("green mouse");
           root.put("latestProduct", latest);
           /* Get the template (uses cache internally) */
           Template temp = cfg.getTemplate("test.ftlh");
           /* Merge data-model with template */
           Writer out = new OutputStreamWriter(System.out);
           temp.process(root, out);
           // Note: Depending on what `out` is, you may need to call `out.close()`.
           // This is usually the case for file output, but not for servlet output.
           }
          }
          

          數據模型

          /**
           * Product bean; note that it must be a public class!
           */
          public class Product {
           private String url;
           private String name;
           // As per the JavaBeans spec., this defines the "url" bean property
           // It must be public!
           public String getUrl() {
           return url;
           }
           public void setUrl(String url) {
           this.url = url;
           }
           // As per the JavaBean spec., this defines the "name" bean property
           // It must be public!
           public String getName() {
           return name;
           }
           public void setName(String name) {
           this.name = name;
           }
          }
          

          模板 test.ftlh

          <html>
          <head>
           <title>Welcome!</title>
          </head>
          <body>
           <h1>Welcome ${user}!</h1>
           <p>Our latest product:
           <a href="${latestProduct.url}">${latestProduct.name}</a>!
          </body>
          </html>
          

          相信不出意外,復制粘貼到自己的工程里,就可以正常運行了,至此一個helloworld就算OK了,對于代碼的含義,可以直接查javaApi, 可以看分步驟的內容有解釋。

          至此我們對freemarker應該有了更直觀的認識和理解,也基本知道了使用的套路

          3.3 熟悉配置

          為什么要熟悉配置,很多框架的功能支持、 性能調優實際上做的就是配置參數的調整,所以說比較重要,我們來看一下,回到manual首頁,找配置相關的字眼,發現

          就是它了吧,大概點進去看一下

          更多的圖就不貼了,總之我們指導這里就是介紹配置屬性的地方,詳細內容大家自己看一看,這里有一個比較重要的點就是模板加載器,大家自己查閱熟悉一下。

          3.4 更多API

          熟悉完配置,我們需要了解一些API的使用,這里就不展開了,點到javaApi,自行查閱,這里就不展開說明了。

          3.4 表達式、指令

          這里的內容在上面的套路圖中沒標,那個圖我表達的是一個通用的套路,這里算套路圖中[更多基礎API]一種吧。

          表達式、指令是對與模板來說的,也就是輸出數據的一些命令。瀏覽文檔相關內容找模板、表達式、指令相關的關鍵字,就可以鎖定相關內容主要在

          單純的表達式、指令使用都很簡單,這里不多講了。

          3.5 高級用法

          所謂高級用法也就是一些提升性能的配置、自定義擴展、一些指令、表達式之類的,這需要大家熟悉基本的使用、配置、api和文檔的相關介紹。這里暫不展開,相信有了前面的基礎掌握一些技巧和方法,這里來說不是難事。

          3.6 原理、源碼

          這里針對有興趣,想深入學習的人,寫到這是為了保證套路的完整性,這里也不展開,也不是本篇內容的重點。

          四、總結

          本篇重點是帶大家從官網去學習一個技術框架,至少用到一些配置、api知道怎么去查,要學習一個新技術的時候大概需要怎么做,還提了一個基本的學習套路,希望能給需要的人一些幫助。

          沒看上一篇的建議看一下。

          Over。

          博客作者:風象南

          每日一博欄目,每日為你推薦優秀博主的優質技術文章。同時歡迎用戶投稿,文章一旦被官方賬號收錄,我們會在網站首頁等位置進行推薦哦。關注開源中國OSC每日獲取優質推送,點擊“了解更多”閱讀原文章。

          ↓↓↓

          .FreeMarker介紹

          FreeMarker是一種模板引擎,通過定義的模板和數據來生成文本(包括但不局限于html,js,java等文本格式),通俗的講就是先定義一下模板,然后傳入不同的數據,動態的生成不同的文本,但它不是面向用戶的,而是面向程序員的,可以直接自動的生成代碼,減少程序員重復的勞動。FreeMarker最重要的兩部分是模板和數據:模板:FreeMarker Template Language,簡稱FTL,模板文件以ftl為后綴,組成:

          • 文本,包括HTML標簽與靜態文本等靜態內容,會原樣輸出;

          • 插值:這部分的輸出會被計算的數據來替換,使用${}這種語法;

          • 標簽:給FreeMarker的指示,可以簡單與指令等同,不會打印在內容中;

          • 注釋:由<#--和-->表示,不會被freemarker處理 數據結構: 樹狀結構:HashMap,Scalar,Sequence

          2.基本使用

          從http://freemarker.org/ 下載FreeMarker的壓縮包,將其中的freemarker.jar加到項目的構建路徑下從maven倉庫中引入maven依賴的jar包,注意兩個核心類:

          <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.24-atlassian-2</version></dependency>
          • Configuration:讀取模板文件

          • Template:模板

           Configuration cfg = new Configuration(Configuration.VERSION_2_3_21); Map<String,String> root= new HashMap<String,String>(); root.put("name", "Java開發日記"); try { cfg.setDirectoryForTemplateLoading(new File("src/ftl")); Template template = cfg.getTemplate("helloworld.ftl"); Writer writer = new FileWriter(new File("src/finish/helloworld.html")); template.process(root, writer); } catch (Exception e) { e.printStackTrace(); }

          使用Configuration讀取配置文件,使用Map填充數據,給配置文件配置模板文件夾路徑,讀取模板文件,設置輸出文件路徑helloworld.html,執行輸出文件,執行完之后就會在src目錄下的finish文件夾中生成一個helloworld的html文件。模板文件如下:

          <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>${name}</title></head><body>這是我的第一個程序,${name}</body></html>

          3.模板

          3.1 數據類型與變量

          模板中的數據類型:

          • 標量:字符串,數字,布爾值,日期;

          • 容器:哈希表,序列;

          • 子程序:方法和函數,用戶自定義指令; 模板中的變量: 簡單變量,局部變量,循環變量,使用賦值指令:assign 示例:

          <#assign num=10>${num}<#assign name="Java開發日記">${name}<#assign b=true>${b?c}<#assign map={"name":"張三","age":15}>${map.name}<#assign list = [1,3,5]>${list[2]}

          freemarker中使用指令時必須要在指令前面用#(如果是自定義指令用@,后面說),assign指令是用來聲明變量的,注意:如果是布爾值,輸出時一定要帶?c,表示定義的變量是布爾值,不然會報錯。

          3.2運算符

          模板中支持運算符:

          • 算術運算符

          • 比較運算符

          • 邏輯運算符

          • 空值處理運算符

          <#assign b=1==2>${b?c}<#assign b=1 gt 2>${b?c}

          均輸出false,gt表示大于。

          3.3 插值

          插值是用來給插入具體值然后轉換為文本,說白了,插值就是使用${}在那占個坑。使用位置:

          • 文本區(如

            Hello ${name}!

          • 字符串表達式(如<#include "/footer/${company}.html">) 語法:${表達式} 注意:插值表達式的結果必須是字符串,數字或日期類型。

          3.4指令

          • 條件指令

          <#assign score=50><#if score gt 90>優秀<#elseif score gt 70>良好<#elseif score gt 60>及格<#else>渣渣</#if><#assign level="B"><#switch level> <#case "A"> 優秀 <#break > <#case "B"> 良好 <#break > <#case "C"> soso <#break > <#default> 渣渣</#switch>

          需要注意的是switch語句需要有break,不然一直往下執行。

          • 循環指令

          <#assign nums=[1,2,3,4,5]><#list nums as num> ${num_index},${num},${num_has_next?c}</#list><#list nums as num> ${num}<#if num_has_next>,</#if></#list>

          定義一個集合nums,使用list指令遍歷,${別名index}獲取遍歷的索引值,${別名has_next}判斷后面是否還有值,根據這個特性,可以結合if指令拼接不同的值(自動生成mybatis的配置文件時,不同字段最后一個后面不要逗號,用這個特性很好用)。

          • 包含指令

          <#include "condition.ftl">從這里開始是自己的內容

          使用include引入指令可以引入其它的模板頁面。如果頁面路徑寫不好可以用通配符,<#include "*/condition.ftl">

          • 其它 原樣輸出指令noparse:它里面的內容是原樣輸出的; 壓縮指令compress:壓縮所有的空格; 設置指令setting:設置影響FreeMarker的值。

          <#noparse> <#assign num=1> ${num}</#noparse><#assign s=" test \n\n"><#compress> ${s} Compress</#compress><#setting locale="hu">${1.2}
          • 自定義指令 可以將模版中重復的內容進行復用 定義: 使用macro指令定義或者使用Java實現。 參數的聲明:直接跟在指令名后,可以指定默認值 嵌套內容:使用nested指令 調用: 使用<@指令>來調用(調用freemarker自帶的指令用#命令)。

          <#macro mydirect name age=20> 你好,${name},你今年${age}</#macro><@mydirect name="Java開發日記" age=1/>

          自定義一個指令名為mydirect,它有兩個參數name和age,其中age有默認值20,使用自定義指令時用@+自定義指令,同時為參數賦值即可。注意自定義指令是閉口的,不要漏掉最后的斜杠。

          3.5 空處理

          有時候對象是空的,不進行判斷就貿然進行處理會報錯,所以要提前進行判空處理。

          • null對象的處理方式:使用!,只會做最后一個屬性的判斷;

          • 變量不存在的處理方式:使用!或??做判斷。

          ${user.name!}<#if user.name??> 名稱存在 <#else> 名稱不存在</#if>

          我認為是在插值時使用!,在其它指令內使用??。

          3.6名稱空間

          在編寫可重復使用的模板時為了避免命名沖突,使用import指令導入命名空間。命名空間有點類似于java的包,即使類名相同,只要位于不同的包下,也是可以的。

          test.ftl模板:<#macro mydirective name> 你好,${name}</#macro>namespace.ftl模板<#import "test.ftl" as ns><@ns.mydirective name="Java開發日記" />

          在這里我定義兩個模板,在namespace.ftl中使用import指令導入test.ftl模板并為它起一個名為ns的命名空間,調用時我使用命令空間調用,即使namespace.ftl模板中有其它同名的也不至于混淆。另外在test.ftl中使用的是自定義指令定義了名為mydirective的指令,并為其制定一個參數name。

          3.7函數

          FreeMarker中函數有如下幾種:

          • 字符串函數;

          • 數字,日期布爾類型的函數;

          • 序列(list,set)與哈希的函數;

          • 自定義函數 而且FreeMarker中的函數與java中函數調用有個很大的區別,在java中調用函數使用點號(.),而在FreeMarker中使用問號(?),這一點一定要記清。下面分別說上面提到的幾種函數:

          3.7.1字符串函數

          ${"abcdef"?substring(2)} <#--從角標是2的位置開始截取到字符串結束-->${"abcdef"?substring(2,4)} <#--從角標是2的位置開始截取到角標是4的位置,包括2不包括4(包前不包后)-->${"abcd mn"?cap_first} <#--將整個字符串的首字母轉大寫-->${"Abcd"?uncap_first} <#--將整個字符串的首字母轉小寫-->${"fden eb"?capitalize} <#--將字符串的每個單詞首字母轉大寫-->${"abcd"?ends_with("d")?c} <#--是否以字符d結尾,這個結果是布爾值,不能直接輸出,不然會報錯,用?c轉化成字符串-->${"abcd"?starts_with("d")?c} <#--是否以字符d開頭-->${"abac"?index_of("a")} <#--字符a首次出現的位置-->${"abac"?last_index_of("a")} <#--字符a最后一次出現的位置-->${"ab"?left_pad(15,"xy")} <#--將字符串ab填充成15位,如果不夠15位,則左邊循環填充xy-->${"ab"?right_pad(15,"xy")} <#--將字符串ab填充成15位,如果不夠15位,則右邊循環填充xy-->${"abac"?contains("ab")?c} <#--判斷字符串abac是否包含ab-->${"abac"?replace("ab","AB")} <#--將ab替換成AB--><#list "abcabcabc"?split("c") as s> ${s} <#--將字符串以c字符進行分割,結果是個數組,進行遍歷--></#list>${" abc "?trim} <#--去掉字符串空格--><#list " Hello FreeMarker Yes"?word_list as s>${s} <#--將字符串分割成一個個的單詞,存在多個空格時,這個跟上面的split分割有一點區別--></#list>

          3.7.2數字,日期布爾類型的函數

          ${4.2?c} <#--以字符串的形式輸出,上面說的布爾類型不能直接輸出只能轉化成字符串這種-->${4.2?string} <#--與?c一樣-->${0.42?string.percent} <#--以百分號輸出42%-->${4.2?string.currency} <#--以貨幣形式輸出¥4.20-->${4.7?round} <#--四舍五入 -->${4.7?floor} <#--向下取整,floor地板 -->${4.7?ceiling} <#--向上取整,ceiling天花板-->${date?string("yyyy-MM-dd")} <#--傳入日期date,以yyyy-MM-dd形式輸出,2017-11-18-->${date?date} <#--輸出年月日2017-11-18-->${date?time} <#-- 輸出時分秒20:41:49-->${date?datetime} <#--輸出年月日時分秒-->${false?string("yes","no")} <#--條件如果成功輸出yes,否則輸出no-->${4.2355?string("0.##")} <#--保留小數點后兩位-->

          3.7.3 序列(list,set)與哈希的函數

          <#assign seq=[1,2,3,4,5,3,10]>${seq?first} <#-- 輸出序列seq的第一個-->${seq?last} <#-- 輸出序列seq的最后一個-->${seq?seq_contains(6)?c} <#--判斷序列是否包含6-->${seq?seq_index_of(3)} <#--3在序列中首次出現的位置-->${seq?seq_last_index_of(3)} <#--3在序列中最后一次出現的位置--><#list seq?reverse as num> <#--翻轉序列seq,結果還是一個序列,進行遍歷-->${num}</#list>${seq?size} <#--序列seq的長度--><#list seq?sort as num> <#--對序列進行排序-->${num}</#list><#assign seq1=[{"name":"Tom","age":23},{"name":"Jack","age":22},{"name":"Rose","age":21},{"name":"Tim","age":24}]><#list seq1?sort_by("age") as u> <#--以age對哈希seq1進行排序并遍歷-->${u.name}+","+${u.age}</#list><#assign users={"name":"Tim","age":24}><#list users?keys as key> <#--獲取到哈希users所有的鍵-->${key}</#list>

          3.7.4 自定義函數

          <#function add num1 num2> <#return num1+num2></#function><#function addAll nums...> <#local total=0> <#list nums as num> <#local total=total+num> </#list> <#return total></#function><#--使用function指令定義函數add,有兩個參數num1和num2,使用return返回計算之后的結果,使用${add(1,3)}調用函數 -->${add(1,3)}<#--使用function指令定義函數addAll,參數個數不固定,定義局部變量total來存儲臨時計算的結果,遍歷所有的參數并進行運算,使用return返回計算之后的結果,使用${addAll(1,2,3,4,5)}調用函數 -->${addAll(1,2,3,4,5)}

          4.數據模型

          4.1數據類型

          使用基本數據類型來派生數字類型使用java.lang.String來構建字符串。使用java.lang.Number來派生數字類型。使用java.lang.Boolean來構建布爾值。使用java.util.List,java.util.Set或Java數組來構建序列。使用java.util.Map來構建哈希表。

           Map root=new HashMap(); root.put("d1", 100); root.put("d2", 100.99); root.put("d3", 'a'); root.put("d4", true); root.put("d5", new Integer(200)); root.put("d6", new Boolean(false)); List<String> names= Arrays.asList("abc","def","ghi"); root.put("d7", names); Set<String> names1=new HashSet<>(); names1.add("ABC"); names1.add("DEF"); names1.add("GHI"); root.put("d8", names1); root.put("d9", new String[]{"a","b","c"}); Map map=new HashMap(); map.put("name", "Java開發日記"); map.put("age", 18); root.put("map", map);

          就是java中常見的整型,浮點型,布爾型,字符,數組,list,set,map,不再多說

          4.2 加載模板

          使用Configuration的方法加載模版:1,void setDirectoryForTemplateLoading(File dir);2,void setClassForTemplateLoading(Class cl, String prefix);3,void setServletContextForTemplateLoading(Object servletContext, String path);加載多個位置的模版:1,FileTemplateLoader2,ClassTemplateLoader3,TemplateLoader4,MultiTemplateLoader5,setTemplateLoader(MultiTemplateLoader mtl);

           Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); //cfg.setClassForTemplateLoading(TemplateLoad.class, "../../../ftl"); FileTemplateLoader ftl1=new FileTemplateLoader(new File("src/ftl")); FileTemplateLoader ftl2=new FileTemplateLoader(new File("src/ftl2")); ClassTemplateLoader ctl=new ClassTemplateLoader(TemplateLoad.class, "../../../ftl3"); TemplateLoader[] loaders={ctl,ftl2}; MultiTemplateLoader mtl=new MultiTemplateLoader(loaders); cfg.setTemplateLoader(mtl); Template template=cfg.getTemplate("ftl2.ftl"); System.out.println(template);

          javase項目中使用setDirectoryForTemplateLoading來加載模板所在文件夾,javaee項目中使用setClassForTemplateLoading路徑,servlet中可以使用setServletContextForTemplateLoading來加載模板路徑。

          4.3其它配置

          配置就是在對象中存儲常用的設置和定義某些想在所有模板中可用的變量,配置對象是freemarker.template.Configuration的實例,可以通過構造方法來創建它。而且一個應用程序通常只使用一個共享的Configuration實例。

          • 設置共享變量:setSharedVariable()

          • 國家地區:setLocale();

          • 數字格式:setNumberFormat("0.##");

          • 通用設置:setSetting(String name, String value)方法

          • 緩存:設置緩存:setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250)) 或setSetting(Configuration.CACHESTORAGEKEY, "strong:20, soft:250");

          • 清空緩存:clearTemplateCache

          Configuration cfg=new Configuration(Configuration.VERSION_2_3_22); cfg.setDirectoryForTemplateLoading(new File("src/ftl")); //設置共享便令 cfg.setSharedVariable("site", "Java開發日記"); //設置小數點后保留兩位 cfg.setNumberFormat("0.##");、 //設置緩存,一級緩存20個,2級緩存250個 cfg. setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250)); //cfg.setSetting(Configuration.CACHE_STORAGE_KEY, "strong:20, soft:250"); //cfg.clearTemplateCache(); //清楚緩存 Template template = cfg.getTemplate("config.ftl"); Writer writer = new FileWriter(new File("src/finish/config.html"));

          總結:上面這些就是FreeMarker模板引擎的基本操作,首先需要進入jar包,之后設置模板所在的路徑并引入模板,然后組裝數據(實際操作中通過jdbc連接數據庫來操作),所以主要學的就兩方面內容:模板和數據,而模板又與這許許多多的指令相關,所以必須要掌握這些指令。


          主站蜘蛛池模板: 亚洲av区一区二区三| 精品理论片一区二区三区| 精品日韩亚洲AV无码一区二区三区| 无码欧精品亚洲日韩一区| 濑亚美莉在线视频一区| 无码aⅴ精品一区二区三区浪潮| 国产精品一区二区电影| 精品国产一区AV天美传媒| 国产成人AV一区二区三区无码 | 国产伦精品一区二区三区免费下载| 亚洲一区二区三区AV无码| 变态拳头交视频一区二区| 在线不卡一区二区三区日韩| 国产微拍精品一区二区| 国产一区二区好的精华液| 天堂一区人妻无码| 天堂一区人妻无码| 国产日韩精品一区二区在线观看| 色一情一乱一区二区三区啪啪高| 最新欧美精品一区二区三区| 中文字幕在线不卡一区二区| 亚洲一区二区三区久久| 波多野结衣一区二区三区| 亚洲AV无码一区二区三区性色| 无码国产精品一区二区免费式影视| 乱码精品一区二区三区| 久久精品黄AA片一区二区三区| 一区二区三区免费视频播放器| 国产精品一区二区在线观看| 3d动漫精品啪啪一区二区中| 亚洲一区二区三区香蕉| 亚洲av午夜福利精品一区| 久久国产精品视频一区| 91精品国产一区| 国产精品久久久久一区二区三区| 国产一区二区三区露脸| 超清无码一区二区三区| 亚洲图片一区二区| 精品免费国产一区二区三区| www.亚洲一区| 久久亚洲日韩精品一区二区三区|