Struts2-自定义拦截器

自定义拦截器

一、架构


二、拦截器创建

方式1:

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

//拦截器:第一种创建方式
//拦截器生命周期:随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor {
	@Override
	//初始化方法
	public void init() {
		
	}
	@Override
	//拦截方法
	public String intercept(ActionInvocation arg0) throws Exception {
		return null;
	}
	@Override
	//销毁方法
	public void destroy() {
		
	}
}

方式2:

//创建方式2: 继承AbstractInterceptor -> struts2的体贴
//帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法
public class MyInterceptor2 extends AbstractInterceptor {
	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		
		return null;
	}
}

方式3:

//继承:MethodFilterInterceptor 方法过滤拦截器
//功能: 定制拦截器拦截的方法.
//	定制哪些方法需要拦截.
//	定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		//前处理
		System.out.println("MyInterceptor3 的前处理!");
		//放行
		String result = invocation.invoke();
		//后处理
		System.out.println("MyInterceptor3 的后处理!");
		
		return result;
	}
}

三、拦截器api

1、放行

//放行
String result = invocation.invoke();

2、前后处理

//前处理
System.out.println("MyInterceptor3 的前处理!");
//放行
String result = invocation.invoke();
//后处理
System.out.println("MyInterceptor3 的后处理!");

3、不放行,直接跳转到一个结果页面

return SUCCESS;
不执行后续的拦截器以及Action,直接交给Result处理结果,进行页面跳转


四、拦截器配置

步骤1:注册拦截器 --> 步骤2:配置拦截器栈 --> 步骤3:指定包中默认拦截器栈

<?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="inter" namespace="/" extends="struts-default" >
	<interceptors>
	        <!-- 1.注册拦截器 -->
		<interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3"></interceptor>
	        <!-- 2.注册拦截器栈 -->
		<interceptor-stack name="myStack">
			<!-- 自定义拦截器引入(建议放在20个拦截器之前) -->
			<interceptor-ref name="myInter3">
				<!-- 指定哪些方法不拦截
				 <param name="excludeMethods">add,delete</param> -->
				 <!-- 指定哪些方法需要拦截 -->
				 <param name="includeMethods">add,delete</param>
			</interceptor-ref>
			<!-- 引用默认的拦截器栈(20个) -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</interceptor-stack>	
	</interceptors>
	        <!-- 3.指定包中的默认拦截器栈 -->
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
		<action name="Demo1Action_*" class="cn.itcast.a_interceptor.Demo1Action" method="{1}" >
			<!-- 为Action单独指定走哪个拦截器(栈) 
			<interceptor-ref name="myStack"></interceptor-ref>-->
			<result name="success" type="dispatcher" >/index.jsp</result>
		</action>
	</package>
	<package name="tag" namespace="/" extends="struts-default" >
		<action name="Demo2Action" class="cn.itcast.b_tag.Demo2Action" method="execute" >
			<result name="success" type="dispatcher" >/tag1.jsp</result>
		</action>
		<action name="Demo3Action" class="cn.itcast.b_tag.Demo3Action" method="execute" >
			<result name="success" type="dispatcher" >/tag2.jsp</result>
		</action>
	</package>
</struts>

如何定制拦截方法:

<!-- 指定哪些方法不拦截 -->
<param name="excludeMethods">add,delete</param>
<!-- 指定哪些方法需要拦截 -->
<param name="includeMethods">add,delete</param>

全局结果集:

<!-- 定义全局结果集 -->
<global-results>
        <result name="toLogin" type="redirect">/login.jsp</result>
</global-results>

猜你喜欢

转载自blog.csdn.net/w_meng_h/article/details/80333853