Struts2请求处理的内部流程图/结构图/原理图(版本二)

请求处理流程图

在这里插入图片描述

流程说明

第 1 步:

客户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求,例如:在浏览器中输入 http:localhost:8080/Struts2/helloworld/helloworldAction.action 就是提交一个HttpServletRequest 请求。

请求会被 Tomcat 接收到,Tomcat 服务器来选择处理这个请求的 Web 应用,那就是由 helloworld 这个 web 工程来处理这个请求。

第 2 步:

Web 容器会去读取 helloworld 这个工程的 web.xml,在 web.xml 中进行匹配,最后发现需要经过一堆的过滤器。

这个请求经过一系列的过滤器(Filter),例如:ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher

注意:

这里是有顺序的,先 ActionContextCleanUp,再其它过滤器,最后FilterDispatcherFilterDispatcher 是Struts 2 的调度中心,是 Struts 2 的控制器的核心,也就是 Struts 2 框架中的控制层(Controller)的核心

FilterDispatcher 必须放在滤器链的最后,如果在 FilterDispatcher 前出现了如SiteMesh 这种特殊的过滤器,还必须在 SiteMesh 前引用 Struts 2 的ActionContextCleanUp 过滤器。

Struts 2.1.3 版本后核心控制器 FilterDispatcher 被弃用了,替换成 StrutsPrepareAndExecuteFilter,因为 FilterDispatch 在执行 Action 之前不能插入自定义的过滤器, 而 StrutsPrepareAndExecuteFilter 可以在执行 Action 之前添加自己的过滤器。如果要使用 ActionContextCleanUp,则可以通过StrutsPrepareFilterStrutsExecuteFilter 进行替换。

扩展:

Struts 2 的核心控制器 FilterDispatcher,有 3 个重要的方法:destroy()doFilter()init(),执行顺序是:init()doFilter()destroy()

第 3 步:

接着 FilterDispatcher 被调用,即容器会创建 FilterDispatcher 实例,然后调 doFilter() 方法,在这个方法中,FilterDispatcher 询问 ActionMapper 是否需要调用某个 Action 来处理这个(HttpServletRequest)请求,如果 ActionMapper 决定需要调用某个 ActionActionMapper 会通知 FilterDispatcher 需要处理这个请求,FilterDispatcher 会停止过滤器链以后的部分,(这也就是为什么 FilterDispatcher 应该出现在过滤器链的最后的原因)。FilterDispatcher 则把请求的处理交给 ActionProxy,即建立一个 ActionProxy 实例,这个对象作为Actionxwork 之间的中间层,会代理 Action 的运行过程。

第 4 步:

ActionProxy 通过 ConfigurationManager 询问框架的配置文件(struts.xml),找到需要调用的 Action

注意:

在服务器启动的时候,ConfigurationManager 就会把 struts.xml 中的所有信息读到内存里,并缓存,当 ActionProxy 带着 URL 向他询问要运行哪个 Action 的时候,就可以直接查找并返回

第 5 步:

ActionProxy 创建一个 ActionInvocation 实例,同时 ActionInvocation 通过代理模式调用 Action。但在调用之前,ActionInvocation 会根据配置加载 Action 相关的所有 Interceptor(拦截器),即调用 Action 的过程前后,涉及到相关拦截器的调用

第 6 步:

一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果 result。返回结果通常是一个需要被表示的 JSP 或者 FreeMarker 的模版(不一定是页面,也可能是另外的一个 Action 链)。在表示的过程中可以使用 Struts 2 框架中继承的标签。在这个过程中需要涉及到 ActionMapper

第 7 步:

最后,ActionInvocation 对象倒序执行拦截器。ActionInvocation 对象执行完毕后,已经得到响应对象(HttpServletResponse)了,最后按与过滤器配置定义相反的顺序依次经过过滤器,向客户端展示出响应的结果,即通过 HTTPServletResponse 返回客户端一个响应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值