Struts2拦截器的相关学习和配置操作
首先,来了解一下Struts2的拦截器在Struts中的作用:
拦截器(Interceptor)是一种可以在请求处理之前或者之后执行的Struts2组件。它是Struts2的核心,因为Struts2将它的核心功能放到了拦截器而不是集中在核心控制器中实现的。大部分的工作按照功能的分类给拦截器去完成,而拦截器可以自由选择,灵活组合,只需要在struts.xml配置文件中指定即可,从而增强了框架的灵活性。
拦截器的工作原理
拦截器是围绕着Action和Result的执行而执行,它的原理和Servlet Filter的实现原理差不多。以链式的方式执行,对要执行的方法(execute()
)进行拦截。首先顺序执行Action配置的拦截器,在执行之后,拦截器再一次执行(与先前调用相反的顺序),执行的过程可以看作一个递归的过程。
拦截器有一个三阶段的,有条件的执行周期:
- 做一些Action执行前的预处理;
- 调用ActionInvocation的
invoke()
方法将控制权转交给后续的拦截器或者返回结果字符串终止执行; - 做一些Action执行后的处理。
拦截器的基本语法:
(需要使用在<interceptors>
标签中进行拦截器的相关操作)
- 定义拦截器:
<interceptor />
- 使用拦截器(引用):
<interceptor-ref />
,如果在Action中引用的话,那么原本默认的defaultStack将会被替代,一般都会同自定义拦截器二次引用,或者定义拦截器栈,在指定引用的拦截器时将defaultStack引用,以便不影响操作(defaultStack会在后文中提到) - 定义拦截器栈:
<interceptor-stack>...</interceptor-stack>
,拦截器栈中可引用其他的拦截器栈或者再定义拦截器栈 (使用方式一致) - 定义默认的拦截器引用:
<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常用内置拦截器介绍
- params拦截器:是将请求的数据设置到Action的属性上。(提供了框架必不可少的功能)
- staticParams拦截器:是将在配置文件中通过
<action>
原色的子元素<param>
设置的参数设置到对应的Action属性中。 - servletConfig拦截器:它提供了一种将源于Servlet API的各种对象注入Action当中的简洁方法,但是Action必须实现相对应的接口。(这里就不做一 一介绍)
- fileUpload拦截器:是将文件和元数据从多重请求(multipart/form-data)转换成常规的请求数据,以便将它们设置到对应的Action属性上,实现文件的上传。(补充一点:在Struts2或Spring上进行文件的上传,都需要在
<form>
标签上设置属性enctype = "multipart/form-data"
,才可实现文件的上传) - validation拦截器:用于执行数据校验
- workflow拦截器:提供了当数据校验错误时终止执行流程的功能(相当于是一个工作流)
- exception拦截器:用于捕获程序中出现的异常(该拦截器应该位于定义的所有拦截器中的第一个)
Struts2内置拦截器栈介绍
在strut-default.xml中定义了一个非常重要的拦截器栈,只要在定义包的过程中继承struts-default包,那么就会是默认的拦截器引用:defaultStack。
它组合了多个拦截器,能够满足大多数web应用程序的需求。
关于Struts2的拦截器差不多就介绍到这里,如果有不对或者没补全的地方,欢迎大家指正和补充,谢谢。
未经同意禁止转发
——Cyan*