Struts与Velocity集成 五个步骤替代JSP

js

  Struts Recipes 的合著者 George Franciscus 带您一步步地把 Velocity 模板引擎集成进 Struts 应用程序。结果是一个快速、灵活的 JSP 替代物,同时带有希望从 Struts 得到的所有方便。
  
  Java? 服务器页面(JSP)技术是如此普及,以至于人们忘记了在创建 Web 页面时还有其他选择。但是最近,有些开发人员已经转向模板引擎,以获得在 JSP 中得不到的灵活性。虽然用 JSP 和模板引擎都可以把数据嵌入 HTML,但是每种技术都有自己的处理方式。Velocity 模板是一个特别流行的 JSP 替代品。Velocity 提供了平缓的学习曲线和巨大的易用性。开发人员喜欢它简洁的语法,而且性能分析也证明它的性能超出 JSP。Velocity 也非常容易集成进 Struts 应用程序。
  
  在这篇文章中,我将介绍如何在 Struts 应用程序中集成和使用 Velocity 模板引擎。我会首先提供一个公式,然后逐步展开它。生成的应用程序组合了 Struts 和 Velocity ?? 一个第一流的组合,可能会让您怀疑自己对 JSP 的忠诚!
  
  在开始之前下载这篇文章的源代码,以及 Struts、Velocity 和 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。虽然这种技术可行,但却有严重的缺陷:无法使用 struts-config.xml 文件把响应抽象出来。把视图放在 Action 内部,意味着如果想要修改响应,就必须修改 Action。
  
  因为这种技术剥夺了 Struts 最好的一项特性(即从视图中抽象出重点的能力),所以我更愿意把所有响应指向一个 servlet,由它负责访问 Velocity 模板,合并上下文的数据,生成响应,然后再送回浏览器。稍后就会学到,Velocity 的设计者们已经把这些步骤全都捆绑在了一起:您需要做的只是跟着我来看如何一步步地实现它们。如果您还没有 访问“下载”一节,现在是访问的时候了。
  
  Velocity 的五步
  
  把 Struts 与 Velocity 模板引擎组合起来很简单,也很直接;实际上,只要用五步就可以实现:
  
  1.  把 Velocity JAR 放在类路径中。
  
  2.  修改 web.xml 文件让它识别 Velocity servlet。
  
  3.  把 Velocity toolbox.xml 放在应用程序的 WEB-INF 目录下。
  
  4.  修改 struts-config,把它的视图指向 Velocity 模板而不是 JSP。
  
  5.  为每个需要显示的页面创建 Velocity 模板。
  
  我将用一个熟悉的搜索用例来演示 Struts 与 Velocity 的集成。在这个示例中,一个简单的应用程序允许用户按照图书的 ISBN 编号搜索图书。应用程序的结果页面显示与 ISBN 编号匹配的图书。
  
  第 1 步:把 Velocity JAR 放在 WEB-INF/lib 下
  
  放弃 Struts 标记 ?? 不!
  
  现在,您可能会想,是不是需要放弃那些过去让您节约了许多编码时间的很好的 Struts 标记。如果不使用 JSP,那么肯定没有使用 Struts 的 JSP 标记!幸运的是,您可以使用 Velocity 工具。Velocity 的 Struts 工具提供了所有您熟悉的 Struts 方便特性,但是添加了 Velocity 的灵活性。
  
  如果您还没下载 Velocity,那么现在需要下载它。Velocity 本身是很棒的,但是它的工具包可以帮助您把工作做得更好更快。特别是 Struts 工具模拟了您以前熟悉的 Struts 标记。请参阅 下载 一节下载 Velocity 模板引擎和 Velocity 工具。
  
  请注意不同时候,需要的 jar 也会略有不同。在这里我不想列出一个 JAR 列表,只是想建议您访问 Velocity 的主页(请参阅 参考资料)并阅读那里的安装指南。一旦得到了需要的 JAR,只需把它们放在 WEB-INF\lib 下面即可。
  
  第 2 步:修改 web.xml,让它识别 Velocity 的 servlet
  
  下一步是修改 Struts 的 web.xml 文件,让它识别 Velocity 的 servlet 并把所有以 .vm 结尾的资源请求定向到 Velocity servlet,如清单 1 所示。
  
  清单 1. 修改 web.xml,声明 Velocity servlet
  
  <servlet>
  <servlet-name>velocity</servlet-name> |(1)
  <servlet-class> |(2)
  org.apache.velocity.tools.view.servlet.VelocityViewServlet
  </servlet-class>
  
  <init-param> |(3)
  <param-name>org.apache.velocity.toolbox</param-name>
  <param-value>/WEB-INFtoolbox.xml</param-value>
  </init-param>
  
  <load-on-startup>10</load-on-startup> |(4)
  </servlet>
  
  <!-- Map *.vm files to Velocity -->
  <servlet-mapping> |(5)
  <servlet-name>velocity</servlet-name>
  <url-pattern>*.vm</url-pattern>
  </servlet-mapping>
  
  让我们来看看清单 1 中发生了什么:
  
  (1)声明了 Velocity servlet 并给了它一个 velocity 句柄。
  
  (2)声明了 Velocity servlet 的类名。
  
  Velocity servlet 接受“toolbox”参数。toolbox 是声明应用程序的可用工具的位置。因此,在清单 1 中,我还做了以下工作:
  
  (3)告诉 VelocityServlet 在哪里可以找到 toolbox 的配置。
  
  (4)设置了 load-on-startup 标记,确保在正确的时间装入 Velocity servlet。任何大于或等于 0 的值都会迫使容器通过调用 servlet 的 init() 方法来装入它。放在 load-on-startup 标记体中的值决定了不同的 servlet 的 init 方法调用的次序。例如,0 在 1 之前调用,而 1 在 2 之前调用。缺少的标记或负值允许 servlet 容器根据自己的选择装入 servlet。
  
  (5)声明了 servlet 映射,强迫所有用 .vm 结尾的资源请求定向到 Velocity servlet。请注意(5)中的<servlet-name> 必须与(1)中的<servlet-name> 匹配。交错的声明和映射会在日志中生成错误。
  
  第 3 步:把 toolbox.xml 放在 WEB-INF 下
  
  利用 Velocity,可以使用(或创建)包含许多工具的工具箱。用来登记类的工具箱中包含有用的函数,常常会用到。幸运的是,Velocity 提供了许多预先构建好的工具。还创建了许多 Struts 工具来模拟原始的 Struts 标记。如果发现需要构建自己的工具,也可以自由地构建。在清单 2 中显示的 toolbox.xml 可以在 Velocity 工具下载中找到。这个文件应当随 Velocity JAR 一起放在 WEB-INF 下。
  
  清单 2. toolbox.xml
  
  <?xml version="1.0"?>
  <toolbox>
  <tool>
  <key>link</key>
  <scope>request</scope>
  <class>
  org.apache.velocity.tools.struts.StrutsLinkTool
  </class>
  </tool>
  <tool>
  <key>msg</key>
  <scope>request</scope>
  <class>
  org.apache.velocity.tools.struts.MessageTool
  </class>
  </tool>
  <tool>
  <key>errors</key>
  <scope>request</scope>
  <class>
  org.apache.velocity.tools.struts.ErrorsTool
  </class>
  </tool>
  <tool>
  <key>form</key>
  <scope>request</scope>
  <class>
  org.apache.velocity.tools.struts.FormTool
  </class>
  </tool>
  <tool>
  <key>tiles</key>
  <scope>request</scope>
  <class>
  org.apache.velocity.tools.struts.TilesTool
  </class>
  </tool>
  <tool>
  <key>validator</key>
  <scope>request</scope>
  <class>
  org.apache.velocity.tools.struts.ValidatorTool
  </class>
  </tool>
  </toolbox>
  
  第 4 步:修改 struts-config
  
  下一步是修改 struts-config.xml,指向 Velocity 视图而不是 JSP。新的配置文件如清单 3 所示。
  
  清单 3. 针对 Velocity 视图修改后的 struts-config.xml
  
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  
  <!DOCTYPE struts-config PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
  "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
  
  <struts-config>
  <form-beans>
  <form-bean name="searchForm" type="app.SearchForm"/>
  </form-beans>
  
  <global-forwards>
  <forward name="welcome" path="/welcome.do"/>
  </global-forwards>
  
  <action-mappings>
  <action
  path="/welcome"
  type="org.apache.struts.actions.ForwardAction"
  parameter="/pages/search.vm"/> |(1)
  
  <action
  path="/search"
  type="app.SearchAction"
  name="searchForm"
  scope="request"
  input="/pages/search.vm"> |(2)
  <forward name="success"
  path="/pages/results.vm"/> |(3)
  </action>
  </action-mappings>
  </struts-config>
  
  清单 3 看起来就像一个非常典型的 Struts 应用程序,只有一个小小的不同。响应没有把客户转向到 JSP,而直接转向到 .vm 文件(请参阅清单 3 中的引用 1、2 和 3)。在大多数情况下,把 Struts 应用程序从 JSP 迁移到 Velocity 视图,需要做的仅仅是全局搜索,把 .jsp 替换成 .vm。其他所有东西都可以保持不变!模板可以同样保存在以前保存 JSP 的位置;所需要做的只是用 Velocity 命令代替 JSP 标记。
  
  第 5 步:创建 Velocity 模板
  
  在清单 4 中,可以看到示例应用程序搜索页面的 Velocity 模板。
  
  清单 4. 搜索页面的 Velocity 模板
  
  <HTML>
  <HEAD>
  <TITLE>Search</TITLE>
  </HEAD>
  <BODY>
  $!errors.msgs()||(1)
  <FORM method="POST"
  action="$link.setAction('/search')"> |(2)
  <h2>Book Search</h2>
  ISBN:<INPUT type="text" name="isbn">
  <INPUT type="submit" value="Submit" name="submit">
  </FORM>
  </BODY>
  </HTML>
  
  清单 4 是一个没有 JSP 或 Struts 标记的典型的 HTML 页面。但是,以下元素看起来可能不是那么熟悉:
  
  (1)用 $!errors.msgs() 得到错误消息队列中的错误消息。
  
  (2)用 $link.setAction('/search') 获得搜索转发的 URL。
  
  这就成功了 ?? 模板剩下的部分看起来几乎与以前熟悉的 HTML 文件相同。清单 5 显示了应用程序结果页面的模板。
  
  清单 5. 结果页面的 Velocity 模板
  
  <html>
  <body>
  
  <h1>Book Details</h1>
  <a href="$link.setForward("searchEntry")">Search again</a> |(1)
  
  <h3>$book.title</h3> |(2)
  
  <b>ISBN:</b>$book.isbn<br>|(3)
  <b>Title:</b>$book.title<br>|(4)
  <b>Author:</b>$book.author<br>|(5)
  <b>Price:</b>$book.price<br>|(6)
  <b>No Pages:</b>$book.pages<br>|(7)
  <b>Description:</b>$book.description<br>|(8)
  <b>Publisher:</b>$book.publisher<br>|(9)
  </body>
  <html>
  
  可以注意到,清单 5 中不包含 JSP 标记或 Struts 标记。我们来详细看看它:
  
  (1)用 Struts 的链接工具把 <a> 标记的 href 设置为 Struts 转发。
  
  (2)访问 $book title 属性。
  
  (3)访问 $book isbn 属性。
  
  (4)再次访问 $book title 属性。
  
  (5)访问 $book author 属性。
  
  (6)访问 $book price 属性。
  
  (7)访问 $book pages 属性。
  
  (8)访问 $book description 属性。
  
  (9)访问 $book publisher 属性。
  
  讨论
  
  这就是把 Struts 与 Velocity 模板引擎集成的全部工作。表面看起来非常简单(实际上也很简单),但是请想想是什么让这个集成能够工作的呢?
  
  Struts 动作映射可以定义任何视图,不仅限于 JSP。在这篇文章中,我只是把动作映射修改为以 vm 结尾而不是以 jsp 结尾的返回文件。然后,我声明了 Velocity servlet,并告诉 Servlet 容器把以 vm 结尾的文件发送给 VelocityViewServlet。
  
  VelocityViewServlet 把 Velocity 命令表示成 HTML 响应。通过这种方式,VelocityViewServlet 充当了视图响应的拦截器。Struts 控制器把视图转发给 VelocityViewServlet,后者在向客户端发送响应之前处理 vm 文件。请参阅 参考资料 获得关于将 Velocity 视图集成进 Struts 应用程序的更多内容。
  
  结束语
  
  正如在本文中看到的,Struts 与 Velocity 的集成很简单。只需五个步骤就可以把所有东西连在一起。针对不同的引擎和场景,采用模板引擎而不是 JSP 的优势各有不同。在 Velocity 的情况下,优势就是简单性、容易学习以及更好的性能。

时间: 2024-08-02 16:47:17

Struts与Velocity集成 五个步骤替代JSP的相关文章

J2EE 探索者:用五个容易的步骤实现 JSP 自定义标记

j2ee|js JSP 自定义标记为在动态 Web 页中将表示与业务逻辑分离提供了一种标准化的机制,使页面设计者可以将注意力放到表示上,而应用程序开发人员编写后端的代码.在 J2EE 探索者 的这篇文章中,具有企业观念的开发者 Kyle Gabhart 介绍了 JSP 自定义标记的基本知识,并引导您完成将它们加入到 JSP 页面的五步过程.您可能听说现在有上百种不同的方式,但是在开发 Web 应用程序时将表示逻辑与业务逻辑分离是很重要的.近年来,Java 平台已经发展为在体系结构层次上加入了这种

如何挑选数据中心供应商?你只需记住这五个步骤

凡事并不是越大就越好,也并不是每一次的科技创新都是最好的.在选择数据中心供应商和服务商时,也只有在设备安装后或合同执行后才知道是不是一次正确的选择.如果当问题出现时,才意识到选择了一家不满意的数据中心服务商. 下面的这五个步骤能够尽量减少这种情况的发生: 一.货比三家:制定流程框架 结构化流程可以帮你货比三家.技术集成商Forsythe Technology的数据中心工程高级顾问Tim Flynn指出,给六个不同的供应商提交需求方案说明书(RFP),不可能得到六个完全不同的方案.方案之间的差异并

ASP.NET 入门的五个步骤_基础应用

作者:Rob Howard 2000 年 11 月 12 日   将于 2000 年 12 月 28 日存档 欢迎访问 Nothin´ but ASP.NET 专栏,下面我将为大家深入介绍 ASP.NET 中某些重要的新特性,以及一些其他 .NET Framework 技术. 在第一个专栏中,我们将讨论 ASP.NET 入门的五个步骤.以后的专栏我们将陆续探讨 ASP.NET 中的其他优秀功能(如部署.状态管理.进程模型.控件.安全等方面的变化). 步骤 1:下载和安装 .NET SDK ASP

构建私有云的五个步骤

如今,企业在业务中越来越多地采用新技术.也许他们执行一些特定的任务,超出了日常关注的IT管理工作.也许他们是有用的某种特定的工具,但并不是任何正式工作流程或过程的一部分.也许这是他们提高效率的一种方式,可以逐步采用一个服务器或一组应用程序. 在早期,虚拟化大多属于后一类.在21世纪初期,许多企业急切地寻求避免购买服务器和其他IT设备的方法.服务器虚拟化很好地降低了成本,因为可以充分利用服务器(特别是运行Windows的服务器)的资源,虚拟化使一个服务器可以做许多工作.而且,重要的是在这段时间的情

成功实施“病毒式”营销的五个步骤

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 病毒性营销是一种网络营销方法,常用作网站推广的手段,病毒性营销同时也是一种网络营销思想,其背后的含义是如何充分利用外部网络资源(尤其是免费资源)扩大网络营销信息传递渠道.本文介绍成功实施病毒性营销的五个步骤:病毒性营销方案的规划和设计.独特的病毒性营销创意.信息源和传递渠道的设计.原始信息发布.病毒性营销效果跟踪管理.认真对待每个步骤,病毒性

整合资源拓展能力 知识库建设的五个步骤

按照知识管理中心(http://www.aliyun.com/zixun/aggregation/16719.html">KnowledgeManagementCenter)的研究和咨询实践,知识库建设必须遵循以下五个步骤: 第一步:确定要管理的知识.在任何一个企业内部,都有各种各样的知识,而在知识管理的实践中,并非每类类型知识都需要去管理.所以在知识库建设的初期必须明确要管理的知识类型.其价值在何处,这样才不至于眉毛胡子一把抓,导致核心知识和外围知识都无法很好管理的状况出现. 第二步:确

造高质量外链的五个步骤

众所周知,对于关键词的排名,其核心因素就是内容,内链和外链.而在这三个因素中,外链又最让我们头疼. 什么样的链接才算有效链接?什么样的链接能明显提高排名?什么样的链接会被判为作弊? 我想这一连串的问题我们都很难给出确切的答案. 那么有没有一种快速找到优质链接的方法呢?答案是有.今天天雅给大家分享一种我在一家seo公司工作时用到的方法--跟踪竞争对手. 做seo的都知道,太冷门的关键词没有做的必要,因为没有价值.而凡是热门的关键词又都有人做了,而且都比我们做的好.对,正是因为有比我们做的好的,才使

J2EE探索者: 用五个容易的步骤实现JSP自定义标记

您可能听说现在有上百种不同的方式,但是在开发 Web 应用程序时将表示逻辑与业务 逻辑分离是很重要的.近年来,Java 平台已经发展为在体系结构层次上加入了这种分离. 例如,在 JSP 体系结构中加入 JavaBean 组件使开发人员使用 JSP 标记获得和设置经过 特别编码的 Java 组件上的属性.这些组件或者 JavaBean 再代表表示层执行后端业务处 理. JSP 自定义标记是 JSP/JavaBean 体系结构的产物.像 JavaBean 技术一样,自定义标 记有助于将表示逻辑与业务

结合优选算法 利用可视化进行高级数据分析的五个步骤

[导语] 在大多数科学研究中,大量的实验数据的统计分析工作通常由计算和统计方面的技术专家完成. 遗憾的是,这些专家不是相应领域研究的专家,这可能导致分析中的缺陷. 如果,研究人员本人能够轻松使用工具和方法来处理和分析数据,那么肯定会获得丰富研究成果. 问题 许多科学家都面临着共同的挑战,特别是那些分子生物学领域科学家,他们的实验产生了大量的数据.对于如此海量的数据,人们需要软件工具来有效地解释其数据. 如今,面临日益增长的大数据,计算机软件仍大多侧重于数据处理,通过面向技术专家的用户界面,以标准