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

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

作者:不详 来源:不详 发布时间:2005-11-21 12:10:59 发布人:Yeasiz

  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 的情况下,优势就是简单性、容易学习以及更好的性能。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值