struts2执行流程与拦截器介绍

struts2执行流程介绍

1、客户端向Servlet容器(如Tomcat)提交一个请求

2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等)

3、核心控制器被调用,询问ActionMapper来决定请求是否需要调用某个Action

4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy (备注:JSP请求无需调用Action)

5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需调用的Action类

6、ActionProxy创建一个ActionInvocation的实例

7、 ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器

8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果

9、拦截器被再次执行

10、过滤器被再次执行

核心接口和类

ActionMapper

根据请求的URI查找是否存在对应Action调用

ActionMapping

保存调用Action的映射信息,如namespace、name等

ActionProxy

在XWork和真正的Action之间充当代理

ActionInvocation

表示Action的执行状态,保存拦截器、Action实例

Interceptor

可以在请求处理之前或者之后执行的Struts 2组件

Struts 2绝大多数功能通过拦截器完成

拦截器

Struts 2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能

拦截器方法在Action执行之前或者之后执行

拦截器栈

从结构上看,拦截器栈相当于多个拦截器的组合

在功能上看,拦截器栈也是拦截器

拦截器与过滤器原理很相似

拦截器的执行过程是一个递归的过程 :

三阶段执行周期:

1、做一些Action执行前的预处理

2、将控制交给后续拦截器或返回结果字符串

3、做一些Action执行后的处理

自带拦截器:

Params拦截器

负责将请求参数设置为Action属性

servletConfig拦截器

将源于Servlet API的各种对象注入到Action

fileUpload拦截器

对文件上传提供支持

exception拦截器

捕获异常,并且将异常映射到用户自定义的错误页面

validation拦截器

调用验证框架进行数据验证

workflow拦截器

调用Action类的validate(),执行编码验证

Struts 2默认拦截器栈

struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器

<default-interceptor-ref name="defaultStack"/>

defaultStack提供了所有核心的Struts 2功能,满足绝大多数应用程序的需要

只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器

在struts-default.xml中默认的拦截器栈中包含如下拦截器

自定义拦截器示例:

public class MyTimerInterceptor extends AbstractInterceptor{
	public String intercept(ActionInvocation invocation)
						throws Exception {
		//预处理工作
		long startTime = System.currentTimeMillis();
              //执行后续拦截器或Action
		String result = invocation.invoke();
              //后续处理工作
	       long execTime = System.currentTimeMillis() - startTime;
             System.out.println("The interval time is "+execTime+" ms");
		//返回结果字符串
              return result;
	}
}
</pre><pre name="code" class="java">

配置拦截器:

<package name="packName" extends="struts-default" namespace="/manage">
	<interceptors>
		<!-- 定义拦截器 -->
		<interceptor name="interceptorName" class="interceptorClass" />
		<!-- 定义拦截器栈 -->
		<interceptor-stack name="interceptorStackName">
			<!--指定引用的拦截器-->
			<interceptor-ref name="interceptorName|interceptorStackName" />
		</interceptor-stack>
	</interceptors>
	<!--定义默认的拦截器引用-->
	<default-interceptor-ref name="interceptorName|interceptorStackName" />
	<action name="actionName" class="actionClass">
	  <!—为Action指定拦截器引用-->
		<interceptor-ref name="interceptorName|interceptorStackName" />
		<!--省略其他配置-->
	</action>
</package>

实现Interceptor接口

void init():初始化拦截器所需资源

void destroy():释放在init()中分配的资源

String intercept(ActionInvocation ai) throws Exception

实现拦截器功能

利用ActionInvocation参数获取Action状态

返回结果码(result)字符串

继承AbstractInterceptor类

提供了init()和destroy()方法的空实现

只需要实现intercept方法即可

推荐使用

时间: 2024-10-15 07:08:05

struts2执行流程与拦截器介绍的相关文章

Struts2(XWork)拦截器的功能介绍:

  拦截器 名字 说明 Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变 Chaining Interceptor chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type="chain">)结合使用. Checkbox Interceptor checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,

struts2学习笔记---自定义拦截器

什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器.其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作. 实现原理 当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器. 拦截器的执行流程 1.对Action进行预处理.(正序执行) 2.拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定).

【Java EE 学习第69天】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】

昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) 1 public class UserAction implements modelDriven<User>(){ 2 private String name; 3 private User model; 4 public void setName(String name){ 5 this.name=name; 6 } 7 public St

Struts2基础学习(五)&mdash;拦截器

一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多个Interceptor 连在一起组成Interceptor 栈.     Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此在拦截器中如果使用类变量,要注意同步的问题.      注意:              (1

【struts2】预定义拦截器

1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个Struts-default.xml里面,因此我们需要到这个文件的struts-default包里去看一下.定义如下: 1 <interceptors> 2 <interceptor name="alias" class="com.opensymphony.xwor

Struts2执行流程

StrutsPrepareAndExecuteFilter是struts2框架的核心控制器,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求,如果用户请求以action结尾,该请求就会被转入struts2框架来处理. 1) 客户端发起一个请求(*.action) 2) 主控器StrutsPrepareAndExecuteFilter拦截请求 3) 主控器通过ActionMapper判断请求是否交给action处理.如果是,那么判断请求的action是否存在,如果不存在,报

struts执行过程和拦截器

struts执行过程和拦截器 Struts2执行过程 Struts2拦截器概述 1 struts2是框架,封装了很多的功能,struts2里面封装的功能都是在拦截器里面 2 struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器 3 struts2里面默认拦截器位置   4 拦截器在什么时候执行? (1)在action对象创建之后,action的方法执行之前 拦截器底层原理 1 拦截器底层使用两个原理 第一个 aop思想 (0)后面在spring里面把a

Struts2 源码分析——拦截器的机制

本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样子讲吧.拦截器的应用是sturts2核心的亮点之一.如果不明白拦截器是什么的话,那么你相当于没有学习过struts2.笔者本来想直接讲这一章的知识点.可是又怕读者可能对拦截器没有一个概念化的理解.为什么这么讲呢?struts2在设计拦截器这一个部分的内容.在笔者看来事实是以AOP为核心思想来设计的.

走进Struts2(二) — Struts2的基石(拦截器)

拦截器(Interceptor)是Struts2的基石,拦截器的主要作用是在Action执行之前和Result执行之后进行一些特定功能的处理机制. 如图,拦截器是用来负责在Action执行之前和Result执行之后处理一些功能的类.每个不同的拦截器,它们分别执行不同的功能处理,而运行的时机就是在Action执行之前和Result执行之后,需要注意的是在执行Action之前和Result之后,拦截器的执行顺序是正好相反的. 一.拦截器的好处 1.简化Action的实现,可以把很多功能从Action