生活随笔
收集整理的這篇文章主要介紹了
FreeMarker三宗罪!
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
FreeMarker三宗罪!
3 推薦 FreeMarker是Quake Wang推薦我使用的。剛學(xué)FreeMarker的時候,發(fā)現(xiàn)freemarker真的很棒!簡單易用,功能強(qiáng)大。但是用它做了幾個項(xiàng)目以后開始不爽了。?
一宗罪:freemarker的變量必須有值,沒有被賦值的變量就會拋出異常,那個黃黃的freemarker出錯頁面,真是讓人看了太難過了。? freemarker的FAQ上面冠冕堂皇的說,未賦值的變量強(qiáng)制拋錯可以杜絕很多潛在的錯誤,如缺失潛在的變量命名,或者其他變量錯誤。但是實(shí)際的效果是:帶來的是非常大的編程麻煩,程序里面幾乎所有可能出現(xiàn)空值的變量統(tǒng)統(tǒng)需要加上${xxx?if_exists},有些循環(huán)條件還需要寫if判斷,這樣不但沒有杜絕應(yīng)該杜絕的錯誤,反而極大增加了編程的麻煩。?
二宗罪:freemarker的map限定key必須是string,其他數(shù)據(jù)類型竟然無法操作!這一點(diǎn)就不講了,JavaEye上面已經(jīng)有人抱怨過了。連Webwork的開發(fā)人員Pat Lightboy都在抱怨這一點(diǎn)。
三宗罪:freemarker為了編程方便把不可序列化的東西往session里面放!? freemarker支持在頁面里面直接操作Session,request等,例如${Session[...]},方便確實(shí)很方便,但是一旦需要做群集,就會報(bào)錯。? 今天是b051問起我這個問題,他在做Tomcat群集的時候發(fā)現(xiàn)freemarker報(bào)錯,HttpSessionHashModel不可序列化。他修改該類源代碼,讓他實(shí)現(xiàn)序列化接口,仍然報(bào)錯。我一看,HttpSessionHashModel包含的屬性:? Java代碼 private?HttpSession?session; ??private?final?ObjectWrapper?wrapper; ??????private?final?FreemarkerServlet?servlet; ??private?final?HttpServletRequest?request; ??private?final?HttpServletResponse?response;??
登時暈倒,這樣的東西還往Session里面放?bad smell!? 嚴(yán)重警告應(yīng)用需要往群集上面發(fā)布應(yīng)用的同學(xué)們,千萬別用freemarker!?
不過瑕不掩瑜,freemarker也是有優(yōu)點(diǎn)的:?
1、易學(xué)易用? 我是看了一天文檔就用得挺熟練了,freemarker文檔寫得太好了,例子豐富,照做一遍全都會了。?
2、功能強(qiáng)大? 比Velocity強(qiáng)大多了,還支持JSP Tag。不過最有意義的是macro功能,可以自定義常用的macro,實(shí)現(xiàn)頁面常規(guī)操作的可復(fù)用性。?
3、報(bào)錯信息友好? 很多應(yīng)用服務(wù)器的JSP報(bào)錯信息是無法定位到源代碼行的。不過freemarker報(bào)錯定位很準(zhǔn)確,絲毫不差,而且信息豐富,一看就知道怎么回事(雖然那個黃黃的頁面看起來讓人難受)?
總之,用與不用,還是看大家衡量了。我是不想再用freemarker了,準(zhǔn)備回歸JSP Tag了。 ----------------------回復(fù) 個人認(rèn)為FreeMarker是當(dāng)前最好的用來渲染view的模板叻,希望robbin不要淺嘗輒止啊,這么好的東西,輕易丟棄就太可惜叻。就好像小時候我們學(xué)騎自行車一樣,你說好好的自行車四個輪子多好,為啥只有兩個輪子,那么容易就摔倒呢。可是學(xué)會之后,這輩子都會騎,都覺得兩個輪子的自行車的確比四個輪子的好。?
一宗罪,null值處理:?
這個也的確讓我煩叻一陣子,不過后來不僅習(xí)慣叻,而且還真的喜歡上這一點(diǎn)叻。我們的頁面上有null值,大概有這樣兩種情況:?
1、這個值本來就是可有可無的。比如表單域的value=""值。這種情況,可以用${foo?default("")}來寫,并不十分復(fù)雜,而且可以讓你狠方便地定義默認(rèn)值,比如N/A什么的。?
2、Action層處理有錯,導(dǎo)致null值。這種情況下,FreeMarker就給程序調(diào)試提供的有力的保障,也是FreeMarker對null值如此敏感的初衷。從我學(xué)FreeMarker開始,我就強(qiáng)烈地感受到FreeMarker在試圖把自己做成模板語言中的強(qiáng)類型語言。?
總之,這個null其實(shí)不是什么大問題啦,并沒有什么不方便。?
二宗罪:Map的key必須是String?
這個我還真的沒遇到過。我寫叻段小程序簡單地試驗(yàn)叻下,用list遍歷map.keySet(),然后用map.get(key)這樣的方法查詢,是可以的。直接用map[]這樣的操作的確是不行。我實(shí)際使用中在前臺用到Map的情況不多,以前用velocity的時候也沒覺得map有多好用,大部分情況我是用n個相同長度的list或數(shù)組解決的,感覺比map方便。?
三宗罪:freemarker為了編程方便把不可序列化的東西往session里面放!?
這個就不說啦,跟freemarker無關(guān)。拋開這個不談,客觀地說,WebWork對FreeMarker Result的封裝還是非常不錯的。?
FreeMarker自身的優(yōu)點(diǎn)的確非常突出,易學(xué),我只用叻3個小時看叻遍文檔就基本掌握叻,就可以扔掉velocity叻,哈哈。而且FreeMarker自己的builtin也的確有趣,雖然大部分我都不用,還是要在action層自己封裝個方法調(diào)用,不過常用的比如?html,?date這樣的還是狠方便的。?
我想說說FreeMarker跟JSP Tag的比較,前面看到Robbin說要回歸JSP Tag,我真是痛心疾首啊!要拿FreeMarker去攻擊JSP Tag,我都不需要列舉JSP Tag/JSTL的缺點(diǎn),只要把FreeMarker的Macro拿出來往那一亮就OK叻。用老羅的話說,“那簡直是太方便叻!太方便叻!!”?
我剛才就在重構(gòu)一個項(xiàng)目的common.ftl,將公共的部分提取出來,細(xì)力度的重構(gòu)。在Code級別我們可以重構(gòu),可以代碼only once。現(xiàn)在在FreeMarker的幫助下,頁面級也可以這樣叻!JSP Tag、Velocity不是不能這樣,而是都太麻煩,而且功能不強(qiáng),用叻不僅不省工作量,反而還更煩。而只有FreeMarker,才能讓頁面達(dá)到這樣的重構(gòu)高度。?
我們這邊的策劃總是有新點(diǎn)子,頁面也總是改,我寫代碼是基于敏捷原則,現(xiàn)在頁面也是敏捷的,可以說是真正做到的擁抱變化,感覺非常爽。 -----------回復(fù) 回過頭了說說FreeMarker的優(yōu)點(diǎn):?
1、簡單易學(xué)易用? 2、報(bào)錯信息準(zhǔn)確? 3、macro功能強(qiáng)大,實(shí)現(xiàn)了頁面組件的可重用性? 4、不耦合Servlet,可以被打包到j(luò)ar里面,實(shí)現(xiàn)web組件的重用?
特別是第四條,如果做軟件產(chǎn)品,或者擴(kuò)展已有軟件項(xiàng)目的功能,是非常有用的地方。 |
總結(jié)
以上是生活随笔為你收集整理的FreeMarker三宗罪!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。