關(guān)于freemarkFreeMarker是Quake Wang推薦我使用的。剛學(xué)FreeMarker的時(shí)候,發(fā)現(xiàn)freemarker真的很棒!簡(jiǎn)單易用,功能強(qiáng)大。但是用它做了幾個(gè)項(xiàng)目以后開始不爽了。 

一宗罪:freemarker的變量必須有值,沒(méi)有被賦值的變量就會(huì)拋出異常,那個(gè)黃黃的freemarker出錯(cuò)頁(yè)面,真是讓人看了太難過(guò)了。 
freemarker的 FAQ上面冠冕堂皇的說(shuō),未賦值的變量強(qiáng)制拋錯(cuò)可以杜絕很多潛在的錯(cuò)誤,如缺失潛在的變量命名,或者其他變量錯(cuò)誤。但是實(shí)際的效果是:帶來(lái)的是非常大的編 程麻煩,程序里面幾乎所有可能出現(xiàn)空值的變量統(tǒng)統(tǒng)需要加上${xxx?if_exists},有些循環(huán)條件還需要寫if判斷,這樣不但沒(méi)有杜絕應(yīng)該杜絕的 錯(cuò)誤,反而極大增加了編程的麻煩。 

二宗罪:freemarker的map限定key必須是string,其他數(shù)據(jù)類型竟然無(wú)法操作!這一點(diǎn)就不講了,JavaEye上面已經(jīng)有人抱怨過(guò)了。連Webwork的開發(fā)人員Pat Lightboy都在抱怨這一點(diǎn)。 


三宗罪:freemarker為了編程方便把不可序列化的東西往session里面放! 
freemarker支持在頁(yè)面里面直接操作Session,request等,例如${Session[...]},方便確實(shí)很方便,但是一旦需要做群集,就會(huì)報(bào)錯(cuò)。 
今天是b051問(wèn)起我這個(gè)問(wèn)題,他在做Tomcat群集的時(shí)候發(fā)現(xiàn)freemarker報(bào)錯(cuò),HttpSessionHashModel不可序列化。他修改該類源代碼,讓他實(shí)現(xiàn)序列化接口,仍然報(bào)錯(cuò)。我一看,HttpSessionHashModel包含的屬性: 
Java代碼 復(fù)制代碼
  1. private HttpSession session;  
  2. private final ObjectWrapper wrapper;  
  3.   
  4. // These are required for lazy initializing session  
  5. private final FreemarkerServlet servlet;  
  6. private final HttpServletRequest request;  
  7. private final HttpServletResponse response;  


登時(shí)暈倒,這樣的東西還往Session里面放?bad smell! 
嚴(yán)重警告應(yīng)用需要往群集上面發(fā)布應(yīng)用的同學(xué)們,千萬(wàn)別用freemarker! 

不過(guò)瑕不掩瑜,freemarker也是有優(yōu)點(diǎn)的: 

1、易學(xué)易用 
我是看了一天文檔就用得挺熟練了,freemarker文檔寫得太好了,例子豐富,照做一遍全都會(huì)了。 

2、功能強(qiáng)大 
比Velocity強(qiáng)大多了,還支持JSP Tag。不過(guò)最有意義的是macro功能,可以自定義常用的macro,實(shí)現(xiàn)頁(yè)面常規(guī)操作的可復(fù)用性。 

3、報(bào)錯(cuò)信息友好 
很多應(yīng)用服務(wù)器的JSP報(bào)錯(cuò)信息是無(wú)法定位到源代碼行的。不過(guò)freemarker報(bào)錯(cuò)定位很準(zhǔn)確,絲毫不差,而且信息豐富,一看就知道怎么回事(雖然那個(gè)黃黃的頁(yè)面看起來(lái)讓人難受) 


ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程