一、Struts2的处理流程:

  • 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是清理当前线程的ActionContext、Dispatcher,FilterDispatcher主要是通过ActionMapper来决定需要调用那个Action,FilterDispatcher是控制器的核心,也是MVC中控制层的核心组建)。
  • 核心控制器组建FilterDispatcher根据ActionMapper中的设置获得是否需要调用某个Action组建来处理这个HttpServletRequest请求,如果ActionMapper决定调用某个Action组建,FilterDispatcher核心控制器组建就会把请求的处理权委托给ActionProxy组建
  • ActionProxy组建通过Configuration Manager组建获得Struts2框架的配置文件struts.xml,最后找到需要调用的目标Action组建类,然后ActionProxy组建就创建出一个实现了命令模式的ActionInvocation类的对象实例类的对象实例(这个过程包括调用Anction组建本身之前调用多个的拦截器组建的before()方法 )同时ActionInvocation组建通过代理模式调用目标Action组建。但是在调用之前ActionInvocation组建会根据配置文件中的设置项目加载与目标Action组建相关的所有拦截器组建(Interceptor)。
  • 一旦Action组建执行完毕,ActionInvocation组建将根据开发人员在Struts2.xml配置文件中定义的各个配置项目获得对象的返回结果–为这个Action组建的结果码(一个像SUCCESS,INPUT)然后根据该返回的结果调用目标JSP页面以实现显示输出。
  • 最后各个拦截器组建会被再次执行(但是顺序和开始时相反,并调用after()方法),然后请求最终被返回给系统的部署文件中配置的其他过滤器,如果已经设置了ActionContextCleanUp过滤器,那么FilterDispatcher就不会清理在ThreadLocal对象中保存的ActionContext信息。如果没有设置ActionContextCleanUp过滤器,FilterDispatcher就会清除掉所有的ThreadLocal对象。

更加清晰的来说就是:

1.客户端初始化一个指向servlet容器的请求。

2.请求经过一系列的过滤器(ActionContextCleanUp、SiteMesh)

3.FilterDispatcher被调用,并询问ActionMapper来决定这个请求是否需要调用某个Action

4.ActionMapper决定要调用那一个Action,FilterDispatcher把请求交给ActionProxy。

5. ActionProxy通过Configurate Manager询问Struts配置文件,找到要调用的Action类

6. ActionProxy创建一个ActionInvocation实例

7. ActionInvocation实例使用命令模式来调用,回调Action的exeute方法

8. 一旦Action执行完毕,ActionInvocation负责根据Struts.xml的配置返回结果。

二、比较重要的类的介绍:

ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,他屏蔽了Action对于Request等Java servlet类的依赖。Struts2中它的默认实现类是DefaultAtionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的具体实现。

ActionProxy和ActionInvocation:

Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是咱ActionInvocation中实现的。

ConfigurateProvider和Configuration

ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是实现XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。

Struts2请求处理示意图:

Java Struts2 的请求处理流程详解的更多相关文章

  1. struts2处理请求流程详解

    struts2大概分为两块:一是struts2系统初始化,二是struts2处理请求,对请求作出响应. 下面就说说个人对struts2对请求处理流程的理解: 下面是StrutsPrepareAndEx ...

  2. Tomcat 请求处理流程详解

    Overview Connector 启动以后会启动一组线程用于不同阶段的请求处理过程. Acceptor 线程组.用于接受新连接,并将新连接封装一下,选择一个 Poller 将新连接添加到 Poll ...

  3. Spring mvc请求处理流程详解(一)之视图解析

      本文链接:https://blog.csdn.net/lchpersonal521/article/details/53112728 前言 Spring mvc框架相信很多人都很熟悉了,关于这方面 ...

  4. Java网络编程和NIO详解3:IO模型与Java网络编程模型

    Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...

  5. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  6. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  7. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  8. unity3d-配置Android环境,打包发布Apk流程详解

    31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android ...

  9. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

随机推荐

  1. js keycode大全

    JS KeyCode数字对应键盘以及应用大全   时间:2014-07-11 10:37    点击:851次 keycode    8 = BackSpace BackSpacekeycode    ...

  2. POJ 1185 状态压缩DP(转)

    1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...

  3. 看es6 字符串新方法有感

    'x'.repeat(3) // "xxx" 'hello'.repeat(2) // "hellohello" 'na'.repeat(0) // " ...

  4. jquery 属性与css操作

    属性1.属性    1.1 attr(name|properties|key,value|key,fn)        1) 获取属性值    $("img").attr(&quo ...

  5. ios 复制黏贴板的使用

    在iOS中,可以使用剪贴板实现应用程序之中以及应用程序之间实现数据的共享.比如你可以从iPhone QQ复制一个url,然后粘贴到safari浏览器中查看这个链接的内容. 一.在iOS中下面三个控件, ...

  6. 4537: [Hnoi2016]最小公倍数

    Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b的形式.现在有q个询问,每次询问给定四个参数u.v.a和b,请你 ...

  7. mvc验证码

    public string CreateValidateCode(int length) { int[] randMembers = new int[length]; int[] validateNu ...

  8. iOS网络

    iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 1253 阅读, 19 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微 ...

  9. SpringMVC源码阅读(一)

    DispatcherServlet是整个SpringMVC初始化和处理请求的重要类,作为一个servlet,拥有 public void init(ServletConfig config) thro ...

  10. Xcode中使用GitHub详解

    为了熟悉git命令及将写的小Demo能够管理起来方便日后查询,所以选择使用GitHub. 现在我们来说说Xcode中如何使用GitHub--- 一.当然是要先有GitHub帐号并登录了(没有的注册一个 ...