struts2 框架处理流程

流程图如下:

注意:StrutsPrepareAndExecuteFilter替代了2.1.3以前的FilterDispatcher过滤器,使得在执行Action之前可以添加过滤器了。

文档说明:Deprecated.Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using the ActionContextCleanUp filter in addition to this one

下面对上面这个流程图进行详细解释:

首先,客户端通过HttpServletRequest,向servlet容器(tomcat)提交一个请求,这个请求会经过一系列的过滤器,像ActionContextCleanUp以及其它的过滤器等,经过这些过滤器以后,最终会被struts的核心控制器过滤到,也就是StrutsPrepareAndExecuteFilter。

被核心过滤器过滤到以后,核心控制器会访问ActionMapper,来决定是否要调用某一个action,也就是用户是否要请求某一个action。如果用户请求的是某一个jsp页面,或者是其它的资源,则不会访问我们的action。如果ActionMapper决定需要调用某一个action,这个时候,struts中的核心控制器会将控制权委派给ActionProxy,也就是action代理。然后,ActionProxy,Configuration Manager配置管理器来加载struts的核心配置文件,即struts.xml(action配置在struts.xml里).

如果在struts.xml中找到了要调用的action,ActionProxy(ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法)会创建ActionInvocation的一个实例。Action Invocation里面包含了所创建的action的实例,同时它里面还有另外一个非常重要的部分,就是拦截器Interceptor。

(ActionInvocation 是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口, 而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。

Interceptor 的调度流程大致如下: 

1.
ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。

2.
通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。 )

在调用action之前,或者调用action之后,它还需要调用非常多的拦截器。在调用action之前,首先会依次调用所配置的拦截器,如果拦截器有多个,也会依次执行。比方说,它会首先执行第一个拦截器,那么紧接着执行第二个拦截器,再执行第三个拦截器等等。当把这些拦截器执行完了以后,它才会执行我们的action。那么执行action我们会非常熟悉,它会调用action里的业务处理方法,进行业务的处理,同时这个方法会返回一个结果(字符串),然后根据这个返回的字符串去调用视图去匹配result,一般来说会返回一个jsp页面,或者去调用另外的某一个action。

当返回这个视图以后,它真的去响应用户了吗。实际上并没有,它会将之前执行过的拦截器再倒过来执行一遍,也就是执行第三个拦截器,再是第二个,再是第一个。反向执行拦截器之后,才会进行最终的请求的响应。

友情链接:

ActionContextCleanUP

ActionContextCleanUP过滤器来完成清除属性,不让后续的filter(FilterDispatcher)清除,从而延长action中属性的生命周期,以便在jsp页面中进行访问。

StrutsPrepareAndExecuteFilter

StrutsPrepareAndExecuteFilter 与 FilterDispatcher的区别

struts2 框架处理流程的更多相关文章

  1. Struts2框架学习(一)

    Struts2框架学习(一) 1,Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发.框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2 ...

  2. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  3. java框架篇---Struts2的处理流程

    一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是 ...

  4. Struts2框架的运行流程

    Struts2的运行流程 1.浏览器发送请求到控制器(如Struts2中的核心控制器StrutsPrepareAndExecuteFilter): 2.控制器调用Action的execute方法: 3 ...

  5. Struts2框架学习(二)——访问流程及架构

    1.Struts2的执行流程 从客户端发送请求过来,先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter)过滤器中执行一组拦截器(一组拦截器就会完成部分功能代码),拦 ...

  6. Struts2框架基础

    Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...

  7. Struts2框架简介和示例

    struts2框架 Struts2是java web的框架,在Java Web开发中,表示层框架,其核心是通过扩展Servlet来帮助处理http请求. Struct2的基本流程 Struct2的框架 ...

  8. Struts2框架之-注解开发

    Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action类中每个方法的绑定这是重点,在这里先简单看一下配置文件中的简单配置: <span style=" ...

  9. struts2框架快速入门小案例

    struts2快速入门: index.jsp------>HelloAction--------->hello.jsp struts2流程 1.导入jar包 struts2的目录结构: a ...

随机推荐

  1. 【转】Linux下Fork与Exec使用

    Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...

  2. 函数mod(a,m)

    Matlab中的函数mod(a,m)的作用: 取余数 例如: mod(25,5)=0; mod(25,10)=5; 仅此.

  3. module 和 module.exports 的区别

    自己理解的不好,推荐一篇文章吧:   http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html

  4. 三妹,我拆了你的本-- Day One(大图赏)

    从垃圾箱中捡到了三妹的笔记本,虽然显卡已烧,硬盘和内存已被掳走,但依旧很高兴的说,因为我的目的是要拆了它. 这是我的第一次,所以本文的内容完全是新手猎奇,高手勿喷~ 步骤1:拆掉塑料外壳 不要忘了硬盘 ...

  5. java动态调用webservice

    cxf方式 public static Object[] invokeRemoteMethod(String url, String method, Object[] parameters) { Ja ...

  6. 【Django】--基础知识

    一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. Web应 ...

  7. js三级地区联动

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head ...

  8. 【转载】mysql慢查询

    mysql> show variables like 'long%'; 注:这个long_query_time是用来定义慢于多少秒的才算“慢查询” +-----------------+---- ...

  9. Swift - UIBezierPath

    使用UIBezierPath可以创建基于矢量的路径.使用此类可以定义简单的形状,如椭圆.矩形或者有多个直线和曲线段组成的形状等.主要用到的该类的属性包括 moveToPoint: //设置起始点 ad ...

  10. java求字符串数组交集、并集和差集

    import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Ma ...