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