看完Struts2的系统结构后对其流程也就不陌生了:
- 用户提交请求URL,该请求会被Tomcat服务器接收到,Tomcat服务器会根据请求URL的Web上下文来处理这个请求的Web应用。
- Web容器会去读取工程的web.xml,并在其中进行匹配,发现扩展名为.action的请求,根据Filter的配置,找到实际的类FilterDisPatcher。
- Web容器获取FilterDispatcher类的实例,然后回调doFilter()方法进行真正的处理。
- FilterDispatcher将请求转发给ActionMapper,由ActionMapper负责决定当前请求是否需要Struts2处理。ActionMapper告诉FilterDispatcher需要处理这个请求,FilterDispatcher会停止过滤器链后面的部分,所以通常情况下FilterDispatcher应该出现在过滤器链的最后。然后建立一个ActionProxy对象,这个对象会代理Action的运行过程。
- ActionProxy对象刚被创建时并不知道要运行哪个Action,这时它会去向ConfigurationManager询问到底运行哪个Action。在服务器启动时,ConfigurationManager会一次性把struts.xml中的所有信息读到内存里缓存起来,以保证ActionProxy向它询问时可以直接匹配,查找并回答。
- ActionProxy拿到要运行的Action、相关拦截器以及所有可能使用的result信息,就可以建立ActionInvocation对象了,该对象描述了Action运行的整个过程。
- ActionInvocation对象执行比较复杂,首先按照拦截器的引用顺序依次执行各个拦截器的前置部分,然后执行Action的execute()方法,根据该方法返回的结果,即Result,在struts.xml匹配选择下一个界面,找到页面后,就可以在页面上通过Struts2自带的标签库访问需要的数据,生成最终页面。最后ActionInvocation对象再按照拦截器的引用顺序执行其后置部分。
- ActionInvocation对象执行完毕后,就已经得到了响应对象,即HttpServletResponse对象,最后按与过滤器配置定义相反的顺序依次经过过滤器,向用户展示响应的结果。
浙公网安备 33010602011771号