Struts2拦截器的相关学习和配置操作

Struts2拦截器的相关学习和配置操作

首先,来了解一下Struts2的拦截器在Struts中的作用:
拦截器(Interceptor)是一种可以在请求处理之前或者之后执行的Struts2组件。它是Struts2的核心,因为Struts2将它的核心功能放到了拦截器而不是集中在核心控制器中实现的。大部分的工作按照功能的分类给拦截器去完成,而拦截器可以自由选择,灵活组合,只需要在struts.xml配置文件中指定即可,从而增强了框架的灵活性

拦截器的工作原理

拦截器是围绕着Action和Result的执行而执行,它的原理和Servlet Filter的实现原理差不多。以链式的方式执行,对要执行的方法(execute())进行拦截。首先顺序执行Action配置的拦截器,在执行之后,拦截器再一次执行(与先前调用相反的顺序),执行的过程可以看作一个递归的过程
拦截器有一个三阶段的,有条件的执行周期:

  • 做一些Action执行前的预处理;
  • 调用ActionInvocation的invoke()方法将控制权转交给后续的拦截器或者返回结果字符串终止执行;
  • 做一些Action执行后的处理。

拦截器的基本语法:

(需要使用在<interceptors> 标签中进行拦截器的相关操作)

  1. 定义拦截器:<interceptor />
  2. 使用拦截器(引用):<interceptor-ref /> ,如果在Action中引用的话,那么原本默认的defaultStack将会被替代,一般都会同自定义拦截器二次引用,或者定义拦截器栈,在指定引用的拦截器时将defaultStack引用,以便不影响操作(defaultStack会在后文中提到)
  3. 定义拦截器栈:<interceptor-stack>...</interceptor-stack>,拦截器栈中可引用其他的拦截器栈或者再定义拦截器栈 (使用方式一致)
  4. 定义默认的拦截器引用:<default-interceptor-ref name="拦截器名称" />(并不在<interceptors>中使用)

实例代码:

<interceptors>
	<!--定义拦截器:name属性设置拦截器名称,class属性指定拦截器的全限定类名(二者缺一不可)-->
	<interceptor name="MyInterceptor" class="cn.cyan.interceptor.MyInterceptor" />

	<!--定义拦截器栈:name属性设置拦截器栈名称-->
	<interceptor-stack name="MyInterceptorStack">
		<!--指定引用的拦截器:name属性为引用的拦截器名称-->
		<interceptor-ref name="MyInterceptor" />
		<!--引用默认的拦截器-->
		<interceptor-ref name="defaultStack" />
	</interceptor-stack>
</interceptors>

<!--定义默认的拦截器引用:“|”为与,并且的意思-->
<default-interceptor-ref name="MyInterceptor|MyInterceptorStack" />

<!--为Action引用拦截器-->
<action name="actionName" class="actionClass">
	<interceptor-ref name="MyInterceptor" />
</action>

自定义拦截器:

自定义的拦截器一定是直接或间接的实现接口com.opensymphony.xwork.interceptor.Interceptor,该接口提供了三个方法:init(),destroy()和intercept().
而实际操作中,直接继承com.opensymphony.xwork.interceptor.AbstractInterceptor类更是一种简单的实现拦截器的方式,这个类已经提供了init()和destroy()方法的空实现,这样我们就只需要实现intercept()即可。

实例代码:

//自定义拦截器
public class MyInterceptor extends AbstractInterceptor{
	//拦截方法:用于实现用户的登录判断操作
	public String intercept(ActionInvocation invocation){
		//获取用户session信息
		Map session = invocation.getInvocationContext().getSession();
		User user = (User)session.get("login");
		if(user == null){
			//终止执行,返回登录页面
			return Action.LOGIN;
		}else{
			//继续执行剩余的拦截器和Action
			return invocation.invoke();
		}
	}
	
}

Struts2常用内置拦截器介绍

  1. params拦截器:是将请求的数据设置到Action的属性上。(提供了框架必不可少的功能)
  2. staticParams拦截器:是将在配置文件中通过<action>原色的子元素<param>设置的参数设置到对应的Action属性中。
  3. servletConfig拦截器:它提供了一种将源于Servlet API的各种对象注入Action当中的简洁方法,但是Action必须实现相对应的接口。(这里就不做一 一介绍)
  4. fileUpload拦截器:是将文件和元数据从多重请求(multipart/form-data)转换成常规的请求数据,以便将它们设置到对应的Action属性上,实现文件的上传。(补充一点:在Struts2或Spring上进行文件的上传,都需要在<form>标签上设置属性enctype = "multipart/form-data",才可实现文件的上传)
  5. validation拦截器:用于执行数据校验
  6. workflow拦截器:提供了当数据校验错误时终止执行流程的功能(相当于是一个工作流)
  7. exception拦截器:用于捕获程序中出现的异常(该拦截器应该位于定义的所有拦截器中的第一个)

Struts2内置拦截器栈介绍

在strut-default.xml中定义了一个非常重要的拦截器栈,只要在定义包的过程中继承struts-default包,那么就会是默认的拦截器引用:defaultStack。
它组合了多个拦截器,能够满足大多数web应用程序的需求。

关于Struts2的拦截器差不多就介绍到这里,如果有不对或者没补全的地方,欢迎大家指正和补充,谢谢。

未经同意禁止转发

——Cyan*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值