日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FreeMarker三宗罪!

發(fā)布時間:2025/3/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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; ??
  • ??
  • //?These?are?required?for?lazy?initializing?session???
  • 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)容還不錯,歡迎將生活随笔推薦給好友。