1,需求
最近要开发新闻发布系统,新闻信息量比较大,访问也相对比较频繁,对服务器造成的压力也很大。考虑到新闻内容更新频率小,内容相对比较简单,我们决定将新闻版块生成静态页面,这样可以加快访问速度,同时也减轻服务器的负担。
2,备选技术分析、对比:Velocity和Freemarker
这两个模板技术我们都做了尝试,Velocity和Freemarker非常相似,它们都是可以在Servlet容器外使用的模版语言。Velocity相对来说比较简单,轻便一点,语法要求也没Freemarker那么严格,而Freemarker相对功能也比较强大一些。
VelocityStruts是VelocityTools提供的,它与Struts实现了很好的衔接。当然,除了语法上简洁以外,还因为它对struts的form的处理,如下所示:
<form action='$link.setAction("/login")' method="post">
<td>账户:</td>
<td><input type="text" name="login" value="$!loginForm.login" size="50" maxlength="100"/></td>
<td>密码:</td>
<td><input type="text" name="password" value="$!loginForm.password" size="50" maxlength="100"/></td>
<td colspan="2" align="center"><input type="submit" value="test"/></td>
</form>
注意这点:<input type="text" name="login" value="$!loginForm.login" size="50" maxlength="100"/>,这样的优点不言而遇,就是不影响页面的表达,自然是能得到Dreamweaver等工具的良好支持。这也是我比较看中的。
以下是Freemarker的例子:
<#global html=JspTaglibs["/WEB-INF/tld/struts-html.tld"]>
<#global bean=JspTaglibs["/WEB-INF/tld/struts-bean.tld"]>
<title>新闻发布</title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<link href="style/style.css" rel="stylesheet" type="text/css">
<@bean.page id="request" property="request"/>
<#assign contextPath = request.contextPath/>
<@html.form method="post" action="/newsList.do?method=insertNews"> <tr>
<td width="36%" height="25"> </td>
<td width="64%" height="25"><@html.errors/></td>
</tr>
<tr>
<td height="25" align="right">新闻标题:</td>
<td height="25"><@html.text property="newsTitle" styleClass="input1"/></td>
</tr>
<tr>
<td height="25" align="right">新闻内容:</td>
<td height="25">
<@html.textarea property="newsContent" cols="80" rows="10"/>
</td>
</tr>
<tr>
<td height="25" align="right"> </td>
<td height="25"><@html.submit value="确 定" styleClass="button1"/> <@html.button value="重 置" styleClass="button1"/></td>
</tr>
</@html.form>
FreeMarker的表单域是这样声名的
<@html.form method="post" action="/newsList.do?method=insertNews">
<@html.text property="newsDate" styleClass="input1"/>
显然从这方面来说,我觉得Freemarker页面不如Velocity那么清爽。另外可从网上获取Velocity的Dreamweaver的插件,这样在Dreamweaver中设计和调整页面都很爽,而Freemarker找了半天也没找到其相应的插件。当然,这并不代表Freemarker不如Velocity,Freemarker功能显然比Velocity强一些,也就是说,Velocity能做到的,Freemarker基本也能做到,Velocity在某些方面不能做到的,Freemarker也能做到。
以下是我从网上摘自同仁的分析:
Velocity是一个简单而且更加轻量级的工具,但是它没有达到FreeMarker能够做的许多任务,而且它的模板语言不是很强大
我们认为对于大多数应用程序,FreeMarker比Velocity工作更简单,因为:
使用Velocity,你需要寻找特定工具或各种工作环境来一次次的解决典型的模板创作任务,结果会浪费更多时间
工作环境经常意味着在Velocity模板中直接使用Java对象的方法,这违反了简单、无编程HTML设计的观念
或者将表示任务移到控制器代码中,这违反了MVC模式
使用FreeMarker,可以以out-of-the-box(如何翻译确切?)的方式实现Velocity所能做的
2、特性比较清单
下面是一个使用FreeMarker能够实现,而Velocity不能实现的不太全面的特性清单:
(1)数字和日期支持
可以对任何数字类型进行算术运算和比较,包括精度类型
可以比较和显示(格式化)日期/时间值
(2)国际化
根据各种内建和定制的数字格式,格式化本地敏感的数字
根据各种内建和定制的日期格式,格式化本地敏感和时区敏感的日期
标识(变量名)可以包含非英语字符,如重音字符、阿拉伯字符、中文字符等
(3)循环处理
可以跳出循环
可以在循环外访问循环体内的控制变量
可以测试是否达到最后一次循环
(4)模板级别的数组处理
可以使用类似[i]语法的索引方式访问数组元素
可以查询数组长度
(5)宏
宏可以有局部变量
可以递归调用宏,同样可以在模板的后面定义要调用的宏
调用宏时,可以按位置或名字的方式传递参数
宏参数可以有缺省值,使得在调用时忽略参数也有效
调用的宏可以有嵌套的体内容(<@myMacro>body</@myMacro>),能够在宏被调用时进行处理
宏是纯变量的,可以基于表达式来执行宏,或者作为参数传递给另一个宏
(6)命名空间
可以对变量使用多命名空间,这对创建宏库很重要,因为这可以避免应用程序中指定的变量和宏库中变量的名字冲突
(7)使用内建的函数/操作符维护Java无关的string、list和map
可以将字符串转换成大/小写、首字符大/小写,对HTML、XML或RTF进行转义处理,substring、split、查询字符串长度、find/replace子串等等
通过索引访问list元素,获得子list,合并list,查询list长度,对list排序
通过key变量访问map元素,检查map是否为空,获得key或值的list
(8)揭示模板中的错误
当访问一个未定义的变量,FreeMarker不会沉默;你可以配置FreeMarker来停止render模板显示错误信息,或者跳过错误部分;无论哪种,FreeMarker会记录问题(日志)
在写错指令名时,FreeMarker会抛出异常
(9)高级render控制
可以使用一组标记来封装模板的一块区域,以便在块区中所有要修改的地方应用HTML或XML转义(或其它使用FreeMarker表达式表示的转换)
FreeMarker有转换器,它们是模板的一块区域,在render时,通过转换过滤;内建的转换器包括空白字符压缩、HTML和XML转义;你可以实现自己的转换器;当然转换器可以嵌套
可以使用flush指令显式的flush输出
可以使用stop指令停止render
(10)文字
除了通常的字符串、数字和布尔值文字,也可以在模板中定义list和map文字
支持所有的Java转义文字:\b、\t、\n、\f、\r、\"、\'、\\,也支持\xXXXX使用UNICODE指定字符
(11)高级空白字符移除
FreeMarker坚持移除各行只包含不输出FreeMarker标记的空白字符
对于明显要整修掉不需要的空白字符的指令来说,空白字符是个大问题
(12)集成其它技术
可以在模板中使用JSP标记库
可以直接在Python工程中使用
(13)强大的XML转换能力
在2.3版本中,FreeMarker具有强大的新XML转换能力,使得替代XSLT成为可能
Velocity在这方面是无法真正竞争的,除非改进核心引擎,如支持宏库映射到名字空间,宏中支持局部变量
(14)高级模板元程序
可以捕获输出的任何部分到context变量中
可以解释任何context变量,如果它是一个模板定义
上述两者的结合使用
由于我们项目是基于Struts的,而两种模板在数据输出上基本上都大同小异,所以我把重点放到了form处理的对比上了,由于是刚学了不久,仅仅参考了一些网上资料和个人的看法。所以以上的并不是很全面,至于项目组中要使用哪个,还是要看其它成员的意见。
3,放弃JSP而选模板技术。
我们用JSP也蛮长时间了,JSP有时要在页面嵌入代码,使页面看起来很混乱,而模板可以让页面很整洁,也便于我们调试,不仅如此,模板的语法更简明、更好用,也比JSP功能强大,据说性能也比JSP好,据说也很接近静态页面输出速度.
trackback:
http://weishuwei.spaces.live.com/blog/cns!C55C1C27B8EE0730!204.entry