定义自己的拦截器------.[核心组件拦截器底层揭秘-01]

本文介绍如何在Struts2框架中自定义拦截器,包括创建拦截器类、配置拦截器以及使用拦截器栈的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何配置自己的拦截器


所有的拦截器都是继承【虚拟类】AbstractInterceptor

虚拟类AbstractInterceptor实现接口:Interceptor


所以,自定义拦截器的时候,

第一步需要继承虚拟类AbstractInterceptor

创建拦截器类:

public class Myinterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		
		System.out.println("做一些前置工作");
		
		//让拦截器向下走,并且返回结果代码:成功或者失败
		String invoke = invocation.invoke();
		
		System.out.println("做一些后置工作");
		
		return invoke;
	}

}

2.创建好拦截器的类后,还需要在struts2.xml中配置拦截器

第一种类似于局部配置

代码:


<package name="person" extends="struts-default" namespace="/person">
		<!-- 
			拦截器的配置
			类似于局部配置
		 -->
		<interceptors>
			<!-- 
				第一个参数是拦截器的name自己取
				第二个参数是拦截器类的全路径
			 -->
			<interceptor name="myinterceptor" class="com.rl.intereptor.Myinterceptor"></interceptor>
		</interceptors>
		
		<action name="renliang" class="com.rl.action.PersonAction" method="save">
			<!-- 
				配置完成以后,那个类要使用,就必须在那个类中引用一下
				name的值是上面拦截器name中的值
			 -->
			<interceptor-ref name="myinterceptor"></interceptor-ref>
			<result name="success">/success.jsp</result>
			<result name="input">/form.jsp</result>
		</action>
	</package>	

拦截器执行的顺序:

前置拦截器--->Action--->页面(jsp)--->后置拦截器


但是,使用这个方法配置的话,如果有很多个action,需要在每个action中配置一次拦截器,很繁琐

另外一种配置方法:

创建一个package命名为:my-interceptor,继承默认的配置文件struts-default

同时是虚拟包,abstract=true

在这个包中定义拦截器在定义各种拦截器

<package name="my-interceptor" extends="struts-default" abstract="true">
		<interceptors>
			<interceptor name="myinterceptor" class="com.rl.intereptor.Myinterceptor"></interceptor>
		</interceptors>
	</package>


然后在下面有action的包在继承刚刚定义的这个包my-interceptor,然后在包中定义默认拦截器,

<default-interceptor-ref name="myinterceptor"></default-interceptor-ref>

同样这个方式也有缺陷,需要用到拦截器栈:

如何定义拦截器栈?

1.创建一个包,继承Struts-default  同样是abstract=true

然后在这个包中自定义自己的拦截器

然后自定义自己的拦截器栈

栈中引用刚刚自己定义的拦截器,同时还需要引用默认的拦截器栈defaultStack


定义好之后,在包中还需要定义一下默认的拦截器栈

ref

代码如下

<package name="my-interceptorSrack" extends="struts-default" abstract="true">
		<interceptors>
			<!-- 配置自己的拦截器 -->
			<interceptor name="myInterceptor" class="com.rl.intereptor.Myinterceptor"></interceptor>
			
			<!-- 配置拦截器栈 -->
			<interceptor-stack name="rlStack">

				<!-- 拦截器栈中要引用已经配置好的拦截器或者拦截器栈 -->
				<interceptor-ref name="myInterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>

			</interceptor-stack>

		</interceptors>
		
		<!-- 把自己配置的rlStack拦截器栈设置成默认的拦截器,只要继承了my-interceptorSrack,就默认执行rlStack中的所有拦截器 -->
		<default-interceptor-ref name="rlStack"></default-interceptor-ref>
	</package>

之后,只要创建包,只要继承这个包,那么就可以使用自定义的拦截器和默认的拦截器。。。。


<package name="person" extends="my-interceptorSrack" namespace="/person"></package>

2018年5月12日15:42:13。。。。

www.88kan.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值