加入收藏 | 设为首页
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Struts2的运行流程

Posted on 2014-10-31 16:21  墨香一点足以  阅读(198)  评论(0)    收藏  举报

看完Struts2的系统结构后对其流程也就不陌生了:

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