`

freemarker三宗罪

阅读更多

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[...]},方便确实很方便,但是一旦需要做群集,就会报错。
今天是???问起我这个问题,他在做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了。

分享到:
评论
1 楼 cpszy 2011-08-17  
lz辛苦了,学习

相关推荐

    freemarker 自定义freeMarker标签

    3. 使用自定义标签:在模板文件中,你可以像使用内置标签一样使用你的自定义标签。例如,如果你注册了一个名为`myCustomTag`的自定义指令,你可以在模板中这样使用:`...

    freemarker Demo 适用于freemarker初学

    3. **数据模型和视图** 在Java应用中,Freemarker通过ModelAndView或者Map对象将数据传递到视图层。开发者可以在Java后端准备数据模型,然后传递给Freemarker模板,模板根据模型中的数据生成HTML输出。 4. **与...

    freemarker.jar

    freemarker-2-3-18.jar, freemarker-2.1.5.jar, freemarker-2.2.5.jar, freemarker-2.2.8.jar, freemarker-2.3.1.jar, freemarker-2.3.10.jar, freemarker-2.3.11.jar, freemarker-2.3.12.jar, freemarker-2.3.13....

    freemarker-2.3.23jar

    3. **控制结构**:Freemarker提供了丰富的控制结构,如条件语句(`<#if>`、`<#else>`、`<#elseif>`)、循环(`<#foreach>`)、以及异常处理(`<#try>`、`<#catch>`)等,使得模板具有一定的逻辑处理能力。...

    freemarker

    #### 3. 数据模型整合 有了`Template`对象之后,下一步就是将数据模型与模板进行整合。这通常是通过调用`Template`对象的`process`方法来完成的。在`process`方法中,传入两个参数:一个是数据模型(通常是一个Map...

    eclipse的freemarker插件

    3. **代码提示和完成**:在编写模板时,插件能提供智能代码补全功能,根据上下文提示可能的指令和变量,提升编码效率。 4. **错误检查和警告**:实时检测Freemarker模板中的语法错误和潜在问题,帮助开发者尽早发现...

    freemarker-2.3.28.jar

    3. **模板设计**: Freemarker强调模板应与业务逻辑分离,使得设计师可以专注于布局和样式,而开发者处理数据和逻辑。这种分离使得维护和更新变得更加容易。 4. **缓存机制**: 2.3.28版本可能包含了对模板编译后的...

    FreeMarker手册-Freemarker 2.3.18

    3. **模板指令** FreeMarker支持多种指令,如`<#if>`、`<#else>`、`<#else_if>`用于条件判断,`<#foreach>`、`<#break>`、`<#continue>`用于循环控制,`<#assign>`、`<#global>`进行变量定义,`<#function>`自定义...

    FreeMarker2.3.23官方中文文档

    3. **模板继承与导入**:FreeMarker支持模板的继承,通过`<#macro>`定义宏,可以在多个模板间共享代码段。`<#import>`则可以导入其他模板中的变量和宏。 4. **日期和数字格式化**:FreeMarker提供了丰富的内置函数...

    freemarker-2.3.31-API文档-中文版.zip

    赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...

    Freemarker简介及标签详解大全

    Freemarker 简介及标签详解大全 FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写。FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。虽然 FreeMarker ...

    FreeMarker

    3. **指令**:FreeMarker 指令是以 `#` 开头的特殊标签,它们可以执行特定的任务,如`<#assign>`分配变量,`<#include>`引入其他模板,`<#function>`定义函数等。例如,`<#assign name="John">` 将变量 `name` 设置...

    freemarker-2.3.30-API文档-中文版.zip

    赠送jar包:freemarker-2.3.30.jar; 赠送原API文档:freemarker-2.3.30-javadoc.jar; 赠送源代码:freemarker-2.3.30-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.30.pom; 包含翻译后的API文档:...

    freemarker\Freemarker教程_中文版

    Freemarker是一款强大的模板引擎,用于将数据模型与表示层分离,从而实现在Web开发中的动态页面生成。根据所提供的文件信息,我们可以详细探讨以下几个关键的知识点: ### 1. 创建配置实例 在Freemarker中,`...

    freemarker 中文乱码解决

    #### 方法三:调整系统环境变量 对于运行环境,如开发工具或服务器,可以设置环境变量以指定文件编码: ``` -Dfile.encoding=UTF-8 ``` #### 方法四:编码转换处理 在模板处理过程中,对数据模型进行编码转换,...

    FreeMarker通用的分页

    #### 3. 显示页码宏(Macro) `showPage`宏负责实际的页码显示。它接收起始页和结束页作为参数,并遍历这些页码。对于当前页,它会静态显示页码;对于其他页,则生成一个带有`href`属性的链接,链接到相应的页面。 ...

    freemarker-2.3.22

    3. **模板设计**:Freemarker支持条件语句、循环、包含其他模板等功能,使得模板设计灵活且易于维护。 4. **缓存机制**:Freemarker有内置的模板缓存,可以提高性能,尤其是在高并发环境下。 5. **国际化与本地化*...

    freemarker解析成pdf

    3. **配置Freemarker**:初始化Freemarker配置,加载模板文件,并设置字符编码等参数。代码可能如下: ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg....

Global site tag (gtag.js) - Google Analytics