(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一起使用。