没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
struts1
与
struts2
的区别
Struts 作为 MVC 2 的 Web 框架,自推出以来不断受到开发者的追捧,得到广
泛的应用。作为最成功的 Web 框架,Struts 自然拥有众多的优点:MVC 2 模
型的使用、功能齐全的标签库(Tag Library)、开放源代码。但是,正所谓
“没有最好,只有更好”,Struts1.x 自身也有不少的缺点:需要编写的代码过多,
容易引起“类爆炸”、单元测试困难。这些缺点随着 Web 的发展越来越明显。这
就促生了 Struts 2,它的诞生能很好的解决上述问题。在本文中,笔者将对
Struts2 和 Struts1.x 这两种框架进行详细的比较。比较将涉及到这两种框架
的 Action、验证、类型转换及如何开发等方面的内容。希望通过这样的比较,
让读者了解这两种框架各自的特点,以便于在自己的项目中,根据实际情况,
尽快的过渡到 Struts2 的时代。本文的内容基于 Struts2.0.6。一、 引言
Struts 的第一个版本是在 2001 年 5 月份发布的。它的最初设想是通过结合
JSP 和 Servlet,使 Web 应用的视图和业务/应用逻辑得以清晰地分离开来。在
Struts 之前,最常见的做法是在 JSP 中加入业务和应用逻辑,或者在 Servlet
中通过 println()来生成视图。自从第一版发布以来,Struts 实际上已成为业界
公认的 Web 应用标准。它的炙手可热也为自己带来了改进和变更,所以不但
要跟上对 Web 应用框架不断变化的需求,而且要与日渐增多竞争激烈的众多
框架的特性相融合。到最后,产生了几个下一代 Struts 的解决方案。其中两个
最受瞩目的方案是 Shale 和 Struts Ti。Shale 是一个基于构件的框架,并在最
近成为 Apache 的顶级项目。而 Struts Ti 则是在 Struts 的成功经验基础上继
续坚持对前端控制器(Front Controller)和 MVC(model-view-
controller)模式进行改进。WebWork 项目是在 2002 年 3 月发布的,它对
Struts 式框架进行了革命性改进,引进了不少新的思想、概念和功能,但和原
Struts 代码并不兼容。WebWork 是一个成熟的框架,经过了好几次重大的改
进与发布。在 2005 年 12 月,WebWork 与 Struts Ti 宣布合并。与此同时,
Struts Ti 改名为 Struts Action Framework 2.0,成为 Struts 真正的继承者。
最后要注意的是,并不是说 Struts 或 WebWork 项目已经停止开发了。由于
人们对这两个项目的兴趣仍然很高,而且也有很多开发者仍然愿意使用它们,
因此这两个项目还在继续开发中,继续修复 Bug,改进功能和继续添加新功能。
二、 Action 的区别对于有着丰富的 Struts1.x 开发经验的朋友来说,都十分的
清楚 Action 是整个 Struts 框架的核心内容,当然 Struts2 也不例外。不过,
Struts1.x 与 Struts2 的 Action 模型很大的区别。Struts2 和 Struts1.x 的差
别,最明显的 就是 Struts2 是一个 pull-MVC 架构。这是什么意思呢?从开发
者角度看,就是说需要显示给用户的数据可以直接从 Action 中获取,而不像
Struts1.x 那样,必须把相应的 Bean 存到 Page、Request 或者 Session 中
才能获取。Struts1.x 必须继承 org.apache.struts.action.Action 或者其子
类,表单数据封装在 FormBean 中。Struts 2 无须继承任何类型或实现任何
接口,表单数据包含在 Action 中,通过 Getter 和 Setter 获取(如下面的
ActionForStruts2 的代码示例)。
虽然,在理论上 Struts2 的 Action 无须实现任何接口或者是继承任何的类,但
是,在实际编程过程中,为了更加方便的实现 Action,大多数情况下都会继承
com.opensymphony.xwork2.ActionSupport 类,并且重载(Override)
此类里的 String execute()方法。
首先,从 ActionForStruts2 可以看出,返回的对象不是 ActionForward,而
是 String。如果你不喜欢以字符串的形式出现在你的代码中,有个 Helper 接
口 Action 可以以常量方式提供常见结果,如
“success”、“none”、“error”、“input”和“login”。另外,按照惯例,在
Struts1.x 中只有“execute”方法能调用 Action, 但在 Struts2 中并非必要,任
何声明为 public String methodName() 方法,都能通过配置来调用
Action。最后,和 Struts1.x 最大的革命性的不同是,Struts2 处理 Action 过
程中调用的方法(“execute”方法)是不带参数的。那如何获取所需要的对象
呢?答案是使用 IoC(反转控制,Inversion of Control),也叫“依赖注入
(Dependency Injection)”的模式(想更多地了解这方面信息请看 Martin
Fowler 的文章 http://www.martinfowler.com/articles/injection.html)。
Spring 框架使得这个模式流行起来,然而 Struts2 的前身(WebWork)也同
时应用上了这个模式。
三、 IoCIoC(Inversion of Control,以下译为控制反转),随着 Java 社区
中轻量级容器(Lightweight Contianer)的推广而越来越为大家耳熟能详。
在此,无需再多费唇舌来解释“什么是控制反转”和“为什么需要控制反转”。因为
互联网上已经有非常多的文章对诸如此类的问题作了精彩而准确的回答。读者
可以去读一下 Rod Johnson 和 Juergen Hoeller 合著的《Expert one-on-
one J2EE Development without EJB》或 Martin Fowler 所写的
《Inversion of Control Containers and the Dependency Injection
pattern》。
众所周知,Struts2 是以 Webwork 2 作为基础发展出来。而在 Webwork 2.2
之前的 Webwork 版本,其自身有一套控制反转的实现,Webwork 2.2 在
Spring 框架的如火如荼发展的背景下,决定放弃控制反转功能的开发,转由
Spring 实现。值得一提的是,Spring 确实是一个值得学习的框架,因为有越
来越多的开源组件(如 iBATIS 等)都放弃与 Spring 重叠的功能的开发。因此,
Struts2 推荐大家通过 Spring 实现控制反转。
为了更好地了解反转控制,下面来看一个例子,如何利用 IoC 在 Action 处理过
程中可以访问到当前请求 HttpServerRequest 对象。
在例子中,使用的依赖注入机制是接口注入。就如其名称一样,接口注入需要
的是已经被实现了的接口。这个接口包含了相应属性的 setter,为 Action 提
供值。例子中使用了 ServletRequestAware 接口,如下:public interface
ServletRequestAware {
>>> public void setServletRequest(HttpServletRequest request);
}当继承这个接口后,原本简单的 Action 看起来有点复杂了,但是这时可以获
取 HttpServerRequest 对象来使用了。
public class IoCForStruts2 implements ServletRequestAware {
>> private HttpServletRequest request;
>> public void setServletRequest(HttpServletRequest request) {
>>>>>>> this.request = request;
>> }
>> public String execute() throws Exception {
>>>>>>> // 可以开始使用 request 对象进行工作了
>>>>>>> return Action.SUCCESS;
>> }
}
看起来现在这些属性是类级别的,并不是线程安全的,会出现问题。其实在
Struts2 里并没有问题,因为每个请求过来的时候都会产生一个新的 Action 对
象实例,它并没有和其他请求共享一个对象,所以不需要考虑线程安全问题。
拦截器 Interceptor(以下译为拦截器),在 AOP(Aspect-Oriented
Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前
或之后加入某些操作。拦截是 AOP 的一种实现策略。
在 Webwork 的中文文档的解释为——拦截器是动态拦截 Action 调用的对象。
它提供了一种机制可以使开发者定义在一个 action 执行的前后执行的代码,也
可以在一个 action 执行前阻止其执行。同时也提供了一种可以提取 action 中
可重用的部分的方式。
Struts1.x 的标准框架中不提供任何形式的拦截器,虽一个名为 SAIF 的附加项
目则实现了这样的功能,但它的适用的范围还很有限。
拦截器是 Struts2 的一个强有力的工具,有许多功能(feature)都是构建于
它之上,如国际化、转换器,校验等。谈到拦截器,还有一个流行的词——拦
截器链(Interceptor Chain,在 Struts2 中称为拦截器栈 Interceptor
Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截
的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
Struts 2 的拦截器实现相对比较简单。当请求到达 Struts2 的
ServletDispatcher 时,Struts 2 会查找配置文件,并根据其配置实例化相对
的拦截器对象,然后串成一个列表(list),最后一一地调用列表中的拦截器,
Struts 2 已经提供丰富多样功能齐全的拦截器实现。读者可以到 struts2-all-
2.0.6.jar 或 struts2-core-2.0.6.jar 包的 struts-default.xml 查看关于默认
的拦截器与拦截器链的配置。作为“框架(framework)”,可扩展性是不可缺
少的,因为世上没有放之四海而皆准的东西。虽然,Struts 2 为我们提供如此
丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰
相反,在 Struts 2 自定义拦截器是相当容易的一件事。
前面已经简要介绍了 Struts2 的起源,并详细对比了 Struts2 和 Struts1.x 的
差异,读者应该对 Struts2 的基础有所了解了——包括高层的框架概念和基础
的请求流程,并理解 Struts1.x 和 Struts2 两者之间在 Action 方面的差别,
Struts2 加强了对拦截器与 IoC 的支持,而在 Struts1.x 中,这些特性是很难
想象的。
同时,读者应该明白: Struts2 是 WebWork 的升级,而不是 Struts 1.x 的升
级。虽然 Struts 2 提供了与 Struts1.x 的兼容,但已经不是 Struts1.x 的升级。
剩余14页未读,继续阅读
zhengwh510
- 粉丝: 64
- 资源: 1981
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0