strutrs2
拦截器:
定义:提前对请求和响应进行处理,旨在把action冗余的代码惊醒提取
1、 使用拦截器的注意事项:
a) 拦截器的拦截顺序与使用有关
b) 拦截器只对本包有效,如果其他包想使用拦截器,需要进行包继承
c) 拦截器不仅可以拦截请求还可以拦截响应
d) 拦截器中的返回值,可以对请求的终止而做跳转(改变请求轨迹)
开发步骤:
2.写拦截器类
package com.zgw.souji.interceptor;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.util.ValueStack;
public class MyInterceptor implementsInterceptor {
/**
* 服务器关闭,销毁拦截器
*/
@Override
publicvoid destroy() {}
/**
* 服务器关闭,开启拦截器
*/
@Override
publicvoid init() {}
/**
* 对action请求提前处理,提取action中冗余代码
*
*/
@Override
publicString intercept(ActionInvocation at) throws Exception {
//获取值栈,用于管理数据
ValueStackstack = at.getStack();
//at.invoke();对action处理后向后传递,你不调用此方法,请求终止
System.out.println("我要拦截action");
at.invoke();
//跳转的jsp,和返回值excute()方法的返回值相同,通过返回值到配置文件
returnnull;
}
}
3.写配置(拦截器,拦截器栈,默认栈)
<!-- 配置拦截器 -->
<packagename="lanjieqipackage" extends="struts-default"
namespace="/lanjieqipackage">
<interceptors>
<!--注册的拦截器 -->
<interceptorname="lanjieqi" class="com.zgw.souji.interceptor.MyInterceptor"/>
<!-- 封装的拦截器栈 :把多次使用的多个拦截器封装为一个栈,直接使用拦截器栈,就可以享受多个拦截器的效果-->
<interceptor-stackname="fengzhuanglanjieqi">
<!--引入struts默认栈 :如果自己定义了默认栈,系统的拦截器就会失效 -->
<interceptor-refname="defaultStack"/>
<interceptor-refname="lanjieqi"/>
</interceptor-stack>
</interceptors>
<!--默认栈:对当前包下所有action都具有拦截的作用-->
<default-interceptor-refname="fengzhuanglanjieqi"/>
<actionname="myaction_*" class="com.zgw.souji.action.MyAction" method="{1}">
<resultname="shouye">/index.jsp</result>
</action>
</package>
4. 方法拦截器:从粒度角度,针对一个Action的某些方法进行拦截
开发步骤 :
写拦截器类:class MyMethodIn extends MethodFilterInterceptor
package com.zgw.souji.interceptor;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/**
* 方法拦截器
* @author Mr fage
* 2018-2-25下午4:03:48
*
*/
public class MyInterceptor1 extendsMethodFilterInterceptor {
@Override
protectedString doIntercept(ActionInvocation at) throws Exception {
at.invoke(); //请求向后继续传递
returnnull;
}
}
配置:
<!--方法拦截器 :针对action中某些方法进行拦截-->
<interceptorname="methodlanjieqi" class="com.zgw.souji.interceptor.MyInterceptor1">
<!--需要拦截的方法名 -->
<paramname="includeMethods">m1,m2</param>
<paramname="excludeMethods">m3,m4</param>
</interceptor>
<!--拦截器栈 -->
<interceptor-stackname="myStack">
<interceptor-refname="defaultStack"></interceptor-ref>
<interceptor-refname="methodlanjieqi"/>
</interceptor-stack>
</interceptors>