使用FreeMarker替換JSP的10個理由

jopen 9年前發布 | 11K 次閱讀 FreeMarker

 使用FreeMarker替換JSP的10個理由

你還在使用 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 上下文中加載模板。
  • </ul>

    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 開發的樂趣給找回來。

    原文鏈接: stackhunter 翻譯: ImportNew.com - 光光頭去打醬油
    譯文鏈接: http://www.importnew.com/16944.html
     

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!