知识大全 Struts2请求处理流程及源码分析

Posted

篇首语:情况是在不断的变化,要使自己的思想适应新的情况,就得学习。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Struts2请求处理流程及源码分析相关的知识,希望对你有一定的参考价值。

Struts2请求处理流程及源码分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   Struts 请求处理        一个请求在Struts 框架中的处理步骤         a) 客户端初始化一个指向Servlet容器的请求         b) 根据Web xml配置 请求首先经过ActionContextCleanUp过滤器 其为可选过滤器 这个过滤器对于Struts 和其他框架的集成很有帮助(SiteMesh Plugin) 主要清理当前线程的ActionContext和Dispatcher;        c) 请求经过插件过滤器 如 SiteMesh etc等过滤器         d) 请求经过核心过滤器FilterDispatcher 执行doFilter方法 在该方法中 询问ActionMapper来决定这个请求是否需要调用某个Action;        e) 如果ActionMapper决定需要调用某个Action 则ActionMapper会返回一个ActionMapping实例(存储Action的配置信息) 并创建ActionProxy(Action代理)对象 将请求交给代理对象继续处理         f) ActionProxy对象根据ActionMapping和Configuration Manager询问框架的配置文件 找到需要调用的Action类         g) ActionProxy对象创建时 会同时创建一个ActionInvocation的实例         h) ActionInvocation实例使用命名模式来调用 在调用Action的过程前后 涉及到相关拦截器(Intercepter)的调用         i) 一旦Action执行完毕 ActionInvocation实例负责根据struts xml中的配置创建并返回Result Result通常是一个需要被表示的JSP或者FreeMarker的模版 也可能是另外的一个Action链         j) 如果要在返回Result之前做些什么 可以实现PreResultListener接口 PreResultListener可以在Interceptor中实现 也可以在Action中实现         k) 根据Result对象信息 生成用户响应信息response 在生成响应过程中可以使用Struts 框架中继承的标签 在此过程中仍会再次涉及到ActionMapper;        Struts 请求处理示意图

  

   Struts 请求处理源码分析        当用户向Struts 发送请求时 FilterDispatcher的doFilter()方法自动调用 doFilter()方法处理请求过程 如下         创建值栈对象stack;        创建Action上下文对象         对请求进行重新封装 此次封装根据请求内容的类型不同 返回不同的对象         如果为multipart/form data类型 则返回MultiPartRequestWrapper类型的对象 该对象服务于文件上传 否则返回StrutsRequestWrapper类型的对象 MultiPartRequestWrapper是StrutsRequestWrapper的子类 而这两个类都是HttpServletRequest接口的实现         通过actionMapper getMapping()获得ActionMapping对象 Action的配置信息存储在ActionMapping对象中(Action的配置信息 Action的name namespace和要调用的方法method) 相关代码如下图所示

  

  以上代码 活动图如下

  

   如果getMapping()方法返回ActionMapping对象为null 则FilterDispatcher认为用户请求不是Action 此时FilterDispatcher会首先分析         如果请求以/struts开头 会自动查找在web xml文件中配置的packages初始化参数 FilterDispatcher会将packages参数值包下的文件当作静态资源处理 即直接在页面上显示文件内容         如果用户请求的资源不是以/struts开头 可能是 jsp文件 也可能是 文件 则通过过滤器链继续往下传送 直到到达请求的资源为止         如果getMapping()方法返回有效的ActionMapping对象 则被认为正在请求某个Action 将调用Dispatcher serviceAction(request response servletContext mapping)方法         以上六步 相关代码如下图所示

  

  

  以上代码 活动图如下

  

   请求进入dispatcher serviceAction(request response servletContext mapping)方法中         a) 将相关对象信息封装为Map(如 HttpServletRequest Http parameters HttpServletResponse HttpSession ServletContext ActionMapping等对象信息) 并存入到执行上下文Map中 返回执行上下文Map对象extraMap;        b) 获取mapping对象中存储的action命名空间 name属性 method属性等信息         c) 加载并解析Struts 配置文件 如果没有人为配置 默认按顺序加载struts default xml struts plugin xml struts xml 将action配置 result配置 interceptor配置 解析并存入至config对象中 返回文件配置对象config;        d) 根据执行上下文Map action命名空间 name属性 method属性等创建用户Action的代理对象         e) 执行Action代理对象proxy execute()方法 并转向结果

        以上步骤相关代码 如图所示

  

   执行Action代理对象proxy execute()方法 该方法的执行 其实就是调用了invocation invoke()方法 如下图所示

  

   执行invocation invoke()方法 实现了截拦器的递归调用和执行Action的execute()方法 DefaultActionInvocation invoke()方法中代码 如下图所示

  

  在以上代码中 并未看出拦截器的递归调用 其实是否递归调用 是由程序员来控制的 递归调用实现很简单         a) 首先看下Interceptor接口定义

  

  b) 所有的截拦器必须实现intercept方法 而该方法的参数恰恰又是ActionInvocation 所以如果在intercept方法中调用invocation invoke() 则会继续从Action的Intercepor列表中找到下一个截拦器执行 依此递归调用Intercepor;        Struts 中的日志拦截器LoggingInterceptor 如下图所示

  

  c) 拦截器递归调用活动图 如下所示

  

   在invocation invoke()方法中 执行拦截器 action并获得resultCode完毕后 则会继续执行PreResultListener集合 并生成Result对象 实现PreResultListener接口 可在返回Result之前 做些自定义处理 如图所示

  

  在返回Result之前 通过PreResultListener实现自定义处理 常用的有两种方式 一种在Interceptor中实现 一种在Action实现 如图所示

  

  

  以上两种方式 大家可以发现都是通过匿名内部类的方式实现 其实还有一种方式就是通过在拦截器中实现PreResultListener接口 并实现方法beforeResult方法 即可 如下图所示

  

   最后 通过生成Result完成用户响应

  以上 步 为Struts 处理请求的完整流程分析 其相关代码调用流程 如下图所示

cha138/Article/program/Java/ky/201311/28036

相关参考

知识大全 Struts2分页实现源码

Struts2分页实现源码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &

知识大全 Struts2的整体流程(上)

Struts2的整体流程(上)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 TOMCAT源码分析(启动框架)

TOMCAT源码分析(启动框架)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前言  本文是我

知识大全 java源码分析之LinkedHashMap

java源码分析之LinkedHashMap  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs

知识大全 java源码分析之LinkedList

java源码分析之LinkedList  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 struts2自定义验证器(身份证验证)

  struts的验证器是用的xwork里面的验证自定义验证器就是根据源码继承已有的字段验证器而来具体步骤如下:  展开xworkjaropensymphonyxwork  validatorvali

知识大全 java源码分析之HashMap

java源码分析之HashMap  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Java集合类

知识大全 Struts2 框架使用实例分析

Struts2框架使用实例分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  下面我们通过实例来

工业废水处理流程分析

随着我国制造业的不断发展,对环境的影响也在不断扩大,那么企业如何采用合理的污水处理工艺能够减少对环境的污染呢?下面看看不同的污水不同的处理工艺流程!一、造纸污水处理工艺流程二、屠宰废水处理工艺流程三、

工业废水处理流程分析

随着我国制造业的不断发展,对环境的影响也在不断扩大,那么企业如何采用合理的污水处理工艺能够减少对环境的污染呢?下面看看不同的污水不同的处理工艺流程!一、造纸污水处理工艺流程二、屠宰废水处理工艺流程三、