为了实现自定义拦截器,Struts2提供了Interceptor接口,以及对该接口实现的一个抽象拦截器类(AbstractInterceptor)。实现拦截器类一般可以实现Interceptor接口,或者直接继承AbstractInterceptor类。Struts2还提供了一个MethodFilterInterceptor类,该类是AbstractInterceptor类的子类,若要实现方法过滤,就需要继承MethodFilterInterceptor,设计方法拦截器。
用户定义一个拦截器一般需要一下3个步骤:
- 自定义一个实现Interceptor接口(或继承AbstractInterceptor或继承MethodFilterInterceptor)的类。
- 在struts.xml中注册上一步中定义的拦截器。
- 在需要使用的Action中引用上述定义的拦截器。
先写一个input.jsp页面,让它跳转到Action中
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="Action1.action">请点击跳转</a>
</body>
</html>
Action.java
package Action;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("Action1执行了");
return SUCCESS;
}
}
再写个要跳转到的jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// System.out.println("拦截器01执行了");
%>
</body>
</html>
还有拦截器,我用的是继承AbstractInterceptor类。
拦截器1.java
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class interceptor1 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("拦截器1执行了...");
String Obj = invocation.invoke();
System.out.println("拦截器1执行结束了...");
return Obj;
}
}
拦截器2.jsp
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class interceptor2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("拦截器2执行了...");
String Obj = invocation.invoke();
System.out.println("拦截器2执行结束了...");
return Obj;
}
}
然后还要配置struts.xml文件
<package name="default" namespace="/" extends="struts-default">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="interceptor1" class="interceptor.interceptor1">
</interceptor>
<interceptor name="interceptor2" class="interceptor.interceptor2">
</interceptor>
<!-- 定义拦截器栈 -->
<!-- 引入拦截器(一旦引入自定义的拦截器,默认拦截器栈的拦截器就不执行了) -->
<interceptor-stack name="myStack">
<!-- 引入默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引入自定义拦截器 -->
<interceptor-ref name="interceptor1"></interceptor-ref>
<interceptor-ref name="interceptor2"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="Action1" class="Action.Action1">
<result>/拦截器01.jsp</result>
<interceptor-ref name="myStack"></interceptor-ref>
</action>
</package>
运行结果: