struts1与struts2的区别

来源:互联网 发布:java高级面试题2017 编辑:程序博客网 时间:2024/05/18 03:24

Action类

Struts1:使用抽象类编程而不是接口,它要求开发的Action类继承一个抽象基类,如Action类等。

Struts2:基于接口编程,我们的Action类可以实现一个Action接口,也可实现其他接口,通常是继承ActionSupport基类去实现。此外,Struts2 中Action接口不是必需的,任何有execute()函数的POJO对象都可以用做Strut2的Action类来使用。

线程模式

Struts1:Action是单例模式,仅有Action的一个实例来处理所有的请求。限制了Struts Action所能做的事,Action资源必须是线程安全或同步的

Struts2:Action对象为每一个请求产生一个实例,因此没有线程安全问题。

Servlet依赖

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

Public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request,HttpServletResponse response){

}

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

Public class MyAction{

Protected Object getSession(String key){

    Return ActionContext.getContext().getSession(key);

}

Protected HttpServletRequest getRequest(){

    Return (String)ServletActionContext.getRequest();

}

}

可测试性

Strtus1: execute()方法暴露了Servlet API,这使得测试要依赖于容器。虽然有第三方的软件Struts TestCase能够使用模拟对象来进行测试,但显然会让我们的测试变得更加复杂。

Struts2: Action的类是POJO类,因此可以直接编写测试类来测试Action类,只需要在测试类中为Action注入属性即可。

捕获输入

Struts1:使用ActionForm对象捕获用户输入,所有的ActionForm必须继承一个基类ActionForm。因为其他的JavaBean不能用做ActionForm,开发者经常创建多余的类捕获输入。动态表单可以作为创建传统ActionForm的选择,但是,开发者可能是在重新创建已经存在的JavaBean,仍然会导致有冗余的JavaBean。

Struts2:直接使用Action属性作为输入属性,消除了对第2个输入对象的需求。输入属性可能是有自己子属性的rich对象类型。Action属性能够通过Web页面上的taglibs访问。同时,Struts2也支持ActionForm模式。

表达式语言

Struts1:整合了JSTL,这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

Struts2:可以使用JSTL,但是也支持一个形影相随强大和灵活的表达式语言OGNL

绑定值到页面 

Struts1:使用标准JSP机制把对象绑定到页面中来访问。

Struts2:使用ValueStack策略允许通过一系列名称相同,但类型不同的属性重用页面(View)。

类型转换

Struts1:ActionForm属性通常都是String类型,并使用Commons-Beanutils进行转换。每个类提供一个转换器,对每一个实例来说是不可配置的。

Struts2:使用OGNL进行类型转换,提供了基本和常用对象的转换器。

数据校验

Struts1:可在Form中validate()方法中设置校验,或者通过自带的 Validator插件来校验。同一个类可以有不同的校验内容,但不能校验子对象。

Struts2:支持通过validate()方法和XWork校验框架来校验,XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。

Action执行的控制

Struts1:支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

Struts2:支持通过拦截器堆栈(Interceptor Stacks为每一个Action创建不同的生命周期,堆栈能够根据需要和不同的Action一起使用。

配置文件

Struts1:struts-config.xml,位于WEB-INF/下面,jsp的转向用<forward>标签。

Struts2:struts.xml,位于Src下面,jsp的转向用<result>标签,结构上与struts1还有很多不同。

表现层技术

Struts1:只支持JSP作为视图资源。

Struts2:还可以支持FreeMarker、Velocity等技术。

表单数据的传递

Struts1:用Form Bean封装,然后整体传递到action的execute()方法中。

Struts2:没有Form Bean,直接从request中获取,调用action中setter()方法设置到action的对应属性中。