Struts 与 Velocity 的集成

Velocity 是一个基于 Java 的模板引擎,它提供了简单的基于模板的语言,可以用类似脚本的方式引用对象。Velocity 促进了分离团队成员之间的责任:允许 Web 设计人员专注于视图(即页面的观感),而 Java 程序员专注于后端代码。把 Java 代码从页面布局中分离出来,会让 Web 应用程序未来更易维护。当 Velocity 与 Sruts 这样的 MVC 框架结合时,就成了 JSP 或 PHP 可行的替代。 

把 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 下  
如果您还没下载 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 所示。 

Xml代码   收藏代码
  1. <servlet>  
  2.   
  3.   <servlet-name>velocity</servlet-name> |(1)  
  4.   
  5.   <servlet-class> |(2)  
  6.   
  7.          org.apache.velocity.tools.view.servlet.VelocityViewServlet  
  8.   
  9.   </servlet-class>                                             
  10.   
  11.   <init-param> |(3)  
  12.   
  13.     <param-name>org.apache.velocity.toolbox</param-name>  
  14.   
  15.     <param-value>/WEB-INF/toolbox.xml</param-value>       
  16.   
  17. </init-param>                                                  
  18.   
  19. <load-on-startup>10</load-on-startup> |(4)  
  20.   
  21. </servlet>  
  22.   
  23. <!-- Map *.vm files to Velocity -->  
  24.   
  25. <servlet-mapping> |(5)  
  26.   
  27.   <servlet-name>velocity</servlet-name>  
  28.   
  29.   <url-pattern>*.vm</url-pattern>       
  30.   
  31. </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 下。 

<?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 所示。 

<?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"/> 
            path="/search" 
            type="app.SearchAction" 
            name="searchForm"   
            scope="request" 
            input="/pages/search.vm"> 
              path="/pages/results.vm"/> 
    </action-mappings> 
</struts-config> 

清单 3 看起来就像一个非常典型的 Struts 应用程序,只有一个小小的不同。响应没有把客户转向到 JSP,而直接转向到 .vm 文件(请参阅清单 3 中的引用 1、2 和 3)。在大多数情况下,把 Struts 应用程序从 JSP 迁移到 Velocity 视图,需要做的仅仅是全局搜索,把 .jsp 替换成 .vm。其他所有东西都可以保持不变!模板可以同样保存在以前保存 JSP 的位置;所需要做的只是用 Velocity 命令代替 JSP 标记。 

第 5 步:创建 Velocity 模板 

在清单 4 中,可以看到示例应用程序搜索页面的 Velocity 模板。 

<HTML> 
  <HEAD> 
    <TITLE>Search</TITLE> 
  </HEAD> 
  <BODY> 
    $!errors.msgs()| 
      action="$link.setAction('/search')"> 
      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 显示了应用程序结果页面的模板。 

<html> 
  <body> 

  <h1>Book Details</h1> 
  <a href="$link.setForward("searchEntry")">Search again</a> 
<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 文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值