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的对应属性中。