Struts1和Struts2的区别

Struts1的工作原理是Web程序启动的时,候会加载ActionServlet,然后ActionServlet会读取struts-config.xm配置文件中的配置信息,把配置信息存放到配置对象中

ActionServlet接到请求执行一下流程

检索ActionMapping实例,如果不存在就返回无效路径错误

如果ActionForm实例不存在,就创建一个ActionForm对象,把客户端表单提交的数据封装到ActionForm中

根据配置信息检查是否需要表单验证,如果需要就调用ActionForm中的validate()方法,如果validate方法返回null或者并不包含ActionMessage中的ActionError对象,就表示验证成功。

ActionServlet根据ActionMapping所包含的的映射信息将请求发个对应的Action,如果action不存在就创建action,然后调用action中的execute()方法进行处理

action的execute方法返回一个ActionFord对象,ActionServlet会把客户端发送的请求转发给ActionFord对象的jsp页面

 

Struts2的核心是xwork,同时吸收了struts1的优点

当客户端发送请求时,会首先经过图中的几个过滤器然后到达FilterDispatcher

过滤去FilterDispatcher是struts2的心脏,在web容器启动的时候会自动加载配置文件中的参数,并转换成相应的类如ConfigurationManager、ActionMapper和ObjectFactory

ConfigurationManager存有一些配置文件的基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象都是通过ObjectFactory来创建的。过滤器会通过查询ActionMapper类来查找请求中所需要的Action

如果找到Action,过滤器会把请求交给ActionProxy(代理对象),ActionProxy通过ConfigurationManager配置找到对象的action类

ActionProxy创建一个ActionInvocation实例,Actioninvocation初始化时根据配置加载action所有相关的Interceptor。

Actioninvocation初始化时根据配置加载Action相关所有的Interceptor,通过ActionInvocation.invoke方法调用Action实现时执行Interceptor。在调用Action的过程前后,涉及到相关拦截器的调用

action执行完毕之后,Actioninvocation会找到struts.xml中配置的返回结果然后返回。

 

 

Struts1和Struts2的区别,从工作原理上可以看出两者有很大的不同。

下面参考:http://www.blogjava.net/314508313/archive/2011/11/17/364038.html

1.在Action方面对比:Struts1的action继承了抽象基类,struts1的问题是试用抽象类而不是借口编程。Struts2可以实现一个Action借口也可以实现其他接口。Struts2提供一个ActinSupport基类去实现常用的接口。

2.线程方面对比:Struts1 Action是单例模式必须是线程安全的,因为仅有一个Action实例处理请求,这就限制了action能做的事情,开发的时候也需要小心Action资源必须是线程安全的或者同步的,Struts2 Action为每一个请求产生一个实例,因此没有线程安全问题。

3.Servlet依赖方面:Struts2的action依赖于Servlet的API,因为action中的execute方法中有HttpServletRequest和HttpServletResponse。Struts2的action不在依赖于Servlet,因此可以脱离web容器运行,降低了测试action的难度。

4.封装请求参数的对比:Struts1使用ActionForm封装请求参数,所有的ActionForm必须统一继承基类ActionForm,普通的JavaBean不能用作ActionForm,因此开发这要创建很多ActionForm,Struts2直接可以用Action中的属性来封装用户请求的参数,可以创建一个基本pojo类来封装请求的参数,然后在action中定义就行了。

5.表达语言方面:Struts1整合了JSTL表达式,Struts2可以使用JSTL也整合了更强大的表达式语言OGNL。

6.绑定视图对比:struts1使用标准的jsp显示,Struts2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。可以和多种显示整合。

7.类型转换对比:Struts 1 ActionForm 属性通常都是String类型。Struts 1使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。

8.Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。

9.Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。

10.Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。

11.Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

 

 

posted @ 2014-02-10 11:10  胖hu  阅读(1517)  评论(0编辑  收藏  举报