Struts2执行过程:
1)当用户提交的时候,请求的URL为:/helloworld/helloworldAction.action请求被Tomcat服务器接收到,Tomcat服务器会根据请求URL中的web上下文,也就是/helloworld,来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求;
2)Web服务器会读取helloworld这个工程的web.xml,在web.xml中进行配置,发现扩展名为.action的请求,由struts2这个过滤器来进行处理,根据Filter的配置,找到实际的类为FilterDispatcher。 Dispatcher [dɪˈspætʃə(r)]调度
3)Web容器会根据获取的FilterDispatcher这个类的实例,然后回调doFilter()方法进行真正的处理,FilterDispatcher作为前端控制器,是整个Struts的调度中心;
4)FilterDispatcher讲请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理。
5)ActionMapper告诉FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,所以通常情况下:FilterDispatcher应该出现在过滤器联链的最后。然后建立一个ActionProxy对象,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。
6)ActionProxy对象被创建出来的时候,并不知道要运行哪个Action,他手里只有从FilterDispatcher中拿到的请求的URL。这时候,他去向ConfigurationManager询问到底要运行哪一个Action。 Configuration[kənˌfɪgəˈreɪʃn]配置
7)在服务器启动的时候,ConfigurationManager会一次性的将struts.xml文件中所有信息读到内存中,并缓存起来,以保证ActionProxy拿着来访问的URL向它询问要运行哪一个Action的时候,就可以直接匹配,查找并回答出来。
8)ActionProxy知道了需要运行的那个Action,相关的拦截器以及所有可能使用的result信息,就可以着手建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。 Invocation[ˌɪnvəˈkeɪʃn]调用。
注:Action运行绝不仅仅只是运行Action中的execute方法这么简单,还包其他部分,完整的调度过程由ActionInvocation对象负责。