Struts与Struts2的区别(简单详细)

来源:互联网 发布:泰格软件安装 编辑:程序博客网 时间:2024/05/17 00:05

从发展来看Struts2继承了Struts与WebWork的MVC框架,Struts2取两者之精华,形成新的框架,但是struts2还是更多的继承了struts的设计思想,并加入了WebWork的优点。

MVC简介
1)Model:JavaBean、EJB的EntityBean
2)View:JSP、Struts的TagLib
3)Controller:Struts的ActionServlet、Action
概括起来MVC的优点主要有一下方面:
1)多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护
2)模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如,使用JSP页面、Velocity模板或者直接产生Excel文档等
3)应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性
4)控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念
5)MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码
对于MVC的概念性的东西也就废话到此,其关键的地方就是各个模块的实现技术分别是什么

简单来说二者的区别是
一个是Stuts ,一个是Stuts2,这是最大的区别,技术方面:
Stuts有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强;
而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个action,用起来比较方便,但是因为请求之前的拦截器有一些注入的操作,速度相对Stuts1来说慢一点。

Struts2简介
Struts2既然是从Struts发展而来,为什么Struts2不沿用Struts的设计思想,毕竟Struts在目前的企业应用中还是有非常大的市场在的。
那么,来看下Struts的一些缺点吧
1)支持的表现层技术单一
2)与Servlet API严重耦合,这点可以从Action的Execute的方法声明里面就可以看的出来
3)代码依赖Struts1 API,有侵入性,这点可以从写Action类和FormBean的时候看的出来,Action必须实现Struts的Action类

  而Struts2之所以以WebWork的设计思想为其核心,再就是WebWork没有Struts上面的那些缺点,更符合MVC的设计思想,也更利于代码的复用。    基于以上介绍可以看的出,Struts2体系结构与Struts的体系结构有很大的差别,Struts是使用ActionServlet做为其中心处理器,Struts2则使用一个拦截器(FilterDispatcher)做为其中心处理器,这样做的一个好处就是将Action类和Servlet API进行了分离。

Struts2的简单处理流程如下:
1)浏览器发送请求
2)中心处理器根据struts.xml文件查找对应的处理请求的Action类
3)WebWork的拦截器链自动对请求应用通用功能,例如:WorkFlow、Validation等功能
4)如果Struts.xml文件中配置Method参数,则调用Method参数对应的Action类中的Method方法,否则调用通用的Execute方法来处理用户请求
5)将Action类中的对应方法返回的结果响应给浏览器

Struts2与struts的不同主要体现在以下几个方面:

Action类
在struts中都是使用抽象类编程而不是接口,因此他要求开发Action类继承一个抽象的基类,如DispatchAction等。
Struts2则基于接口编程,我们的Action类可以实现一个Action接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。更加强大的是,在struts2中Action接口不是必需的,任何有execute()函数的pojo对象都可以用作struts2的Action类来使用。

线程模式
struts的Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单列策略限制了struts Action能做的事,并且要在开发时特别小心,Action资源必须是线程安全的或同步的;
struts2的Action对象为每一个请求产生一个实例,因此没有线程安全问题。

Servlet依赖
struts的Action依赖于Servlet API,当一个Action被调用时,HttpServletRequest和HttpServletResponse被传递给执行方法,例如:

public ActionForward execute(Actionmapping apping,ActionForm Form,HttpServletRequest request,HttpServletResponse response){}

struts2的Action不依赖与容器,允许Action脱离容器单独被测试。如果需要,Struts2的Action任然可以访问初始的request和response。例如下面的这个类Action.Java,他可以通过ActionContext对象取得Session值,也可以通过ServletActionContext对象取得request对象。

Publicclass Action{   protected Object getSession(String key)   {         return ActionContext.getContext().getSession(key);    }    protectedHttpServletRequest getRequest()    {        return(String)ServletActionContext.getRequest();    }}

可测试性
测试Struts Action的一个主要问题是,execute()方法暴露了Servlet API,这使得测试要依赖于容器。虽然有第三方的软件struts TestCase能够使用模拟对象来进行测试,但显然会让我们的测试变得更加复杂。
Struts2 Action的类是POJO对象,因此可以直接编写测试类来测试Action类,只需要在测试类中注入属性即可。

捕获输入
struts使用ActionForm对象捕获用户输入,所有的ActionForm必须继承一个基类ActionForm。因为其他的JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态表单可以作为创建传统ActionForm的选择,但是,开发者可能是再创建已经存在的JavaBean,仍然会导致有冗余的JavaBean;
struts2直接使用Action属性作为输入属性,消除对第二个输入对象的需求。输入属性可能是有自己子属性的rich对象类型。Action属性能够通过Web页面的taglibs访问。同时,struts2也支持ActionForm模式。

表达式语言
struts整合了JSTL,这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱
struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言OGNL

绑定值到页面
struts使用标准jsp机制把对象绑定到页面中来访问
struts2使用ValueStack(值堆栈)技术,使taglib能够访问值,而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)

类型转换
struts的ActionForm属性通常都是String类型,并不使用 Commons-Beanutils进行类型转换。每个类提供一个转换器,对每个实例来说是不可配置的;
struts2使用OGNL进行OGNL进行类型转换,提供了基本和常用对象转换器。

数据校验
struts支持在ActionForm的Validate方法中手动校验,或者通过Commons Validator来扩展校验。同一个类可以有不同的校验内容,但不能校验子对象;
struts2支持通过validata()方法和XWork校验框架来进行校验,XWork校验框架使用为属性类型定义的校验和内容校验,来支持chain校验子属性。

Action执行的控制
struts支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须提供相同的生命周期;
struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期,堆栈能够根据需要和不同的Action一起使用

0 0
原创粉丝点击