Struts2拦截器有三种写法,这里都列举出来供大家参考。推荐使用最后一种 (拦截器就是一个java类)
第一种
package test;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
//拦截器:第一种创建方式
//拦截器生命周期:随着项目启动而创建。随着项目关闭而销毁
public class MyInterceptor implements Interceptor{
public void init() {
// TODO Auto-generated method stub
}
public void destroy() {
// TODO Auto-generated method stub
}
//拦截方法
public String intercept(ActionInvocation arg0) throws Exception {
// TODO Auto-generated method stub
return null;
}
}
第二种:
package test;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
//创建方式2:继承AbstractInterceptor
//帮我们空实现了 init 和 destory 方法,
public class MyInterceptor2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
return null;
}
}
第三种:
package test;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//继承:MethodFilterInterceptor 方法过滤拦截器
public class MyInterceptor3 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//前处理
System.out.println("前处理。。。");
//放行
invocation.invoke();
//后处理
System.out.println("后处理。。。");
//不放行直接跳转这个页面。
//不执行后续的拦截器以及action,直接交给Result处理结果及,进行页面跳转
return "success";
}
}
action书写
package test;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction extends ActionSupport{
public String execute() throws Exception {
System.out.println("DemoACtion");
return SUCCESS;
}
}
struts.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="hello" namespace="/" extends="struts-default">
<interceptors>
<!--1、注册拦截器 -->
<!-- name随便取 class 拦截器完整类名 -->
<interceptor name="myInter3" class="test.MyInterceptor3"></interceptor>
<!-- 2、注册拦截器栈 -->
<interceptor-stack name="myStack">
<!-- 自定义拦截器引入 (一般放在默认拦截器之前)name 和注册拦截器name一致 -->
<interceptor-ref name="myInter3"></interceptor-ref>
<!-- 默认20个拦截器栈 name属性值是定值-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 3、指定默认拦截器栈 整个包的拦截器 -->
<!-- name和注册拦截器栈name一致 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="DemoAction" class="test.DemoAction" method="execute">
<!--
为单独指定action走那个栈
<interceptor-ref name="myInter3"></interceptor-ref>
-->
<result name="success" >/hello.jsp</result>
</action>
</package>
</struts>
上面的三种拦截器随便选一个配上action和struts.xml就成了一个完整的拦截器。
当然仅仅是这样是无法完成我们的要求的,有时候我们配置了一个拦截器,并不需要拦截action所有的方法,只需要拦截部分方法,下面我就来教大家怎么配置拦截器,拦截部分方法。同样的给出代码
这个配置默认位置也给出来
action
interceptor
struts.xml (为了防止有人手打出错了,这里给出代码和图片)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="hello" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myInter1" class="interceptorMethod.Interceptor1"></interceptor>
<interceptor-stack name="myStack">
<!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
<interceptor-ref name="myInter1">
<!-- 两种方法取一个 -->
<!-- add 和 delete都是方法名, 方法名中间用逗号隔开 -->
<!--
指定哪些方法不拦截
<param name="excludeMethods">add,delete</param>
-->
<!-- 指定哪些方法需要拦截 -->
<param name="includeMethods">add</param>
</interceptor-ref>
<!-- 引用默认的拦截器栈(20个) -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- name -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="Demo1Action_*" class="interceptorMethod.Demo1Action" method="{1}">
<result name="success" >/hello.jsp</result>
</action>
</package>
</struts>