• 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方法

  • 相关阅读:
    ctags的基本操作总结
    iOS开发使用Unwind Segue进行返回
    Swoole源代码学习记录(十二)——ReactorThread模块
    HDU 2189 ( 悼念512汶川大地震遇难同胞——来生一起走 )
    WEB开发面试题
    UVA 11762
    shell EOF注意点
    Oracle EBS 从Web界面进入责任时,提示不存在可用的有效责任
    LeetCode--Reverse Integer
    atitit.web 推送实现方案集合
  • 原文地址:https://www.cnblogs.com/zhuanzhuruyi/p/6589169.html
Copyright © 2020-2023  润新知