现在的位置: 首页 > 综合 > 正文

Struts2工作原理

2018年01月20日 ⁄ 综合 ⁄ 共 1373字 ⁄ 字号 评论关闭

Struts官方工作流程图:

图来自:http://struts.apache.org/2.3.4.1/docs/big-picture.html 点击打开链接
从上图我们可以看出struts2的工作流程如下:
  1. HttpServletRequest请求通过一个标准的过滤器链(ActionContextCleanUp、SiteMesh等其他过滤器),到达servlet容器(eg.Tomcat容器,WebSphere容器)。
  2. 接着调用FilterDispatcher,FilterDispatcher查找ActionMapper,来判断这个请求调用哪个Action。注:FilterDispatcher是任何一个Struts2应用都需要配置的,一般出现在过滤器链的最后;如果在FilterDispatcher前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器。
  3. 如果 ActionMapper 确定需要调用某个 Action,FilterDispatcher 将控制权交给 ActionProxy。注:ActionProxy对象作为Action与xwork之间的中间层,会代理Action的运行过程。
  4. ActionProxy会通过ConfigurationManager依照框架的配置文件(struts.xml),找到需要调用的
    Action 类。
    ActionProxy对象刚被创建出来的时候,并不知道要运行哪个Action,它手里只有从FilterDispatcher中拿到的请求的URL。这时候,它去向ConfigurationManager询问到底要运行哪个Action。ConfigurationManager就是负责读取并管理struts.xml的,可以简单的理解为ConfigurationManager是struts.xml在内存中的映像。在服务器启动的时候,ConfigurationManager会一次性的把struts.xml中的所有信息读到内存里,并缓存起来,以保证ActionProxy拿着来访的URL向他询问要运行哪个Action的时候,就可以直接匹配、查找并回答了。
  5. ActionProxy 对象执行步骤:首先按照拦截器的引用顺序依次执行各个拦截器的前置部分,然后执行Action的execute方法,然后根据execute方法返回的结果,也就是Result,在struts.xml中匹配选择下一个页面。找到页面后,可以通过Struts2自带的标签库来访问需要的数据,并生成最终页面,最终的显示结果一定是
    HTML 标签。标签库技术和其他视图层技术只是为了动态生成 HTML 标签。最后,ActionInvocation对象再按照拦截器的引用顺序的倒序依次执行各个拦截器的后置部分。

  6. ActionInvocation对象执行完毕后,响应通过滤器链返回(过滤器技术执行流程与拦截器一样,都是先执行前面部分,后执行后面部)。如果过滤器链中存在
    ActionContextCleanUp,FilterDispatcher 不会清理线程局部的 ActionContext。如果不存在 ActionContextCleanUp 过滤器,FilterDispatcher 会清除所有线程局部变量。

抱歉!评论已关闭.