一、使用Struts拦截器
1.配置并使用Struts拦截器
1.1 配置拦截器
在Struts.xml文件中配置
<interceptor name="拦截器名称" class="实现类" >
<param name=" ">参数值</param>
</interceptor>
1.2 拦截器栈
拦截器栈中的各个拦截器是按照其定义的顺序执行的。
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="in1" class="class1" />
<interceptor name="in2" class="class2" />
<interceptor-stack name="myStack" >
<interceptor-ref name="in1" />
<interceptor-ref name="in2" />
<interceptor-ref name="defaultStack" /> !!defaultStack为Struts2内置拦截器栈
</interceptor-stack>
</interceptors>
</package>
1.3 默认拦截器
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="in1" class="class1" />
<interceptor name="in2" class="class2" />
<interceptor-stack name="myStack" >
<interceptor-ref name="in1" />
<interceptor-ref name="in2" />
<interceptor-ref name="defaultStack" /> !!defaultStack为Struts2内置拦截器栈</span>
</interceptor-stack>
</interceptors>
<!--配置包下的默认拦截器,既可以是拦截器,也可以是拦截器栈-->
<default-interceptor-ref name="myStack"/>
<action name=" " class=" ">
<result name=" ">/xxx.jsp</result>
</action>
</package>
1.4 使用拦截器
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="in1" class="class1" />
<interceptor name="in2" class="class2" >
<param name="paramName">value1</param>
</interceptor>
<interceptor-stack name="myStack" >
<interceptor-ref name="in1" />
<interceptor-ref name="in2" />
<param name="paramName">value2</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!--配置包下的默认拦截器,既可以是拦截器,也可以是拦截器栈-->
<default-interceptor-ref name="myStack"/>
<action name=" " class=" ">
<result name=" ">/xxx.jsp</result>
<!-- 应用自定义的拦截器in1和拦截器栈myStack -->
<interceptor-ref name="in1" />
<interceptor-ref name="myStack" >
<param name="in2.paramName">value3</param>
</interceptor-ref>
</action>
</package>
2. Struts2的内置拦截器
【 p246】表8.1 :常用拦截器器及描述
Struts2框架中的内置拦截器定义在struts-default.xml文件中。
二、自定义拦截器
1.开发自定义拦截器
需要实现com.opensymphony.xwork2.interceptor.Interceptor接口,接口源代码:
Public interface Interceptor extends Serializable{
void init();
void destroy();
String intercept(ActionInvocation invocation)throws Exception;
}
init() :拦截器执行之前调用init()方法,主要用于初始化系统资源。只执行一次
destroy() :拦截器实例被销毁之前,系统会调用该方法来释放和拦截器相关的资源。
intercept() :用来添加真正执行拦截工作的代码,实现具体的拦截工作。系统根据返回的字符串跳转到对应的视图资
源。ActionInvocation参数包含了被拦截的Action的引用,可通过其invoke()方法,将控制权转给下一个拦截
器或者Action的execute()方法。
实际中多是继承抽象拦截器类AbstractInterceptor。只有当自定义的拦截器类需要打开系统资源时,才需覆盖AbstractInterceptor类的init()和destroy()方法。
2.配置自定义拦截器
<interceptor name=" " class=" " />
3.拦截器执行顺序
Struts2拦截器机制采用“动作调用链”机制嵌套调用拦截器。 当在某个拦截器方法中调用invoke()方法时,就会调用下一个拦截器方法,如此嵌套调用下去,若是最后一个拦截器,则会调用Action的execute()方法。Action执行完后,依次返回执行拦截器中剩余代码,直至回到第一个拦截器,最后返回到结果视图。
4.方法过滤拦截器
可以有选择的拦截Action中的某个指定方法。
自定义方法过滤拦截器需继承MethodFilterInterceptor抽象类,该抽象类定义了一个doIntercept()抽象方法。
public class MyMethodFilterInterceptor extends MethodFilterInterceptor{
protected String doIntercept(ActionInvocation invocation)throws Exception{
String result = invocation.invoke();
return result;
}
}
方法过滤拦截器中新增了excludeMethods(不拦截)和includeMethods(拦截)两个参数,并提供了
public void setExcludeMethods(String excludeMethods)和
public void setIncludeMethods(String includeMethods)两个方法
<action name=" " class=" ">
<result>/xxx.jsp</result>
<interceptor-ref name=" ">
<param name="excludeMethods">execute,method1</param>
<param name="includeMethods">execute,method2,method3</param>
</interceptor-ref>
</action>
!! 拦截器与过滤器区别
过滤器普遍存在于整个Java Web中,范围更广,可过滤一切对象包括Action和JSP请求等.需要在web.xml中首先配置该过滤器,然后再进行其他Struts2的配置;
拦截器是Struts2框架特有的,只能拦截Action。
由于Struts2中规定将所有Jsp页面都放在WEB-INF下,访问时只能先访问Action,再通过Action访问Jsp。