1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求web
2 这个请求通过一系列的过滤器(Filter)(这些过滤器中有一个叫作ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其余框架的集成颇有帮助,例如:SiteMesh Plugin)api
3 接着StrutsPrepareAndExecuteFilter被调用,它询问ActionMapper来决定这个请是否须要调用某个Action安全
4 若是ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy架构
5 ActionProxy经过Configuration Manager询问框架的配置文件,找到须要调用的Action类app
6 ActionProxy建立一个ActionInvocation的实例。框架
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程先后,涉及到相关拦截器(Intercepter)的调用。性能
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果一般是(也 能是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程当中可使用Struts2 框架中继承的标签。在这个过程当中须要涉及到ActionMapper
在上述过程当中全部的对象(Action,Results,Interceptors,等)都是经过ObjectFactory来建立的。测试
Struts2和struts1的比较spa
从体系结构来看:struts2大量使用拦截器来处理请求,从而容许与业务逻辑控制器 与 servlet-api分离,避免了侵入性(所谓侵入性就是指的这个架构设计出来的部件对系统的影响范围,好比框架的侵入性就很高,由于在一个工程中引入一个框架,你的整个设计都必须围绕这个框架来进行,一旦使用了,框架的可替代性几乎为0,这样子就是高侵入性。组件的侵入性就比较低);而struts1.x在action中明显的侵入了servlet-api.线程
从线程安全分析:struts2.x是线程安全的,每个对象产生一个实例,避免了线程安全问题;而struts1.x在action中属于单线程。
性能方面:struts2.x测试能够脱离web容器,而struts1.x依赖servlet-api,测试须要依赖web容器。
请求参数封装对比:struts2.x使用ModelDriven模式,这样咱们 直接 封装model对象,无须要继承任何struts2的基类,避免了侵入性。
标签的优点:标签库几乎能够彻底替代JSTL的标签库,而且 struts2.x支持强大的ognl表达式。
固然,struts2和struts1相比,在文件上传,数据校验 等方面也 方便了好多。