1. 程式人生 > >FreeMarker的優缺點理解(轉)

FreeMarker的優缺點理解(轉)

首先給大家簡單介紹一下FreeMarker。FreeMarker是一個用Java語言編寫的模板引擎,它基於模板來生成文字輸出。FreeMarker與Web容器無關,即在Web執行時,它並不知道Servlet或HTTP。它不僅可以用作表現層的實現技術,而且還可以用於生成XML,JSP或Java 文等。 簡單瞭解了FreeMarker之後,現在就來講講FreeMarker的優點和缺點。 (一) FreeMarker的優點 1. FreeMarker的優點一,可以徹底的分離表現層和業務邏輯。 曾經在使用JSP 開發過程中發現在頁面中大量的存在業務邏輯的程式碼,使得頁面內容凌亂,在後期大量的修改維護過程中就變得非常困難。 FreeMarker根本不支援Java指令碼程式碼。 FreeMarker的原理就是:模板+資料模型=輸出,模板只負責資料在頁面中的表現,不涉及任何的邏輯程式碼,而所有的邏輯都是由資料模型來處理的。使用者最終看到的輸出是模板和資料模型合併後建立的。        2. FreeMarker的優點二,可以提高開發效率。 根據以往的開發經驗,使用的都是JSP 頁面來展示資料的,即所謂的表現層。大家都知道,JSP在第一次執行的時候需要轉換成Servlet類,開發階段進行功能調適時,需要頻繁的修改JSP,每次修改都要編譯和轉換,那麼試想一天中我們浪費在程式編譯的時間有多少。相對於JSP來說,FreeMarker模板技術不存在編譯和轉換的問題,所以就不會存在上述問題。而且開發過程中,大家在不必在等待介面設計開發人員完成頁面原形後,大家再來開發程式。

3. FreeMarker的優點三,使得開發過程中的人員分工更加明確。 以往用JSP展現資料時,作為程式設計師的我們,並不熟悉介面設計技術,反之介面開發人員,也並不熟悉程式語言。對兩者而言,交替性的工作本身就有難度。有時候稍有不慎,可能會將某個頁面元素刪除或去掉了某個程式符號,使得頁面走樣或程式錯誤,這樣就需要雙方相互溝通協作,解決出現的問題。有時候因為專案中的時間,任務量等因素的存在,可能這個工作就由一個人來完成,這樣就可能加大某一方開發人員的工作量。 使用FreeMarker後,作為介面開發人員,只專心建立HTML檔案、影象以及Web頁面的其他視覺化方面,不用理會資料;而程式開發人員則專注於系統實現,負責為頁面準備要顯示的資料。

(二)FreeMarker的缺點 1.FreeMarker的缺點一,應用FreeMarker模板技術,在修改模板後,可能會看到已經過期的資料。如:生成靜態的HTML頁面後,如果一旦模板改變,而沒有及時更新模板生成的HTML頁面的話,使用者看到的就是過期的資料。 2.FreeMarker的缺點二,FreeMarker模板技術在應用過程中,FreeMarker中的變數必須要賦值,如果不賦值,那麼就會丟擲異常。想避免錯誤就要應用if/elseif/else 指令進行判段,如果對每一個變數都判斷的話,那麼則反而增加了程式設計的麻煩。 3.FreeMarker的缺點三,FreeMarker的map限定key必須是string,其他資料型別無法操作。 4.FreeMarker的缺點四,FreeMarker不支援叢集應用。為了編成的方便性,把序列化的東西都放到了Session中,如Session,request等,在開發的過程中確實方便,但如果將應用放到叢集中,就會出現錯誤。

你還在使用 Java 伺服器頁面(俗稱JSP)嗎?我曾經也是,但是幾年前我拋棄了它們,並且再也沒有用過JSP了。JSP 是個很好的概念,但是它卻剝奪了 web 開發的樂趣。 對我而言,這些都是小事,比如無法在頁面模板上使用單獨的檔案header.jsp 和 footer.jsp,不能呼叫表示式語言的方法,在執行時無法合併,重新排列頁面的各個部分。所以我轉而使用 FreeMarker 模板。FreeMarker 已經存在一段時間了,如果你最近沒有關注過 FreeMarker 的話,那這有些建議給你,讓你考慮下個 web 應用使用 FreeMarker。

1、類載入沒有 PermGen 問題

如果你已經開發Java Web應用程式一段時間,那麼對於 JVM 的 PermGen 問題可能並不陌生。由於 FreeMarker 模板不編譯成類,它們不佔用 PermGen 空間,並不需要一個新的類載入器載入。

2、模板載入器

直接從資料來源載入頁面和模板豈不是很好?也許從 CMS 或資料庫。也許你只想把它們放在一個地方,可以不重新部署整個應用程式就能更新它們。那麼在 JSP 中你是很難做到這一點的,但 FreeMarker 提供的模板載入器就是為了 這個目的。你可以使用內建類或者建立你自己的實現。

ClassTemplateLoader:從classpath中載入模板。

FileTemplateLoader:在檔案系統中從指定資料夾載入模板。

StringTemplateLoader:從一個字串 Map 中載入模板。

URLTemplateLoader:從 URL 中載入模板。 你必須要實現 getURL 方法,但應該很容易做到。

WebappTemplateLoader:從 servlet 上下文中載入模板。

FreeMarker 也可以將多個載入器鏈在一起形成一個系列模板裝載器。我通常使用 WebappTemplateLoader 指向 WEB—INF 下一個內容資料夾。

Configuration configuration = new Configuration();  configuration.setTemplateLoader(  new WebappTemplateLoader(servletContext, "WEB-INF/content"));  3、可以在執行時嵌入模板

FreeMarker 能讓你建立真正的模板,而不只是片段 ,還記得 JSP 中的 header 和 footer 嗎?FreeMarker 允許你使用一個模板(在本例中為 head.ftl)

<head>  <title>${title}</title>  </head>  並將其新增到另一個模板(site.ftl body區域)。

<html>  ${body}  </html>

可以以程式設計的方式選擇哪個模板進入 body 區。還可以新增多個模板一起放入同一區域。甚至可以將字串值或計算的值放入 body 區域。在 JSP 中試試做到這些。

4、沒有匯入

JSP 要求你匯入每個你需要使用的類,就像一個常規的 Java 類一樣。FreeMarker 模板,嗯,僅僅是模板。可以被包括在另一個模板中,但目前還不需要匯入類。

5、支援 JSP 標籤

使用 Jsp 的一個理由是有可用性很好的標籤庫。好訊息是 FreeMarker 支援 JSP 標籤。壞訊息是它們使用 FreeMarker 的語法,不是 JSP 語法。

6、表示式語言中的方法呼叫

除非你的目標是 Servlet 3.0/El 2.2 標準的容器,那麼表示式語言中方法呼叫是不可用的。不是所有人都同意 EL 表示式中方法呼叫是一件好事,但是當你需要它們的時候,使用 JSP 真的太痛苦了。 但是 FreeMarker 同等對待其中每個引用。

${customer.address.country} ${customer.getAddress().country}  7. 內建空字串處理

FreeMarker 和 Jsp 都可以在表示式語言中處理空值,但 FreeMarker 在可用性上更先進一些。

Invoice Date: ${(customer.invoice.date)!}  感嘆號告訴 FreeMarker 對錶達式自動檢查 null 值和空字串。如果 customer、invoice 或者 date 中有一個為空值或空字串,你只會得到標籤:

Invoice Date:  另一個選擇是感嘆號後包括你的預設值。

Invoice Date: ${(customer.invoice.date)!'No Invoice Available'}  如果所有值丟失,你會得到:

Invoice Date: No Invoice Available  請參見處理缺少的值瞭解更多細節。

8、共享變數

FreeMarker 的共享變數是我最喜歡的“隱藏”功能之一。此功能可以讓你設定自動新增到所有模板的值。 例如,可以設定應用程式的名稱作為共享變數。

Configuration configuration = new Configuration();  configuration.setSharedVariable("app", "StackHunter");  然後像任何其他變數一樣訪問它。

App: ${app}  在過去使用共享變數一般引用資源包 然後使用像 ${i18n.resourceBundle.key} 這樣的表示式來獲取值。

${i18n.countries.CA}  ${i18n.countries['CA']}  ${i18n.countries[countryCode]}  上面這些行都引用 countries_en.properties 資源包內的 key “CA”對應的值。你需要執行自己的 TemplateHashModel,然後將其新增為一個共享變數來實現這一目標。

9、支援 JSON

FreeMarker 內建 JSON 支援。 比方說你有以下的 JSON 儲存到變數命名 user 的字串中。

{ 'firstName': 'John', 'lastName': 'Smith', 'age': 25, 'address': { 'streetAddress': '21 2nd Street', 'city': 'New York', 'state': 'NY', 'postalCode': 10021 }}  使用 ?eval 將從字串轉換為一個 JSON 物件,然後像其他資料一樣在表示式中使用。

<#assign user = user?eval>  User: ${user.firstName}, ${user.address.city}  10、不只是為了 Web 開發

最後,與 JSP 不同的是FreeMarker 模板可以在 servlet 容器之外使用。可以使用它們來生成電子郵件、 配置檔案、 XML 對映等。你甚至可以使用它們來生成 web 頁 並將它們儲存在伺服器端的快取中。 請在下一個 web 專案嘗試使用 FreeMarker把 web 開發的樂趣給找回來。 ---------------------  作者:紅木葉  來源:CSDN  轉自:https://blog.csdn.net/qq897958555/article/details/53560655?utm_source=copy