亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

使用FreeMarker替換JSP的10個理由

2019-11-14 15:21:09
字體:
來源:轉載
供稿:網友

你還在使用 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 下一個內容文件夾。

1
2
3
Configuration configuration = new Configuration();
configuration.setTemplateLoader(
new WebappTemplateLoader(servletContext, "WEB-INF/content"));

3、可以在運行時嵌入模板

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

1
2
3
<head>
<title>${title}</title>
</head>

并將其添加到另一個模板(site.ftl body區域)。

1
2
3
<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 同等對待其中每個引用。

1
${customer.address.country}
1
${customer.getAddress().country}

7. 內置空字符串處理

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

1
Invoice Date: ${(customer.invoice.date)!}

感嘆號告訴 FreeMarker 對表達式自動檢查 null 值和空字符串。如果 customer、invoice 或者 date 中有一個為空值或空字符串,你只會得到標簽:

1
Invoice Date:

另一個選擇是感嘆號后包括你的默認值。

1
Invoice Date: ${(customer.invoice.date)!'No Invoice Available'}

如果所有值丟失,你會得到:

1
Invoice Date: No Invoice Available

請參見處理缺少的值了解更多細節。

8、共享變量

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

1
2
Configuration configuration = new Configuration();
configuration.setSharedVariable("app", "StackHunter");

然后像任何其他變量一樣訪問它。

1
App: ${app}

在過去使用共享變量一般引用資源包 然后使用像 ${i18n.resourceBundle.key} 這樣的表達式來獲取值。

1
2
3
${i18n.countries.CA}
${i18n.countries['CA']}
${i18n.countries[countryCode]}

上面這些行都引用 countries_en.PRoperties 資源包內的 key “CA”對應的值。你需要執行自己的 TemplateHashModel,然后將其添加為一個共享變量來實現這一目標。

9、支持 JSON

FreeMarker 內置 JSON 支持。 比方說你有以下的 JSON 存儲到變量命名 user 的字符串中。

1
{ 'firstName': 'John', 'lastName': 'Smith', 'age': 25, 'address': { 'streetAddress': '21 2nd Street', 'city': 'New York', 'state': 'NY', 'postalCode': 10021 }}

使用 ?eval 將從字符串轉換為一個 JSON 對象,然后像其他數據一樣在表達式中使用。

1
2
<#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

全能程序員交流QQ群290551701,群內程序員都是來自,百度、阿里、京東、小米、去哪兒、餓了嗎、藍港等高級程序員 ,擁有豐富的經驗。加入我們,直線溝通技術大牛,最佳的學習環境,了解業內的一手的資訊。如果你想結實大牛,那 就加入進來,讓大牛帶你超神!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩在线免费| 亚洲免费视频在线观看| 久久69精品久久久久久国产越南| 亚洲精品白浆高清久久久久久| 国内精品伊人久久| 欧美激情乱人伦| 欧美午夜丰满在线18影院| 亚洲最大av网站| 成人激情视频免费在线| 欧美精品aaa| 亚洲r级在线观看| 国自在线精品视频| 日韩免费电影在线观看| 国模精品一区二区三区色天香| 精品国产欧美一区二区三区成人| 久久免费福利视频| 国产精品18久久久久久首页狼| 高清欧美一区二区三区| 国产精品偷伦免费视频观看的| 亚洲毛片在线免费观看| 亚洲国产精品系列| 成人妇女免费播放久久久| 国产日韩视频在线观看| 中文字幕日韩av| 黑人巨大精品欧美一区二区三区| 中文字幕亚洲自拍| 日本老师69xxx| 日本中文字幕成人| 日韩av不卡在线| 久久久久久久一区二区三区| 亚洲成av人乱码色午夜| 国产一区二区三区视频免费| 高清视频欧美一级| 欧美激情图片区| 国产精品电影网| 国语对白做受69| 亚洲一区二区久久| 最新91在线视频| 欧美日韩人人澡狠狠躁视频| 久久综合免费视频影院| 热99精品只有里视频精品| 日韩美女写真福利在线观看| 日韩美女视频免费在线观看| 欧美国产日韩中文字幕在线| 国产成人精品av在线| 国产精品亚洲аv天堂网| 亚洲精品欧美日韩专区| 欧美专区在线观看| 成人免费在线网址| 日韩精品欧美国产精品忘忧草| 日韩综合视频在线观看| 日韩成人av在线| 麻豆一区二区在线观看| 中文字幕日韩av电影| 精品国产拍在线观看| 亚洲精品综合久久中文字幕| 136fldh精品导航福利| 国产欧美日韩最新| 高清亚洲成在人网站天堂| 久久精品国产69国产精品亚洲| 亚洲精品网站在线播放gif| 亚洲a成v人在线观看| 成人国产精品久久久久久亚洲| 久久久久国产一区二区三区| 色综合久久悠悠| 九九热在线精品视频| 亚洲欧洲高清在线| 欧美日韩久久久久| 亚洲无限乱码一二三四麻| 国内精品久久影院| 91av网站在线播放| 久久亚洲精品一区二区| 国产亚洲精品美女久久久久| 午夜精品蜜臀一区二区三区免费| 色偷偷噜噜噜亚洲男人的天堂| 国产精品久久久久久中文字| 久久精品免费播放| 一区二区三区在线播放欧美| 欧美日韩国产第一页| 色综合影院在线| 亚洲一区二区三区在线免费观看| 久久成人综合视频| 日韩欧美主播在线| 欧美日韩午夜视频在线观看| 欧美精品久久久久a| 国产中文欧美精品| 亚洲激情小视频| 自拍偷拍亚洲欧美| 国产亚洲日本欧美韩国| 91av在线不卡| 精品久久久久久中文字幕大豆网| 久久久久国产精品www| 麻豆乱码国产一区二区三区| 欧美激情一级欧美精品| 国产精品久久久久久av福利| 中文字幕亚洲综合久久筱田步美| 夜夜嗨av色一区二区不卡| 91精品国产色综合久久不卡98口| 欧美激情成人在线视频| 国产免费一区二区三区在线能观看| 55夜色66夜色国产精品视频| 国产精品无av码在线观看| 国产精品久久久久久久9999| 国产mv免费观看入口亚洲| 国产精品视频网| 97热在线精品视频在线观看| 欧美电影在线观看完整版| 国产精品久久77777| 国产精品美女久久久免费| 最新中文字幕亚洲| 亚洲毛片在线看| 国产成人一区二区三区小说| 国产一区红桃视频| 日韩人体视频一二区| 欧美肥婆姓交大片| 色偷偷偷综合中文字幕;dd| 午夜精品一区二区三区在线视| xxxx欧美18另类的高清| 欧美性开放视频| 亚洲天堂av在线免费| 久久福利网址导航| 亚洲xxxx3d| 国产亚洲人成网站在线观看| 深夜福利91大全| 国产精品国产三级国产aⅴ浪潮| 欧美人在线视频| 亚洲第一福利网| 久久影院资源站| 国产精品中文久久久久久久| 日韩大片在线观看视频| 亚洲人成网在线播放| 中文字幕亚洲激情| 欧美大全免费观看电视剧大泉洋| 欧美美女15p| 永久免费看mv网站入口亚洲| 亚洲最大福利网| 国产免费久久av| 91九色国产在线| 77777少妇光屁股久久一区| 欧美精品在线视频观看| 亚洲人精选亚洲人成在线| 亚洲女人天堂成人av在线| 国产激情999| 日韩在线视频网| 日韩av不卡在线| 亚洲高清久久久久久| 免费不卡欧美自拍视频| 国产成人精品国内自产拍免费看| 国产91成人在在线播放| 亚洲欧美日韩国产精品| 亚洲人成在线播放| 日韩在线观看免费高清完整版| 国产精品久久91| 6080yy精品一区二区三区| 日韩在线免费av| 国产精品精品视频| 精品亚洲一区二区三区在线观看| 国产成人精彩在线视频九色| 欧美老肥婆性猛交视频| 岛国视频午夜一区免费在线观看| 中文字幕精品av| 色天天综合狠狠色| 亚洲成人av中文字幕| 亚洲一区二区中文|