FreeMarker三宗罪!

来源:互联网 发布:数据挖掘导论读后感 编辑:程序博客网 时间:2024/06/05 03:43
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代码
  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;  



登时晕倒,这样的东西还往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组件的重用

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 阳台按自来水墙面脱落怎么办 墙被暖气熏黑了怎么办 下水管比地砖低怎么办 马桶下水管短了怎么办 下水管比马桶低怎么办? 寻常疣液氮冷冻后该怎么办 寻常疣冷冻后起水泡胀痛怎么办 冷冻后大水泡痒怎么办 19岁的宫颈糜烂怎么办 发面酸了没有碱怎么办 面发时间长酸了怎么办 丽珠兰打完红肿怎么办 美的冰柜冷藏室结冰怎么办 胃下午和晚上痛怎么办 二胡弓毛粗拉外弦触到里弦怎么办 电视成黑白的了怎么办 城市居民无钱入社保医保怎么办 老婆说离婚又找不到怎么办 爱一个人太累了怎么办 车凹陷漏底漆了怎么办 燕子窝掉下来了怎么办 文科没考上一本怎么办 学校午休小学孩子吵闹怎么办 老鼠死在空调里怎么办 公务员老公四十岁想辞职怎么办 打胎5次又怀孕怎么办 墙纸颜色太淡了怎么办 皮子腺囊肿有点疼痛怎么办 地板颜色选浅了怎么办 地板买的太暗了怎么办 木地板贴好后发现颜色不好看怎么办 鞋上鞋扣老是开怎么办 虚拟机的win10蓝屏重启怎么办 fs免拆模板专利怎么办 新买的床咯吱响怎么办 实木床一动就响怎么办 cad图纸是斜的怎么办 老房子土墙腻子老掉怎么办 生完孩子子宫大怎么办 刚开的店没人怎么办 刚开业的店没人怎么办