MyEclipse6Java开发中文教程 第十二章开发 Struts2+ Spring应用 第十二章开发Sus2+ Spring应用 121介绍 122下载 Struts2开发包 123开发第一个 Struts2应用 12688 1231准备工作 1232开发 Helloworld 1233使用国际化消息 1234基于POJO的Acon开发 1235自定义Acon方法和映射通配符 06908 1236表单处理一一登录例子 1237表单验证 1238给 Action注入参数( paran)值 1239配置属性和 struts. properties文件 124 Struts2整合 Spring 125实现文件上传下载 125.1文件下载 12511单个文件下载 12512下载中文文件 12513下载已存在的文件 1252文件上传 12521介绍和准备工作 12522单个文件上传例子 12523文件上传参数配置 12524上传多个文件 126访问 session, request等JSP对象 127小结 566633 128参考资料 本章将会简要介绍Ss2的基本开发以及和 Spring的整合应用开发。在笔者刚开始 编写本书的时候,并未计划介绍 Struts2的内容。然而在写作的过程中,有两件事打动了我, 使我下定决心将 Struts2的内容加进来。第一件事,是很多培训机构已经开始了 Struts2(或 者 WebWork)的课程,因此,有不少读者希望我能对这个框架做一些视频或者相关的介绍; 第二件事,乃是在我根据网上的 Struts2整合 Spring的文档进行练习的时候,很遗憾的发 现要么介绍不全,要么是已经过时的做法,甚至官方自带的英文文档也有直接写错的地方 总之花了2个小时才算把例子做出来,使我深深的感到对于初学者来说(对我来说, Struts 2也是最近两周才看的,所以也算是这方面的初学者了),看着文档却作不出例子来,那是 相当的痛苦啊。再加上 Struts2已经日益取得了广大程序员的支持和喜爱,因此我希望将我 并不算太深入的经验和大家分享一下,希望能对您的学习有所帮助。 本章并没有介绍 Struts2+ Spring+ Hibernate整合开发是因为: Spring整合了Web层框 刘长炯著
MyEclipse 6 Java 开发中文教程 1 刘长炯著 第十二章 开发 Struts 2 + Spring 应用 第十二章 开发Struts 2 + Spring应用 ................................................................................. 1 12.1 介绍................................................................................................................... 2 12.2 下载Struts 2 开发包 ........................................................................................... 6 12.3 开发第一个Struts 2 应用.................................................................................... 8 12.3.1 准备工作.................................................................................................. 8 12.3.2 开发HelloWorld ..................................................................................... 10 12.3.3 使用国际化消息..................................................................................... 16 12.3.4 基于POJO的Action开发 ........................................................................ 19 12.3.5 自定义Action方法和映射通配符............................................................. 20 12.3.6 表单处理――登录例子 .......................................................................... 26 12.3.7 表单验证................................................................................................ 31 12.3.8 给Action注入参数(param)值 ............................................................. 38 12.3.9 配置属性和struts.properties文件 ........................................................... 39 12.4 Struts 2 整合Spring........................................................................................... 39 12.5 实现文件上传下载 ........................................................................................... 45 12.5.1 文件下载................................................................................................ 45 12.5.1.1 单个文件下载 .............................................................................. 46 12.5.1.2 下载中文文件 .............................................................................. 48 12.5.1.3 下载已存在的文件 ....................................................................... 51 12.5.2 文件上传................................................................................................ 54 12.5.2.1 介绍和准备工作........................................................................... 54 12.5.2.2 单个文件上传例子 ....................................................................... 55 12.5.2.3 文件上传参数配置 ....................................................................... 63 12.5.2.4 上传多个文件 .............................................................................. 65 12.6 访问session,request等JSP对象.................................................................... 69 12.7 小结................................................................................................................. 73 12.8 参考资料.......................................................................................................... 73 本章将会简要介绍 Struts 2 的基本开发以及和 Spring 的整合应用开发。在笔者刚开始 编写本书的时候,并未计划介绍 Struts 2 的内容。然而在写作的过程中,有两件事打动了我, 使我下定决心将 Struts 2 的内容加进来。第一件事,是很多培训机构已经开始了 Struts 2(或 者 WebWork)的课程,因此,有不少读者希望我能对这个框架做一些视频或者相关的介绍; 第二件事,乃是在我根据网上的 Struts 2 整合 Spring 的文档进行练习的时候,很遗憾的发 现要么介绍不全,要么是已经过时的做法,甚至官方自带的英文文档也有直接写错的地方, 总之花了 2 个小时才算把例子做出来,使我深深的感到对于初学者来说(对我来说,Struts 2 也是最近两周才看的,所以也算是这方面的初学者了),看着文档却作不出例子来,那是 相当的痛苦啊。再加上 Struts 2 已经日益取得了广大程序员的支持和喜爱,因此我希望将我 并不算太深入的经验和大家分享一下,希望能对您的学习有所帮助。 本章并没有介绍 Struts2+Spring+Hibernate 整合开发是因为:Spring 整合了 Web 层框
MyEclipse6Jaa开发中文教程 架之后,剩下的就是 Spring整合 Hibernate还是JPA等其它框架,其过程是和web层框架 没有任何关系的。希望读者已经通过上两章的阅读了解这个概念,明白下面这个等式 Struts2+ Spring+ Hibernate/JPA其它框架=( Struts2+ Spring)+( Spring+ Hibernate/JPa其它框架)。因此在本章的基础上,再结合上一章的内容,您可以自然而然的 完成整合 Hibernate或者其它框架的过程 在本章我将会依次给大家简单介绍 Struts2,展示如何获取 Struts2的开发包, Struts2 软件包介绍,简单的 Helloworld的开发,以及基于POJO的 Helloworld开发,接着我们将 第九章的登录示例 Strutslogin Demo用Sts2改写,并加入验证机制和国际化消息,稍后 我们则介绍如何使用 Spring整合Sus2来通过 Spring设置属性,最后我们介绍文件上传 下载以及如何访问 session, request等JSP对象。 121介绍 在第九章开发Ss1X应用中我们已经简要介绍了Stu2和 Struts1之间的关系 WebWork(http://www.opensymphonv.com/webwork/)是一个历史很悠久的优秀的Web层 开发框架。根据一些资料我们了解到, Web Work1和 Struts1是很接近的设计思路,比较 紧耦合,这体现在它的控制器类必须继承自某些特定的类或者接口,需要单独的传值对象 FormBean,开发人员需要直接操纵 request, response和 session这些对象,页面的转向需 要通过特殊的对象来完成( Action Forward)。然而 WebWork2之后,它大胆引入了插件机 制,拦截器,依赖注入,以及POJO的开发模式,并对开发人员屏蔽底层的 request, response 等对象,页面的转向通过返回 String类型即可完成,便于单元测试,并抛弃了一代中的表单 Bean,让表单参数获取和Acon对象合二为一,从而和JSF一道处于第二代Web框架的级别 上(很遗憾的是 Spring MVc到现在为止也还是停留在 Struts1的模式上,除了OC和 Spring 紧密集成之外,无其它特色,这也是它为何至今未被人视为优秀的Web开发框架的原因之 )。 WebWork2花了很大功夫来简化程序员负担,首先就是框架尽量避免让开发人员来在 配置文件中编写不必要的内容,另外拦截器和oC的配套使用,也大大简化了传统的一些任 务例如文件上传。对于常见的动辄N兆的一堆库文件的不知该如何取舍的Web层框架来说 WebWork2的插件机制可以让你在核心类库的基础上按需装配,根据项目的需要来自由增 删类库文件这是和Spng内核差不多的做法吧)。那么第三代Web层框架,目前来说尚未 出现,据说尚末推出的JSF的20版本将会支持号称无配置文件,纯标注( Annotation), PoJo的开发模式,是否这就是第三代Web开发框架?根据文档,我发现 Struts2也正在进 行无配置文件+标注版本的开发工作,看来这的确是个趋势啊。纵观现有框架,配置文件繁 琐,要想用框架,必先XML十自定义标签库的确是个让人一直头疼不已的老毛病了(让人 想起来了东方不败的那句欲练神功,挥剑自X),一个框架一套配置文件和标签库,的确是 让开发人员苦不堪言。笔者从心底里希望Java的Web层框架能易用化,标准化(大家都用 样的接口和标签库),开发工具智能化(微软Ⅵ sual studio net那真不是盖的),开发人 员傻瓜化……不过这样一来工资是不是也下降,我可就不知道了。 后来 Struts和 WebWoκk进行合并,大家一起聚集在 Apache基金会这棵大树下,借着 Struts这个响当当的硬牌子,推出了 Struts2框架,大家不要误会,它仍然也是基于MVC 模式的开发框架,所有 WebWork2的优点它这里也有。据一些文档的说法认为 Struts2就 是 WebWork的部分包重命名,配置文件稍作改动得来的,经过检验目前来看也的确如此 不过因为Suts1和 WebWork2仍然有大量开发人员喜欢使用,所以并未消失,仍然在各 2 刘长炯著
MyEclipse 6 Java 开发中文教程 2 刘长炯著 架之后,剩下的就是 Spring 整合 Hibernate 还是 JPA 等其它框架,其过程是和 Web 层框架 没有任何关系的。希望读者已经通过上两章的阅读了解这个概念,明白下面这个等式: Struts2 + Spring + Hibernate/JPA/其它框架 = (Struts 2 + Spring)+(Spring + Hibernate/JPA/其它框架)。因此在本章的基础上,再结合上一章的内容,您可以自然而然的 完成整合 Hibernate 或者其它框架的过程。 在本章我将会依次给大家简单介绍 Struts 2,展示如何获取 Struts 2 的开发包,Struts 2 软件包介绍,简单的 HelloWorld 的开发,以及基于 POJO 的 HelloWorld 开发,接着我们将 第九章的登录示例 StrutsLoginDemo 用 Struts2 改写,并加入验证机制和国际化消息,稍后 我们则介绍如何使用 Spring 整合 Struts2 来通过 Spring 设置属性,最后我们介绍文件上传 下载以及如何访问 session,request 等 JSP 对象。 12.1 介绍 在第九章 开发 Struts 1.x 应用中我们已经简要介绍了Struts 2 和Struts 1 之间的关系。 WebWork(http://www.opensymphony.com/webwork/)是一个历史很悠久的优秀的Web层 开发框架。根据一些资料我们了解到,WebWork 1 和Struts 1 是很接近的设计思路,比较 紧耦合,这体现在它的控制器类必须继承自某些特定的类或者接口,需要单独的传值对象: FormBean,开发人员需要直接操纵request,response和session这些对象,页面的转向需 要通过特殊的对象来完成(ActionForward)。然而WebWork 2 之后,它大胆引入了插件机 制,拦截器,依赖注入,以及POJO的开发模式,并对开发人员屏蔽底层的request,response 等对象,页面的转向通过返回String类型即可完成,便于单元测试,并抛弃了一代中的表单 Bean,让表单参数获取和Action对象合二为一,从而和JSF一道处于第二代Web框架的级别 上(很遗憾的是Spring MVC到现在为止也还是停留在Struts 1 的模式上,除了IOC和Spring 紧密集成之外,无其它特色,这也是它为何至今未被人视为优秀的Web开发框架的原因之 一)。WebWork 2 花了很大功夫来简化程序员负担,首先就是框架尽量避免让开发人员来在 配置文件中编写不必要的内容,另外拦截器和IOC的配套使用,也大大简化了传统的一些任 务例如文件上传。对于常见的动辄N兆的一堆库文件的不知该如何取舍的Web层框架来说, WebWork 2 的插件机制可以让你在核心类库的基础上按需装配,根据项目的需要来自由增 删类库文件(这是和Spring内核差不多的做法吧)。那么第三代Web层框架,目前来说尚未 出现,据说尚未推出的JSF的 2.0 版本将会支持号称无配置文件,纯标注(Annotation), POJO的开发模式,是否这就是第三代Web开发框架?根据文档,我发现Struts 2 也正在进 行无配置文件+标注版本的开发工作,看来这的确是个趋势啊。纵观现有框架,配置文件繁 琐,要想用框架,必先XML+自定义标签库的确是个让人一直头疼不已的老毛病了(让人 想起来了东方不败的那句欲练神功,挥剑自X),一个框架一套配置文件和标签库,的确是 让开发人员苦不堪言。笔者从心底里希望Java的Web层框架能易用化,标准化(大家都用 一样的接口和标签库),开发工具智能化(微软Visual Studio .NET 那真不是盖的),开发人 员傻瓜化……不过这样一来工资是不是也下降,我可就不知道了。 后来 Struts 和 WebWork 进行合并,大家一起聚集在 Apache 基金会这棵大树下,借着 Struts 这个响当当的硬牌子,推出了 Struts 2 框架,大家不要误会,它仍然也是基于 MVC 模式的开发框架,所有 WebWork 2 的优点它这里也有。据一些文档的说法认为 Struts 2 就 是 WebWork 的部分包重命名,配置文件稍作改动得来的,经过检验目前来看也的确如此。 不过因为 Struts 1 和 WebWork 2 仍然有大量开发人员喜欢使用,所以并未消失,仍然在各
MyEclipse6Java开发中文教程 自的支持者下继续发展着。除了传统的例如流程跳转,国际化消息等等之外, Struts2还支 持AJAX等的开发(目前是基于DoJO框架的实现),多种表示层框架(不仅仅局限于JsP 页面展示),以及插件机制,已经发展成了一个全面的Web层框架 注意:Stts2和 Struts1的代码并不兼容,包括包文件和配置文件都不一样, Struts1 的程序必须加以修改才能运行于 Struts2之下,可以认为它们是两个不同的框架 以下是其官方网站的特性介绍: 开发? o容易上手-从教程和模版程序或者 Maven原型可以很容易的开发出新项 日 改进的设计一清晰的代码设计对应着独立于HTTP的框架接口 o增强的标签(Tag)-使用样式表驱动的表单标签以及所提供的标签可以减 少编码量。 有状态的复选框( Checkbox)-避免了特殊的处理代码,智能复选框能感 知自己的状态何时被切换 。灵活的取消按钮-取消时直接转向另一个操作( action) 最好的AJAX支持一通过使用和标准 Struts标签观感一致的AJAX标签, 可以增加交互性和灵活性 o方便的 Spring集成-使用 Spring向 Action中注入依赖关系,无需编写 额外的连接代码或者其它配置。(同时支持 Plexus?) 增强的表示层展示-可以将处理结果以 JasperReports, JFreechart Action链,或者文件下载的方式展示 PoJo表单一不需要 Action Form!可以使用任何 Javabean来捕获输入 或者直接将属性设置到 Action类上。可以同时使用二进制和字符串类型的 POJO Action-使用任何类作为 Action类-甚至接口也是可选的 发有 o方便的插件机制-添加JAR文件即可添加框架扩展。无需人工配置!捆绑 的插件提供对 JavaServer Faces, JasperReports, JFree Chart,Tles.等 众多框架的支持。 内置调优一查看 Struts2内部,找到死循环的位置! 准确的错误汇报一直接跳转到错误的位置和行号 维护 便于测试的 Action-可以直接测试Sts2 Action,无虚依赖任何模拟的 HTTP对象。 聪明的默认值-跳过明显的或者多余的设置。大多数框架的配置元素都有 默认值可以使用,我们可以忘记它。只需要配置一次! 容易自定义的控制器一需要时可以自定义每个 Action的请求处理。 Struts2 可以用你需要的方式来工作 o内置调试一使用内置调试器可以生成问题报告。 易于调整的标签一修改 Free Marker模版即可自定义标签。不需要再学习 taglib AP!完全支持 JSP Free Marker,以及 Velocity标签。 Sus2框架采用的许可是 Apache License, Version20,可以通过访问这个地址阅读 htto/ ww.apache. org/icenses/LICENSE-20。当然是可以免费用于我们自己的商业软件 的。它的标志图(Logo)如下所示 刘长炯著
MyEclipse 6 Java 开发中文教程 3 刘长炯著 自的支持者下继续发展着。除了传统的例如流程跳转,国际化消息等等之外,Struts 2 还支 持 AJAX 等的开发(目前是基于 DOJO 框架的实现),多种表示层框架(不仅仅局限于 JSP 页面展示),以及插件机制,已经发展成了一个全面的 Web 层框架。 注意:Struts 2 和 Struts 1 的代码并不兼容,包括包文件和配置文件都不一样,Struts 1 的程序必须加以修改才能运行于 Struts 2 之下,可以认为它们是两个不同的框架! 以下是其官方网站的特性介绍: • 开发! o 容易上手 – 从教程和模版程序或者 Maven 原型可以很容易的开发出新项 目。 o 改进的设计 – 清晰的代码设计对应着独立于 HTTP 的框架接口。 o 增强的标签(Tag) - 使用样式表驱动的表单标签以及所提供的标签可以减 少编码量。 o 有状态的复选框(Checkbox) - 避免了特殊的处理代码,智能复选框能感 知自己的状态何时被切换。 o 灵活的取消按钮 – 取消时直接转向另一个操作(action)。 o 最好的AJAX 支持 – 通过使用和标准Struts标签观感一致的 AJAX 标签, 可以增加交互性和灵活性。 o 方便的 Spring 集成 – 使用 Spring 向 Action 中注入依赖关系,无需编写 额外的连接代码或者其它配置 。(同时支持 Plexus?) o 增强的表示层展示 – 可以将处理结果以 JasperReports, JFreeChart, Action 链, 或者文件下载的方式展示。 o POJO 表单 – 不需要 ActionForm! 可以使用任何 JavaBean 来捕获输入 或者直接将属性设置到 Action 类上。可以同时使用二进制和字符串类型的 属性! o POJO Action – 使用任何类作为 Action 类 – 甚至接口也是可选的! • 发布! o 方便的插件机制 – 添加 JAR 文件即可添加框架扩展。无需人工配置!捆绑 的插件提供对 JavaServer Faces, JasperReports, JFreeChart, Tiles... ...等 众多框架的支持。 o 内置调优 – 查看 Struts2 内部,找到死循环的位置! o 准确的错误汇报 – 直接跳转到错误的位置和行号。 • 维护! o 便于测试的 Action – 可以直接测试 Struts2 Action,无虚依赖任何模拟的 HTTP 对象。 o 聪明的默认值 – 跳过明显的或者多余的设置。大多数框架的配置元素都有 默认值可以使用,我们可以忘记它。只需要配置一次! o 容易自定义的控制器 – 需要时可以自定义每个 Action 的请求处理。Struts2 可以用你需要的方式来工作! o 内置调试 – 使用内置调试器可以生成问题报告。 o 易于调整的标签 – 修改 FreeMarker 模版即可自定义标签。不需要再学习 taglib API! 完全支持 JSP, FreeMarker, 以及 Velocity 标签。 Struts 2 框架采用的许可是Apache License, Version 2.0,可以通过访问这个地址阅读: http://www.apache.org/licenses/LICENSE-2.0。当然是可以免费用于我们自己的商业软件 的。它的标志图(Logo)如下所示:
MyEclipse6Java开发中文教程 Struts 运行Sus2需要下列的条件: Servlet aP24, JSP AP120,Java5(或者使用连4 版本,运行于JDK14)。当然换句话说用 Tomcat5或者更高版本就没有任何问题了 Struts2的执行流程大致如此所示:Web服务器启动解析 struts xml,初始化消息文件, ction路径映射等资源,初始化框架→用户请求 XXX. action→Suts2过滤器使用对象工 厂( Object Factory,可以是自带或者是 Spring)创建 Action类的示例→执行loC和拦截器 (包括解析表单参数,文件上传,将解析结果注入 Action对象)→调用 Action中用户编 写的业务方法→根据返回的结果(Resu)路径转向视图层→视图层进行显示(包括调用标 签库等)。 关于其底层结构,从网上搜集到的一些资料认为: WebWork2,实际上是 Webwork+ XWok的总集, Webwork1x版本中,整个框架采用了紧耦合的设计(类似 Struts1x), 而 WebWork20之后, Webwork被拆分为两个部分,即 Webwork2x+XWok2x。当 个请求发起后,从请求的路径名中解析出对应的 Action名称,然后 Webwork2x框架会 遍历 Http Servletrequest、 Http Session、 Servletcontext中的数据,并将其复制到内部的 MpD实现中,至此之后,所有数据操作均在此Map结构中进行,从而将内部数据结构与 Servlet aP|相分离。至此, Webwork的工作阶段结束,数据将传递给XWk进行下一步 处理。从这里也可以看到 Webwork和Ⅹok之间的切分点, Webwork为XWok提供 了一个面向 Servlet的协议转换器,将 Servlet相关的数据转构转换成 WOrk所需要的通 用数据格式,而 WOrk将完成实际的服务调度和功能实现。这样一来,以XWok为核心 只需替换外围的协议转换组件,即可实现不同技术平台之间的切换。那么 Struts2呢,就是 这样一个 Struts2核心平台+ WOrk的实现,其中的 WOrk部分执行和 Servlet AP无关的 流程处理,而Stts2的核心层则提供将 Servlet层提供的数据进行独立封装的过程,进而 XWok基于这些数据进行操作,这样就实现了一个完整的开发框架。XWok相当于一个插 件一样和现有框架组合,构成一个完整的流程处理+ Servlet操纵框架。所以大家会奇怪的 看到Sus2一共有两个核心jar文件: struts2core-20.11ar和 work-204ja,而且更 让人奇怪的是前一个文件中的包定义是 org. apache struts2,而后一个文件中的则是 com.opensymphony. work2,其原因就在于此。本段所介绍的内容仅供提供更多信息之用, 笔者不保证任何准确性和有效性。⑧ 为了便于读者了解相关内容,我把搜集到的一篇关于 Struts1和2的短文列在这里(来 源见本章结尾参考资料) 特性比较 Action类 Struts1x要求Acon类要扩展自一个抽象基类。 Struts1x的一个共有的问题是面向抽象类编程而不是面向 接口编程 Struts2的Acon类实现了一个 Action接口,连同其他接口一起来实现可选择和自定义的服务。 Struts2提 供一个名叫 Action Support的基类来实现一般使用的接口。当然, Action接口不是必须的。任何使用 execute 方法的POJO对象可以被当作 Struts2的 Action对象来使用 线程模型 Struts1 X Action类是单例类,因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制,并且 给开发带来了额外的烦恼。 Action资源必须是线程安全或者同步的 Struts2 Action对象为每一个请求都实例化对象,所以没有线程安全的问题。(实践中, servlet容器给每 刘长炯著
MyEclipse 6 Java 开发中文教程 4 刘长炯著 运行 Struts 2 需要下列的条件:Servlet API 2.4,JSP API 2.0,Java 5(或者使用 j4 版本,运行于 JDK1.4)。当然换句话说用 Tomcat 5 或者更高版本就没有任何问题了。 Struts 2 的执行流程大致如此所示:Web 服务器启动解析 struts.xml,初始化消息文件, Action 路径映射等资源,初始化框架→用户请求 XXX.action →Struts 2 过滤器使用对象工 厂(Object Factory,可以是自带或者是 Spring)创建 Action 类的示例 →执行 IOC 和拦截器 (包括解析表单参数,文件上传,将解析结果注入 Action 对象) →调用 Action 中用户编 写的业务方法 →根据返回的结果(Result)路径转向视图层 →视图层进行显示(包括调用标 签库等)。 关于其底层结构,从网上搜集到的一些资料认为:WebWork 2,实际上是 Webwork + XWork 的总集,Webwork1.x 版本中,整个框架采用了紧耦合的设计(类似 Struts 1.x), 而 WebWork 2.0 之后,Webwork 被拆分为两个部分,即 Webwork 2.x +XWork 2.x。当 一个请求发起后,从请求的路径名中解析出对应的 Action 名称,然后 Webwork 2.x 框架会 遍历 HttpServletRequest、HttpSession、ServletContext 中的数据,并将其复制到内部的 Map 实现中,至此之后,所有数据操作均在此 Map 结构中进行,从而将内部数据结构与 Servlet API 相分离。至此,Webwork 的工作阶段结束,数据将传递给 XWork 进行下一步 处理。从这里也可以看到 Webwork 和 XWork 之间的切分点,Webwork 为 XWork 提供 了一个面向 Servlet 的协议转换器,将 Servlet 相关的数据转构转换成 XWork 所需要的通 用数据格式,而 XWork 将完成实际的服务调度和功能实现。这样一来,以 XWork 为核心, 只需替换外围的协议转换组件,即可实现不同技术平台之间的切换。那么 Struts 2 呢,就是 这样一个 Struts 2 核心平台+XWork 的实现,其中的 XWork 部分执行和 Servlet API 无关的 流程处理,而 Struts 2 的核心层则提供将 Servlet 层提供的数据进行独立封装的过程,进而 XWork 基于这些数据进行操作,这样就实现了一个完整的开发框架。XWork 相当于一个插 件一样和现有框架组合,构成一个完整的流程处理+Servlet 操纵框架。所以大家会奇怪的 看到 Struts 2 一共有两个核心 jar 文件:struts2-core-2.0.11.jar 和 xwork-2.0.4.jar,而且更 让人奇怪的是前一个文件中的包定义是 org.apache.struts2,而后一个文件中的则是 com.opensymphony.xwork2,其原因就在于此。本段所介绍的内容仅供提供更多信息之用, 笔者不保证任何准确性和有效性。☺ 为了便于读者了解相关内容,我把搜集到的一篇关于 Struts1 和 2 的短文列在这里(来 源见本章结尾参考资料): 特性比较: Action 类 Struts1.x 要求 Action 类要扩展自一个抽象基类。Struts1.x 的一个共有的问题是面向抽象类编程而不是面向 接口编程。 Struts2 的 Action 类实现了一个 Action 接口,连同其他接口一起来实现可选择和自定义的服务。Struts2 提 供一个名叫 ActionSupport 的基类来实现一般使用的接口。当然,Action 接口不是必须的。任何使用 execute 方法的 POJO 对象可以被当作 Struts 2 的 Action 对象来使用。 线程模型 Struts1.x Action 类是单例类,因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制,并且 给开发带来了额外的烦恼。Action 资源必须是线程安全或者同步的。 Struts2 Action 对象为每一个请求都实例化对象,所以没有线程安全的问题。(实践中,servlet 容器给每一
MyEclipse6Java开发中文教程 个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题)。 Servlet依赖 Struts1x的 Action类依赖于 Servlet APl,当 Action被调用时 HttpservletreQuest和 Http Servletresponse作为参数传给 execute方法。 Suts2的Acon和容器无关。 Servlet上下文被表现为简单的Maps,允许 Action被独立的测试。 Struts 的 Action可以访问最初的请求(如果需要的话)。但是,尽可能避免或排除其他元素直接访问 Http Servletrequest Ex Http servletResp 易测性 测试 Struts1X的主要问题是 execute方法暴露了 Servlet APl这使得测试要依赖于容器)。第三方的扩展, 如 Struts Testcase,提供了一套 Struts1的模拟对象(来进行测试)。 Struts2的 Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单 捕获输入 Struts1x使用 Action Form对象来捕获输入。象 Action一样,所有的 Action Form必须扩展基类。因为其他 的 Java Bean不能作为 Action Form使用,开发者经常创建多余的类来捕获输入。 DynaBeans可以被用来 作为替代 Action Form的类来创建。但是,开发者可能是在重新描述(创建)已经存在的 Java Bean(仍然会 导致有冗余的 javabean)。 Struts2直接使用 Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子) 属性的rich对象类型。 Action属性能够通过web页面上的 taglibs访问。 Struts2也支持 Action Form模式 rich对象类型,包括业务对象,能够用作输入输出对象。这种 ModelDriven特性简化了 taglib对POJO输 入对象的引用。 表达式语言 Struts1x整合JsTL,所以它使用JsTL的表达式语言。表达式语言有基本的图形对象移动,但是对集合和 索引属性的支持很弱。 Suts2使用JSTL,但是也支持一个更强大和灵活的表达式语言—-" Object Graph Notation Language 将值绑定到页面 Stus1x使用标准JSP机制来绑定对象到页面上下文 suts2使用" Value stacκ"技术,使 taglib能够访问值而不需要把你的页面(vew)和对象绑定起来 Value Stack策略允许通过一系列名称相同但类型不同的属性重用页面(vew) 类型转换 Struts1x的 Action Form属性经常都是 String。 Struts1x使用 Commons-Beanutils来进行类型转换。转换 每一个类,而不是为每一个实例配置。 Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。 验证 Struts1X支持在 Action Form的 validate方法中手动校验,或者通过 Commons validator的扩展来校验。 同一个类可以有不同的校验内容,但不能校验子对象 Struts2支持通过 validate方法和Xwok校验框架来进行校验。ⅪWork校验框架使用为属性类类型定义的 刘长炯著
MyEclipse 6 Java 开发中文教程 5 刘长炯著 个请求产生许多丟弃的对象,并且不会导致性能和垃圾回收问题)。 Servlet 依赖 Struts1.x 的 Action 类依赖于 Servlet API , 当 Action 被调用时,以 HttpServletRequest 和 HttpServletResponse 作为参数传给 execute 方法。 Struts2 的 Action 和容器无关。Servlet 上下文被表现为简单的 Maps,允许 Action 被独立的测试。Struts2 的 Action 可以访问最初的请求(如果需要的话)。但是,尽可能避免或排除其他元素直接访问 HttpServletRequest 或 HttpServletResponse。 易测性 测试 Struts1.x 的主要问题是 execute 方法暴露了 Servlet API 这使得测试要依赖于容器)。第三方的扩展, 如 Struts TestCase,提供了一套 Struts1 的模拟对象(来进行测试)。 Struts2 的 Action 可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单。 捕获输入 Struts1.x 使用 ActionForm 对象来捕获输入。象 Action 一样,所有的 ActionForm 必须扩展基类。因为其他 的 JavaBean 不能作为 ActionForm 使用,开发者经常创建多余的类来捕获输入。DynaBeans 可以被用来 作为替代 ActionForm 的类来创建。但是,开发者可能是在重新描述(创建)已经存在的 JavaBean(仍然会 导致有冗余的 javabean)。 Struts2 直接使用 Action 属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子) 属性的 rich 对象类型。Action 属性能够通过 web 页面上的 taglibs 访问。Struts2 也支持 ActionForm 模式。 rich 对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了 taglib 对 POJO 输 入对象的引用。 表达式语言 Struts1.x 整合 JSTL,所以它使用 JSTL 的表达式语言。表达式语言有基本的图形对象移动,但是对集合和 索引属性的支持很弱。 Struts2 使用 JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL)。 将值绑定到页面 Struts1.x 使用标准 JSP 机制来绑定对象到页面上下文。 Struts2 使用“ValueStack”技术,使 taglib 能够访问值而不需要把你的页面(view)和对象绑定起来。 ValueStack 策略允许通过一系列名称相同但类型不同的属性重用页面(view)。 类型转换 Struts1.x 的 ActionForm 属性经常都是 String。Struts 1.x 使用 Commons-Beanutils 来进行类型转换。转换 每一个类,而不是为每一个实例配置。 Struts2 使用 OGNL 进行类型转换。提供基本和常用对象的转换器。 验证 Struts1.x 支持在 ActionForm 的 validate 方法中手动校验,或者通过 Commons Validator 的扩展来校验。 同一个类可以有不同的校验内容,但不能校验子对象。 Struts2 支持通过 validate 方法和 XWork 校验框架来进行校验。XWork 校验框架使用为属性类类型定义的