使用 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 上下文中載入模板。
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 開發的樂趣給找回來。
相關文章
- java-使用 freemarker 替換 jstl EL 開發 springmvc web專案JavaJSSpringMVCWeb
- 使用Django而不是FastAPI的10個理由DjangoASTAPI
- 替換空格 將一個字串中的空格替換成“ ”字串
- 切換到Git的8個理由Git
- js replace替換字串,同時替換多個方法JS字串
- 使用WKWebView替換UIWebViewWebViewUI
- 退出IT行業的10個理由行業
- 我痛恨 Git 的 10 個理由Git
- 愛上 SQLAlchemy 的 10 個理由SQL
- 重新使用Java的七個理由Java
- 使用 AppFuse 的七個理由APP
- 10個學習Python的理由Python
- IT生活:10個繼續幹IT的理由
- SQL中的替換函式replace()使用SQL函式
- 不使用Spring的5個理由Spring
- 9 個使用C++11的理由C++
- javascript替換字串中的某個漢字JavaScript字串
- 使用FreeMarker/Jsp(WebWork2) 生成靜態/動態RSS檔案JSWeb
- 10個讓你繼續幹IT的理由
- HTML 替換元素與非替換元素HTML
- linux 下一個替換命令Linux
- BW Query替換路徑變數的使用變數
- 使用Angular的8個理由 - SweetcodeAngular
- 使用 sed 命令查詢和替換檔案中的字串的 16 個示例字串
- vim的批量替換
- Redis 中使用 scan 替換 keysRedis
- 替換tabBartabBar
- 替換(substitution)
- php中幾個字串替換函式PHP字串函式
- 不使用 JS 匿名函式的三個理由JS函式
- 10 個理由讓你繼續幹 IT
- 使用變數替換批量部署GoldenGate變數Go
- js中字串的替換JS字串
- Vi中的替換字串字串
- VI中的批量替換
- springMVC使用freemarkerSpringMVC
- Excel 多個變數替換 實際值Excel變數
- 使用正規表示式替換字串的方法(replace方法)字串