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. // These are required for lazy initializing session
  4. private final FreemarkerServlet servlet;
  5. private final HttpServletRequest request;
  6. 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三宗罪!相关推荐

  1. FreeMarker三宗罪之优缺点

    FreeMarker是Quake Wang推荐我使用的.刚学FreeMarker的时候,发现freemarker真的很棒!简单易用,功能强大.但是用它做了几个项目以后开始不爽了. 一宗罪:freema ...

  2. 3D Slicer画病灶可能产生的问题+核磁共振影像数据处理-14-3d slicer画病灶“三宗罪”|常见bug(错误)汇总

    3D Slicer画病灶可能产生的问题+核磁共振影像数据处理-14-3d slicer画病灶"三宗罪"|常见bug(错误)汇总 讲解视频内容请移步Bilibili: https:/ ...

  3. 3.15曝光“山寨”杀毒软件“杀毒三宗罪”

    "山寨"版杀毒软件,不同于其他山寨手机等产品.对于山寨手机,除了需要用户忍受哇哇叫的刺耳铃声,最起码山寨手机在通讯及其他娱乐商务功能上,都可以满足用户需求,不会在产品功效上严重侵犯 ...

  4. 淡季开战!列出“三宗罪”优信死磕瓜子

    来源:北京青年报 每年春节前夕本来都是二手车交易的淡季,但今年的这个时候行业内却没有消停,一场新的口水战在行业两大巨头优信和瓜子之间爆发. 昨日凌晨,优信突然针对瓜子率先发难,发表声明直指后者&quo ...

  5. 想说爱你不容易——细数迅雷软件“三宗罪”

    经历过网络蚂蚁.网际快车和QQ旋风的洗礼,不知不觉迅雷成了我们计算机中长久驻扎的下载软件,很多人甚至连"目标另存为"都不知道为何物了.当然,也正是因为普及率不断上升,尽管不知能否用 ...

  6. [转载]陌陌上市前夜遭网易声明三宗罪:求丁磊放过唐岩

    原文地址:陌陌上市前夜遭网易声明三宗罪:求丁磊放过唐岩 作者:互联网信徒王冠雄 就在广大中国屌丝熟悉和羡慕的移动交友软件陌陌即将赴美上市前一天,陌陌CEO老东家网易来了一记神补刀----这是直取首级的 ...

  7. 为抵制 7-Zip,列出 “三宗罪” ?网友:“第3个才是重点吧?”

    整理 | 郑丽媛.出品 | CSDN(ID:CSDNnews) 谈及电脑必装软件有哪些时,压缩软件绝对算一个.由于各人需求不同,其选择的压缩软件也不尽相同,如 WinRAR.360 压缩.7-Zip. ...

  8. 【C++】巨坑-VC++的localtime_s的三宗罪

    (点击上方公众号,可快速关注) 前几天在运行一段代码的时候,发现localtime执行失败,由于代码没有判断返回值,后续对空指针操作导致段错误.所以,需要对该段代码增加保护判断,避免程序崩溃.由于后面 ...

  9. 计算机学习三宗罪3——计算机达人成长之路(25)

    6.论道(四)计算机学习三宗罪之偏科 上文说道木鹏飞声明计算机学习的第二宗罪是学习浮躁,只流于表面而不肯深入底层学习,并指出了编程的三重境界.木鸿飞则继续咨询第三宗罪. "第三宗罪就是偏科. ...

最新文章

  1. 用python下载文件的若干种方法汇总
  2. 第二阶段第七次站立会议
  3. C#-获取某变量类型的默认值
  4. python中none是什么类型_如何在Python中”测试”None类型?
  5. 英文简历 计算机知识,计算机应届生英文简历范文
  6. 网页模板素材|解救不会编程的UI设计师网页设计者!
  7. Zookeeper的Leader选举
  8. 七、MySQL中的字符集 - 系统的撸一遍MySQL
  9. 为枪击事件默哀,程序员们确实要重视代码规范
  10. google浏览器截取长图
  11. C站一名 普通技术博主 的终端与【开端】,因为热爱,所以习惯,2021~2022
  12. Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)
  13. Docker的退出后进入
  14. 计算机组成原理_实验三:主存储器原理实验
  15. 安装测试版ios10和xcode8.0beta(8S128d)
  16. win7自带的便笺桌面工具快捷键.
  17. 【中国银联】数据挖掘笔试+三面面经
  18. 按占比划分文件,并将文件名写入txt文件
  19. jbd2导致系统IO使用率高问题
  20. 【Cadence快速入门】一文总结版

热门文章

  1. 主存储器物理地址,逻辑地址,转换
  2. LeetCode:917. 仅仅反转字母
  3. 二叉树经典题之二叉树最近公共祖先(LeetCode)
  4. 数据结构-线性表之单链表
  5. [Python]网络爬虫(九):百度贴吧的网络爬虫(v0.4)源码及解析
  6. centos7下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named ‘_ctypes‘的解决办法
  7. Windows内存保护机制及绕过方法
  8. P1068 分数线划定 洛谷 (C++)(结构体排序)
  9. Sum of AP series——AP系列之和
  10. Recovering deleted Records