1 Freemarker、Fmpp是什么 FreeMarker是个“模版引擎”,所谓模版引擎,就是一段文本,其中包含一些可变的部分,这些可变部分用特殊符号标示了,这就是所谓的模版。
另外有个数据源,包含了模版中的可变的部分。
所谓引擎,就是将模版中的特殊符号标示出的可变部分替换成数据源中相应的数据。譬如动态网页就是模版引擎的很好应用,网页是HTML的文本文件,其中包含的一些信息,如产品列表,是可变的。
HTML网页定义了信息显示格式,产品列表通常存储在公司的数据库中,将来自数据库的产品信息合并到HTML网页中,这就是动态网页。
JSP和ASP对动态网页的解决办法是在HTML中嵌入程序代码,由程序代码负责“拽”出数据。Freemarker的解决办法是,由外部程序取得数据,再“推”入HTML网页。Freemarker的模版仅仅是定义格式,不含程序,不带智能。而JSP和ASP的模版可以像程序代码一样做任何事情。
这样的好处是Freemarker的模版强制分开了负责信息显示的View和负责逻辑运算的程序代码(Model和Controller)。
FMPP是个“拉”数据的东东,它从各种数据源,如CSV文件,数据库,或者它自己定义的TDD格式的文件中读取数据,合并到Freemarker的模版中,生成想要的最终文件。FMPP的一个应用是“网页预生成”。譬如一些新闻类的门户网站,它的新闻更新通常不需要“实时”,可能一天或一周更新一次。这种场合,公司的后台编辑系统可以定期调用FMPP生成静态的新闻网页,上传到网站上。这样做的好处是,大幅度提高网站性能,因为静态网页性能比动态网页高得多。凡是不需要“实时”更新的“动态网页”,FMPP都有用武之地。 Freemarker官网:http://freemarker.org Fmpp官网:http://fmpp.sourceforge.net/
2 简单示例 举个例子来说,
HelloWorld的Freemarker模版如下:
<html> ... Hello ${name} ! ... </html>
${..}就是Freemarker的“变量标志符”。
如果要生成最终网页,则自己编写代码取得name数据,放到某Hash表中(如data.put("name","张三");),而后调用Freemarker的方法合并数据到HelloWorld模版,
如下:
import freemarker.template.*;
... ...
Configuration _cfg = new Configuration();
_cfg.setDirectoryForTemplateLoading(new File("templateDirectory"));
_cfg.setObjectWrapper(new DefaultObjectWrapper());
Template temp = _cfg.getTemplate("HelloWord.html");
Map<String,Object> data = new HashMap<String,Object>();
data.put("name","张三");
Writer out = new OutputStreamWriter(System.out);
temp.process(data, out);
out.flush();
... ...
如果使用FMPP,则可以将name数据放到如CSV等数据文件中,而后调用FMPP的命令,将数据文件合并到模版文件,生成最终文件,相当于FMPP中实现了上述取数据及合并到模版的工作。
当然,FMPP作的更强大,一是FMPP可以读多种格式的数据,二是提供了很多宏(Macro)帮忙生成各种各样的文件及目录结构。
3 Freemarker+Fmpp VS. JSP
首先,Freemarker模版的语法和HTML很像,比JSP2.0以下版本简洁。实际开发中的大页面,JSP2.0以下版本的的页面文件很凌乱,难于开发和维护,相比而言Freemarker模版简单很多。不过,JSP2.0以上版本的语法和Freemarker模版很像,比之前版本改善很多。
其次,JSP页面必须发布到Webserver,而且编写取数据的Java代码才能看到页面效果,而Freemarker+Fmpp能离线测试页面效果。
方法是做好Freemarker的模版,再做好CSV或Fmpp的TDD格式数据文件,而后执行Fmpp命令合并模版和数据,生成最终HTML页面即可看页面效果。整个过程无需Webserver,无需编写任何Java代码。这样最大的好处是,页面开发测试工作和业务逻辑(包括数据库访问)代码开发测试工作能够分开独立进行,而且,页面开发人员无需懂Java和编程,只要会HTML和Freemarker模版即可。
两方面都完成后,再把页面和代码集成起来。页面开发人员做好的数据文件,又可以作为集成测试的数据。 实践中,项目开发人员可以分成页面组和后台代码组,页面组负责页面模版、页面Script(JavaScript)、页面文字的国际化等工作。
后台组分但逻辑代码的开发和单元测试。因为用户很关心系统界面,页面组的工作尽量在项目早期开始,初步了解需求以后即可开始,一方面让用户早点看到界面能引导用户清楚表达自己的需求,减少以后的变更;另一方面,有了界面原型,整个项目组(包括用户)能更快的理解系统,更好的讨论问题(有了一致的讨论问题的基础)。
页面和后台的集成部分可以由页面组负责,或者另外安排集成组负责,建议不要让后台组负责,后台组专心于系统核心设计和开发。