Struts Recipes 的合着者 George Franciscus 带您一步步地把 Velocity 模板引擎集成进 Struts 应用程序结果是一个快速灵活的 JSP 替代物同时带有希望从 Struts 得到的所有方便
Java? 服务器页面(JSP)技术是如此普及以至于人们忘记了在创建 Web 页面时还有其他选择但是最近有些开发人员已经转向模板引擎以获得在 JSP 中得不到的灵活性虽然用 JSP 和模板引擎都可以把数据嵌入 HTML但是每种技术都有自己的处理方式Velocity 模板是一个特别流行的 JSP 替代品Velocity 提供了平缓的学习曲线和巨大的易用性开发人员喜欢它简洁的语法而且性能分析也证明它的性能超出 JSPVelocity 也非常容易集成进 Struts 应用程序
在这篇文章中我将介绍如何在 Struts 应用程序中集成和使用 Velocity 模板引擎我会首先提供一个公式然后逐步展开它生成的应用程序组合了 Struts 和 Velocity ?? 一个第一流的组合可能会让您怀疑自己对 JSP 的忠诚!
在开始之前下载这篇文章的源代码以及 StrutsVelocity 和 Velocity 工具包请注意本文假设您熟悉使用 Struts 框架进行 MVC 编程
关于模板引擎
在开始集成 Struts 和 Velocity 的简单任务之前让我们先确保您理解模板引擎和它们在视图生成中的角色模板引擎作为整体概念Velocity 作为具体实现它们的生命在 HTML 之外Velocity 把数据合并到文本主体中不同的点上文本可以是文字电子邮件或 HTML由于采用这种方式Velocity 模板引擎有点儿像 Microsoft Word 的邮件合并特性邮件合并允许您方便地把动态数据(例如姓名地址和电话号码)合并到信件中在早期的日子里组织用这项特性生成大型邮件列表并把它们送到邮局导致垃圾邮件的产生!
Velocity 是什么?
Velocity 是一个基于 Java 的模板引擎它提供了简单的基于模板的语言可以用类似脚本的方式引用对象Velocity 促进了分离团队成员之间的责任允许 Web 设计人员专注于视图(即页面的观感)而 Java 程序员专注于后端代码把 Java 代码从页面布局中分离出来会让 Web 应用程序未来更易维护当 Velocity 与 Sruts 这样的 MVC 框架结合时就成了 JSP 或 PHP 可行的替代
在 Web 应用程序中Velocity 实现的目标与 JSP 相同可以用它在向 HttpServletResponse 的 OutputStream 发送之前生成要发送的 HTML在 Struts 应用程序中使用 Velocity 的一种方式是在 Struts 的 Action 内部写入响应然后返回 null 的 ActionForward虽然这种技术可行但却有严重的缺陷无法使用 strutsconfigxml 文件把响应抽象出来把视图放在 Action 内部意味着如果想要修改响应就必须修改 Action
因为这种技术剥夺了 Struts 最好的一项特性(即从视图中抽象出重点的能力)所以我更愿意把所有响应指向一个 servlet由它负责访问 Velocity 模板合并上下文的数据生成响应然后再送回浏览器稍后就会学到Velocity 的设计者们已经把这些步骤全都捆绑在了一起您需要做的只是跟着我来看如何一步步地实现它们如果您还没有 访问下载一节现在是访问的时候了
Velocity 的五步
把 Struts 与 Velocity 模板引擎组合起来很简单也很直接实际上只要用五步就可以实现
把 Velocity JAR 放在类路径中
修改 webxml 文件让它识别 Velocity servlet
把 Velocity toolboxxml 放在应用程序的 WEBINF 目录下
修改 strutsconfig把它的视图指向 Velocity 模板而不是 JSP
为每个需要显示的页面创建 Velocity 模板
我将用一个熟悉的搜索用例来演示 Struts 与 Velocity 的集成在这个示例中一个简单的应用程序允许用户按照图书的 ISBN 编号搜索图书应用程序的结果页面显示与 ISBN 编号匹配的图书
第 步把 Velocity JAR 放在 WEBINF/lib 下
放弃 Struts 标记 ?? 不!
现在您可能会想是不是需要放弃那些过去让您节约了许多编码时间的很好的 Struts 标记如果不使用 JSP那么肯定没有使用 Struts 的 JSP 标记!幸运的是您可以使用 Velocity 工具Velocity 的 Struts 工具提供了所有您熟悉的 Struts 方便特性但是添加了 Velocity 的灵活性
如果您还没下载 Velocity那么现在需要下载它Velocity 本身是很棒的但是它的工具包可以帮助您把工作做得更好更快特别是 Struts 工具模拟了您以前熟悉的 Struts 标记请参阅 下载 一节下载 Velocity 模板引擎和 Velocity 工具
请注意不同时候需要的 jar 也会略有不同在这里我不想列出一个 JAR 列表只是想建议您访问 Velocity 的主页(请参阅 参考资料)并阅读那里的安装指南一旦得到了需要的 JAR只需把它们放在 WEBINF\lib 下面即可
第 步修改 webxml让它识别 Velocity 的 servlet
下一步是修改 Struts 的 webxml 文件让它识别 Velocity 的 servlet 并把所有以 vm 结尾的资源请求定向到 Velocity servlet如清单 所示
清单 修改 webxml声明 Velocity servlet
<servlet>
<servletname>velocity</servletname> |()
<servletclass> |()
orgapachevelocitytoolsviewservletVelocityViewServlet
</servletclass>
<initparam> |()
<paramname>orgapachevelocitytoolbox</paramname>
<paramvalue>/WEBINFtoolboxxml</paramvalue>
</initparam>
<loadonstartup></loadonstartup> |()
</servlet>
<! Map *vm files to Velocity >
<servletmapping> |()
<servletname>velocity</servletname>
<urlpattern>*vm</urlpattern>
</servletmapping>
让我们来看看清单 中发生了什么
()声明了 Velocity servlet 并给了它一个 velocity 句柄
()声明了 Velocity servlet 的类名
Velocity servlet 接受toolbox参数toolbox 是声明应用程序的可用工具的位置因此在清单 中我还做了以下工作
()告诉 VelocityServlet 在哪里可以找到 toolbox 的配置
()设置了 loadonstartup 标记确保在正确的时间装入 Velocity servlet任何大于或等于 的值都会迫使容器通过调用 servlet 的 init() 方法来装入它放在 loadonstartup 标记体中的值决定了不同的 servlet 的 init 方法调用的次序例如 在 之前调用而 在 之前调用缺少的标记或负值允许 servlet 容器根据自己的选择装入 servlet
()声明了 servlet 映射强迫所有用 vm 结尾的资源请求定向到 Velocity servlet请注意()中的<servletname> 必须与()中的<servletname> 匹配交错的声明和映射会在日志中生成错误
第 步把 toolboxxml 放在 WEBINF 下
利用 Velocity可以使用(或创建)包含许多工具的工具箱用来登记类的工具箱中包含有用的函数常常会用到幸运的是Velocity 提供了许多预先构建好的工具还创建了许多 Struts 工具来模拟原始的 Struts 标记如果发现需要构建自己的工具也可以自由地构建在清单 中显示的 toolboxxml 可以在 Velocity 工具下载中找到这个文件应当随 Velocity JAR 一起放在 WEBINF 下
清单 toolboxxml
<?xml version=?>
<toolbox>
<tool>
<key>link</key>
<scope>request</scope>
<class>
orgapachevelocitytoolsstrutsStrutsLinkTool
</class>
</tool>
<tool>
<key>msg</key>
<scope>request</scope>
<class>
orgapachevelocitytoolsstrutsMessageTool
</class>
</tool>
<tool>
<key>errors</key>
<scope>request</scope>
<class>
orgapachevelocitytoolsstrutsErrorsTool
</class>
</tool>
<tool>
<key>form</key>
<scope>request</scope>
<class>
orgapachevelocitytoolsstrutsFormTool
</class>
</tool>
<tool>
<key>tiles</key>
<scope>request</scope>
<class>
orgapachevelocitytoolsstrutsTilesTool
</class>
</tool>
<tool>
<key>validator</key>
<scope>request</scope>
<class>
orgapachevelocitytoolsstrutsValidatorTool
</class>
</tool>
</toolbox>
第 步修改 strutsconfig
下一步是修改 strutsconfigxml指向 Velocity 视图而不是 JSP新的配置文件如清单 所示
清单 针对 Velocity 视图修改后的 strutsconfigxml