五步轻松替代JSP Struts与Velocity集成[转]

element的el-cascader组件动态加载,以及报错处理问题 Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. 报错处理 阅读详情
                                五步轻松替代JSP Struts与Velocity集成
          2005.10.26  来自:IT专家网 
   Java™ 服务器页面(JSP)技术是如此普及,以至于人们忘记了 在创建 Web 页面时还有其他选择。但是最近,有些开发人员已经转向模板引擎,以获得在 JSP 中得不到的灵活性。虽然用 JSP 和模板引擎都可以把数据嵌入 HTML,但是每种技术都有自己的处理方式。Velocity 模板是一个特别流行的 JSP 替代品。Velocity 提供了平缓的学习曲线和巨大的易用性。开发人员喜欢它简洁的语法,而且性能分析也证明它的性能超出 JSP。Velocity 也非常容易集成进 Struts 应用程序。

       在这篇文章中,我将介绍如何在 Struts 应用程序中集成和使用 Velocity 模板引擎。我会首先提供一个公式,然后逐步展开它。生成的应用程序组合了 Struts 和 Velocity —— 一个第一流的组合,可能会让您怀疑自己对 JSP 的忠诚!

      关于模板引擎

      在开始集成 Struts 和 Velocity 的简单任务之前,让我们先确保您理解模板引擎和它们在视图生成中的角色。模板引擎作为整体概念,Velocity 作为具体实现,它们的生命在 HTML 之外。Velocity 把数据合并到文本主体中不同的点上。文本可以是文字、电子邮件或 HTML。由于采用这种方式,Velocity 模板引擎有点儿像 Microsoft Word 的“邮件合并”特性。邮件合并允许您方便地把动态数据(例如姓名、地址和电话号码)合并到信件中。在早期的日子里,组织用这项特性生成大型邮件列表并把它 们送到邮局,导致垃圾邮件的产生!

      在 Web 应用程序中,Velocity 实现的目标与 JSP 相同:可以用它在向 HttpServletResponse 的 OutputStream 发送之前生成要发送的 HTML。在 Struts 应用程序中使用 Velocity 的一种方式是在 Struts 的 Action 内部写入响应,然后返回 null 的 ActionForward。虽然这种技术可行,但却有严重的缺陷:无法使用 struts-config.xml 文件把响应抽象出来。把视图放在 Action 内部,

意味着如果想要修改响应,就必须修改 Action。

      因为这种技术剥夺了 Struts 最好的一项特性(即从视图中抽象出重点的能力),所以我更愿意把所有响应指向一个 servlet,由它负责访问 Velocity 模板,合并上下文的数据,生成响应,然后再送回浏览器。稍后就会学到,Velocity 的设计者们已经把这些步骤全都捆绑在了一起:您需要做的只是跟着我来看如何一步步地实现它们。

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

      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 下

      如果您还没下载 Velocity,那么现在需要下载它。Velocity 本身是很棒的,但是它的工具包可以帮助您把工作做得更好更快。特别是 Struts 工具模拟了您以前熟悉的 Struts 标记。

      请注意不同时候,需要的 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-INF/toolbox.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 的情况下,优势就是简单性、容易学习以及更好的性能。

【数据集7】全球人类住区层GHSL数据详解 全球人类住区层GHSL数据详解 阅读详情

相关推荐

Jsp结合Velocity实现依据Word模板文件生成对应数据文件

Jsp结合Velocity实现依据Word模板文件生成对应数据文件,操作非常灵活,方便。

Thymeleaf(替代JSP

Thymeleaf 1.简介 Thymeleaf 是一个跟 FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较其他的模板引擎,它有如下特点: 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,无网络显示静态内容,有网络用后台得到数据替换静态内容 SpringBoot完美整合,springboot默认整合thymeleaf 2.编写接口 2.1 service层 @Service public class UserService { //在通用mapp

qq_30245525的博客 2943

腾讯游戏蓝钻贵族驱动-网络游戏其他资源

腾讯游戏-蓝钻贵族 Black-Knight 黑骑士有线炫光8D滚轮游戏鼠标驱动, 支持8键自定义、宏编程,满足各类游戏设置功能(自带配置文件,可保存,无须重新设置,解决设置带来的烦恼);支持快速游戏模式、多媒体模式、办公模式切换!它是鼠标中的AK47, 好用又便宜.

struts2-为什么是struts而不是servlet+jsp

servlet + jsp开发web应用程序是很多人标榜的web开发基础。struts不过是更加简单而已。不够高级。就像使用c语言的人觉得使用java的开发人员是菜鸟一样。于是我使用了servlet+jsp谢了一个最简单的前台向后台传值的例子。传递一个时间和姓名 jsp页面 <%@ page language="java" contentType="text/html; charset=u

shengshiqing的专栏 1114

别再写jsp了,Thymeleaf它不香吗?

1. 啥是 Thymeleaf 在学 Thymeleaf 之前我们先看一下使用 jsp 开发遇到的主要问题: jsp 的痛点 1.页面包含大量 java 代码,代码太混乱 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>jsp</title> </head> <body&g

m0_67261762的博客 3439

目前流行框架的一些替代技术

1. jspservlet、javabean的替代技术:     jspservlet完全同意,底层运行机制完全一致,jsp必须被web服务器编译成servlet,在服务器真正运行的事servletjsp充当表现层技术的替换是:freeMark或者velocity2. Struts2及其替代技术:     struts是世界最早的mvc框架,作者是jsp规范的制定者,并参tomc

IT_lollipop的博客 9375

五步轻松替代JSP StrutsVelocity集成

 Java™ 服务器页面(JSP)技术是如此普及,以至于人们忘记了在创建 Web 页面时还有其他选择。但是最近,有些开发人员已经模板引擎,以获得在 JSP 中得不到的灵活性。虽然用 JSP模板引擎都可以把数据嵌入 HTML,但是每种技术都有自己的处理方式。Velocity 模板是一个特别流行的 JSP 替代品。Velocity 提供了平缓的学习曲线和巨大的易用性。开发人员喜欢它简洁的语法,

chnjxiang的专栏 1586

struts+velocity

Struts Velocity集成 用五个步骤轻松替代 JSP 级别: 中级George Franciscus , 首席顾问, Nexcel2005 年 10 月 17 日Struts Recipes 的合著者 George Franciscus 带您一步步地把 Velocity 模板引擎集成Struts 应用程序。结果是一个快速、灵活的 JSP 替代物,同时带有希望从 S

yanzhitao688的专栏 306

Struts Velocity集成()

用五个步骤轻松替代 JSP 文档选项<trvalign="top"><img alt="" height="1" width="8"src="//www.ibm.com/i/c.gif"/><img alt="" width="16"height="16" src="//www.ibm.com/i/c.gif"/><td class="small"width="122">未显示需要

aol_aog的专栏 500

Struts Velocity集成

关于作者 George Franciscus 是一位 Java 企业级顾问和 Struts 权威。他是 Manning 的 Struts Recipes 和 Struts in Action 两本书的合著者。George 通过 nexcel.ca 提供技术和管理咨询服务。 Struts Recipes 的合著者 George Franc...

weixin_30539835的博客 102

Struts Velocity集成

关于模板引擎在开始集成 StrutsVelocity 的简单任务之前,让我们先确保您理解模板引擎和它们在视图生成中的角色。模板引擎作为整体概念,Velocity 作为具体实现,它们的生命在 HTML 之外。Velocity 把数据合并到文本主体中不同的点上。文本可以是文字、电子邮件或 HTML。由于采用这种方式,Velocity 模板引擎有点儿像 Microsoft Word 的“邮件合

xdy3008的专栏 756

Velocity的介绍及struts的结合

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

dananhai381的专栏 252

完美替代jq-animate的Velocity.js的使用

前面的话  Velocity是一款优秀的JS动画库,完全可以作为jQuery的animate的替代品。需要动画功能时,使用Velocity是一个好选择。本文将详细介绍Velocity.js的使用 概述  Velocity是一个简单易用、高性能、功能丰富的轻量级JS动画库。它和jQuery的animate()有相同的API, 但它不依赖 jQuery,可单独使用。Velocity不仅包含了$.ani...

zuggs_的博客 2272

java struts如何将action替换成html或者do

java struts如何将action替换成html或者do

zebinluo的专栏 1299

velocity模板引擎学习(1)

菩提树下的杨过.Net 博客园 首页 博问 闪存 新随笔 订阅 管理 随笔-1066  文章-1  评论-2254  velocity模板引擎学习(1) velocityfreemaker、jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移

lwjshuai的专栏 1214

如果前端完全用html文件替代jsp文件,怎么从后端传递到html端,进行显示?如果让你去实现?

要求:前端只能用html,不能用jsp(当然也就不存在jsp的el表达式的方式,即使用$符号传参这种形式)。 场景:有个页面,是一个用户列表,列表中有30行用户。点击某一个用户的查看按钮,显示该用户的详情。 实现过程(最原始的方式): 1)点击查看按钮,触发一个http的url的request请求如http://127.0.0.1:8080/testProject/user/view?use

Ideality_hunter的专栏 8810

struts2.5.16新版本升级

这次struts2版本升级,也是因为要修复安全漏洞CVE-2018-1327。在旧版本升级新版本的过程中,遇到了不少问题,在这里记录一下。struts2.5.16版本下载链接:http://mirrors.hust.edu.cn/apache/struts/2.5.16/struts-2.5.16-all.zipjackson-dataformat-xml-2.1.2.jar下载链接:http:/...

a_c_c_a的专栏 8888

JSPVelocity的比较

JSP渲染机制: ServletContext根据path来找到对应的servlet,这个映射在mapper.map方法中完成。通过拓展名".jsp"来找到jspServlet对应的Warpper。接下来调用jspServlet的service方法。 JSP在执行渲染时会被编译成一个java类,而这个类实际上也是一个servlet。 上面代码中的类是JSP编译成java类的一个例子。

NerveMore 6545
上一篇: log4j配置详解
下一篇: session详解[转]
fuweibo
博客等级 码龄23年 36粉丝 68原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值