Struts2拦截器

Struts2拦截器概述

拦截器:Interceptor

------------------------------

拦截器Interceptor):Struts2拦截器是在访问某个ActionAction的某个方法之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是 Spring AOP的一种实现.

 

AOP:面向切面编程.其实现原理:动态代理模式

 

WebWork中文文档解释:拦截器是动态拦截Action调用的对象。它提供了一种机制使开发者可以定义在一个Action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取Action中可重用的代码的方式。

 

拦截器栈InterceptorStack:Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

-----------------------------------------------------------------

拦截器的作用

---------------------------------------------------

DRY原则:Dont't Repeat Yourself.

拦截器在设计和程序结构上的优点:

  拦截器能把很多功能从Action中独立出来,分散到不同的拦截器里面,减少了Action的代码。如此,拦截器和Action本身的功能都更单一了。当通用的功能代码被封装在拦截器里面(代码模块化),就可以对不同的Action,根据功能需要,来配置相应功能的拦截器了。提高了拦截器所实现的功能的重用性,也变相实现了装配式和可插拔式的体系结构,使得整个系统结构变得更灵活。

 

1.简化Action的实现

2.功能更单一

3.通用代码模块化

4.提高重用性

 

 

Struts2Action的执行流程


 

Struts2Action的执行流程

----------------------------------------------------------

.客户端发送请求;

.该请求经过一系列的过滤器(Filter):其中可选过滤器ActionContextCleanUp,帮助Struts2和其他框架集成。例如:SiteMesh Plugin

.接着FilterDispatcher(前端控制器)被调用,FilterDispatcher询问ActionMapper,来决定该请求是否需要调用某个Action拦截器只对Action作拦截

.ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxy

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

.ActionProxy创建一个ActionInvocation的实例。

.ActionInvocation实例调用Action的前后,涉及到相关拦截器(Intercepter)的调用。

.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。返回结果是一个JSP或其他页面(也可以是其他的Action) JSP页面展现可使用Struts2框架中的标签(该过程会涉及ActionMapper)

-----------------------------------------------------------------

在上述整个过程中,Struts2框架中会产生很多对象,都是由Struts2中的xwork容器负责创建的-ObjectFactory

 

Struts2内置拦截器

Struts2之所有强大,是因为它内置了很多拦截器,Struts2框架中自定义的,可以直接拿来使用的拦截器.

不同的拦截器栈(interceptor-stack)是不同拦截器的组合,用户根据不同的需求选择不同的拦截器栈.

Struts2中内置的拦截器:

struts-core-2.3.x.jar--->struts-default.xml

------------------------------------------

常见的拦截器:

1:params拦截器

   这个拦截器偷偷的把请求参数设置到相应的Action的属性去的,并自动进行类型转换。       

2.modelDriven拦截器

   如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中。

 

3.execption拦截器

   顾名思义,在抛出异常的时候,这个拦截器起作用。最好把它放在第一位,让它能捕获所有的异常。

 

4.validation拦截器

   调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。

 

5.token拦截器

   核对当前Action请求(request)的有效标识,防止重复提交Action请求。

 

6.fileUpload拦截器

    用来处理文件上传

 

7.workflow拦截器

     调用Actionvalidate方法,一旦有错误返回,重新定位到INPUT结果视图

在校验的时候,如果有错误,将将错误信息放到一个List集合中,此时workflow拦截器来判断List集合中是否有数据,如果有就返回一个逻辑试图名称为input

 

8.servletConfig

    通过感知接口,获取感应对象

 

自定义拦截器

步骤1.定义拦截器类

      方式1:实现com.opensymphony.xwork2.interceptor.Interceptor接口.

      方式2:继承com.opensymphony.xwork2.interceptor.AbstractInterceptor.

 

public class LoginInterceptor extends MethodFilterInterceptor{
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		ActionContext act = invocation.getInvocationContext();
		
		Map<String, Object> session = act.getSession();
		Object user = session.get("user");//假设登录成功后session中 会有一个user的对象
		if(user == null){
			//没有登录
			return "login";
		}
		return invocation.invoke();
	}

}

步骤2.struts.xml中注册拦截器,告诉Struts2

      第一步:先在<package>中声明拦截器CheckLoginInterceptor.

      第二步:<action>中来引用CheckLoginInterceptor拦截器.

第三步:设置当前<package>使用的拦截器栈.

 

<package name="my" namespace="/" extends="struts-default">
	
		<!-- 配置自定义的拦截器 -->		
		<interceptors>
			<!-- 1.定义一些列的拦截器或者拦截器栈 -->
			<!-- 这个拦截器 extends MethodFilterInterceptor
				可以配置一些参数 - 参数对应的是MethodFilterInterceptor抽象类中的成员属性
			 -->
			<interceptor name="loginInterceptor" class="com.aowin.interceptor.LoginInterceptor">
				<!-- 包含的方法需要调用该拦截器 -->
				<!-- <param name="includeMethods">insert,update</param> -->
				<!-- 不包含的方法需要调用该拦截器 -->
				<param name="excludeMethods">select</param>
			</interceptor>
			
			<!-- 2.定义拦截器栈 -->
			<interceptor-stack name="myStack">
				<interceptor-ref name="loginInterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		
		<!-- 3.设置当前的package的action使用的拦截器栈 -->
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
		
		
		<action name="index" class="com.my.action.IndexAction">
			<result>/index.jsp</result>
		</action>		
		<action name="t*" class="com.my.action.UserAction" method="{1}">
			<result>/index.jsp</result>
			<result name="login">/login.jsp</result>
		</action>
		
	</package>

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值