struts2的工作原理

                 

                                  工作原理图

一 简介:

struts2的工作流程如下:

  1. 客户端初始化一个指向Servlet容器(例如Tomcat)的请求(request),因为http是请求响应模型
  2. 请求经过一系列的过滤器(Filter)
  3. 接着StrutsPrepareAndExecuteFilter被调用,其询问ActionMapper判断请求是否需要struts2来处理)来决定请求调用哪个Action
  4. 如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter就把请求交给ActionProxy(Action代理,用于获取Action,实现了url与Action之间的映射)
  5. ActionProxy通过Configuration Manager(配置管理)询问框架的配置文件struts.xml,找到需要调用的Action类,并创建一个ActionInvocation(负责Interceptor、Action和Result等一系列元素的调度)的实例
  6. ActionInvocation实例使用命名模式(命名规范)来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用调用是栈(或递归)的规律:调用Action前是从前往后执行,每次判断是否向后执行,调用后是从后往前执行
  7. 一旦Action执行完毕,ActingInvocation负责根据struts.xml中的配置找到相对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示JSP。在表示的过程中可以使用Struts2框架中继承的标签。这个过程需要涉及到ActionMapper

二 过滤器介绍:

1.什么是过滤器

  源数据和目的数据之间起过滤作用的中间件(请求、响应时都需要首先通过过滤器),注意只对post请求起作用。而StrutsPrepareAndExecuteFilter过滤器用于对

  HttpServletRequest与HttpSerlvetResponse进行预处理。

2.StrutsPrepareAndExecuteFilter过滤器使用方法:

  1. 首先继承自Filter
  2. 接着按照init()—>doFilter()—>destroy()方式运行此过滤器,但是拥有一个回调方法(类A调用类B中的某个方法b,然后类B又在某个时候反过来调用类A中的某个方法a,对于A来说,这个a方法便叫做回调方法):postInit(),用于方法回调初始化
  3. doFilter()是过滤器的执行方法,它拦截提交的HttpServletRequest请求,HttpServletResponse响应,是strtus2的核心拦截器
  4. doFilter()作用:请求被拦截器拦截;拦截器进行数据验证;拦截器根据数据验证的返回值进行判断;判断成功后进入请求的方法或者类中;判断失败返回给拦截器该抛出异常出异常。

3.ActionMapper介绍:

  Struts2.0 采用默认的映射器为DefaultActionMapper。通过 实现自己的ActionMapper,通过method参数将请求转发到具体的action;在struts.xml增加配置,将默认的actionmapper换成自定义的,接着再到web.xml进行配置,来实现重写URL

三 拦截器介绍:

1.ActionProxy介绍:

  就是一个接口(也是一个拦截器),通过源码可以发现最重要的是execute方法,该方法最重要的作用是调用ActionInvocation实例的invoke方法,从而进入struts2框架的拦截器进行拦截处理和调用action方法。

2.拦截器的工作原理:

  拦截器是AOP( Aspect-Oriented Programming)的一种实现,底层通过动态代理模式完成。拦截器的工作时间是ActionProxy代理调用Action类前后进行的,两次的运行方式不一样,但是满足栈的规则因此又叫拦截栈(多个拦截器形成拦截栈);具体方法是先顺序调用多个拦截器,如果通过拦截器(使用invocation.invoke())就调用Action与对应返回值,否则不调用Action直接返回当前拦截器的返回值, 如果调用Actin那调用后再反向调用拦截栈里的拦截器(递归调用返回值怎么做与之前一致)。

3.拦截器的实现方式:

  1. 实现Interceptor接口
  2. 继承AbstractInterceptor类
  3. 继承MethodFilterInterceptor类

4.拦截器与过滤器的区别:

  1. 拦截器是基于java的反射机制的(程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。),而过滤器是基于函数回调。
  2. 拦截器不依赖与servlet容器,而过滤器依赖与servlet容器。
  3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

5.最重要的是execute方法,方法最重要的作用是调用ActionInvocation实例的invoke方法,从而进入struts2框架的拦截器进行拦截处理和调用action方法

posted @ 2017-03-20 15:10  专注如一  阅读(668)  评论(0编辑  收藏  举报