.1 FreeMarker簡介
l FreeMarker是一個模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫
l FreeMarker被設計用來生成HTML Web頁面,特別是基于MVC模式的應用程序
l 雖然FreeMarker具有一些編程的能力,但通常由Java程序準備要顯示的數據,由FreeMarker生成頁面,通過模板顯示準備的數據(如下圖)
l FreeMarker不是一個Web應用框架,而適合作為Web應用框架一個組件
l FreeMarker與容器無關,因為它并不知道HTTP或Servlet;FreeMarker同樣可以應用于非Web應用程序環境
l FreeMarker更適合作為Model2框架(如Struts)的視圖組件,你也可以在模板中使用JSP標記庫
l FreeMarker是免費的
1.2 使用引入
1.需要導入freemark的jar包, freemarker-2.3.20.jar
2.這里使用的是SSM框架,在SpringMVC的配置文件中配置freemark的模版路徑和模版解析器,如下:
<!-- freemarker模版路徑配置-->
<bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/xxx/xxx" />
<property name="defaultEncoding" value="UTF-8" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">10</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">#.##</prop>
</props>
</property>
</bean>
3. Spring本身支持了對Freemarker的集成。只需要配置一個針對Freemarker的視圖解析器即可。這里我們使用的是Spring與Freemarker整合需要用到的FreeMarkerViewResolver解析器
<!-- 配置FreeMark視圖解析器 -->
<bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<property name="suffix" value=".ftl"/>
<property name="cache" value="true"/>
<property name="exposeSessionAttributes" value="true"/>
<property name="exposeRequestAttributes" value="true"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="allowSessionOverride" value="true"/>
<property name="order" value="1"/>
</bean>
2.1 if else 語句
1、if語句:<#if boolean表達式> </#if>
(1)判斷后端返回的Java對象是否為空(null):<#if Java對象或者屬性??> 執行代碼 </#if>
說明:Java對象可以是集合、普通Java類或者屬性。
(2)判斷集合size:<#if 集合對象?size==0> 執行代碼 </#if>
(3)判斷值相等:<#if 屬性變量==2> 執行代碼 </#if>
2、if else 語句:<#if orgList?size==0> 執行代碼 <#else> 執行代碼 </#if>
2.2 list循環語句
1、遍歷集合:
<#list 后端返回的集合對象 as 自定義對象> 執行代碼 </#list>
示例:<#list orgList as org> 執行代碼</#list>
2、范圍內遍歷:
示例:<#list startPage..endPage as index> </#list>
類似java代碼:
int startPage=5;
int endPage=10;
for(int index=startPage;index<endPage ;index++){
System.out.println(index)
}
2.2 輸出展示
1、輸出后臺返回的普通字符串或者數值:
<#if 變量名??>${變量名}</#if>
示例:<#if total??>${total}</#if>
2、輸出后臺返回的對象屬性:
<#if 對象名.對象屬性??>${對象名.對象屬性}</#if>
示例::<#if org.orgName??>${org.orgName}</#if>
3、時間輸出:
示例:<#if org.createdDate??>${org.createdDate?string("yyyy-MM-dd HH:mm:ss")}</#if>
以下是使用freemark語法來展示數據,如下圖:
視圖解析器的工作流程大致是這樣的:
1.Controller的某個方法執行完成以后,返回一個視圖(比如:listUser)
2.視圖解析器要做的工作就是找到某個對象來完成視圖的渲染,或者跳轉到其他的邏輯視圖。這里的渲染對象通常就是我們的jsp文件或者我們下面用的Freemarker(例如listUser.jsp或者listUser.ftl)。
3渲染完成以后,將解析結果發送到客戶端瀏覽器
、前言
上一篇 <從現在開始,試著學會用官方文檔去學習一個技術框架> 提倡大家多去從官方文檔學習技術,沒有講到具體的實踐,本篇就拿一個案例具體的說一說,就是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知道怎么去查,要學習一個新技術的時候大概需要怎么做,還提了一個基本的學習套路,希望能給需要的人一些幫助。
沒看上一篇的建議看一下。
作者:風象南。? 著作權歸作者所有,如有侵權,請聯系刪除.
之前我介紹了在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文件
*請認真填寫需求信息,我們會在24小時內與您取得聯系。