Struts1与Struts2区别?

时间:2024-06-01 18:36:08

(1)Struts1执行过程:

<1>Web容器启动的时候ActionServlet被初始化,加载struts-config.xml配置文件。

<2>浏览器发送请求到ActionServlet时,ActionServlet对请求进行处理。根据请求的路劲和配置信息找到对应的Action和ActionForm。

<3>在确定将要调用的Action和对应的ActionForm后,将请求中包含的值填充到ActionForm中。在调用Action的execute方法前ActionServlet需要准备好ActionMapping参数。

<4>Action调用业务逻辑方法得到返回值,并返回ActionForward对象。

<5>控制权重新回到ActionServlet,ActionServlet根据Action返回的ActionForward对象转发到相应的页面。

<6>处理结果返回给浏览器。

(2)Struts2执行过程:

<1>当WEB容器收到一个请求时,它将请求传递给一个标准的过滤器链(如ActionContentCleanUp)。

<2>FilterDispatcher被调用,它调用ActionMapper确定请求调用哪个Action,ActionMapper返回一个收集了Action信息的ActionMapping对象

<3>FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager)从配置文件中读取配置信息,然后创建ActionInvocation对象,ActionInvocation被创建的同时,填充了需要的所有的对象和信息,它在调用Acton之前会依次调用所用配置的拦截器(Intercepter)。

<4>一旦Action执行返回结果字符串,ActionInvocation负责根据struts.xml中的配置查找结果字符串对应的Result,然后执行这个Result,一般Resul会调用一些模板(JSP)来呈现页面。

<5>之后拦截器会被再次执行(顺序和Action执行之前相反),最后响应,被返回给在web.xml中配置的哪些过滤器(FilterDispatcher等)。

(3)Struts1与Struts2区别:

<1>struts1要求Action类继承一个抽象基类,而不是接口。

struts2的action类可以实现一个action接口,也可以实现其他接口。

<2>sturts1 的action是单例模式,线程是不安全的。

struts2 的action线程是安全的,action为每一个请求都生成了一个实例。

<3>sturts1过去依赖serlet API,不容易测试。

struts2不依赖于容器,允许Action脱离容器单独被测试。

<4>Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。

Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。

<5>Struts1整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言OGNL(Object Graph Notation Language)。

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

Struts2使用ValueStack技术使taglib能够访问值而不需要把页面(view)和对象绑定起来。

<7>Struts1的ActionForm属性通常都是String类型。

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

<8>Struts1支持在ActionForm的validate方法中手动校验,或通过Commons Validator的扩展来校验。

Struts2支持通过validate方法和XWork校验框架来进行校验。

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

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