Struts2自定义拦截器

本文详细介绍Struts2拦截器的实现与应用,包括自定义拦截器类、配置注册及在Action中引用的方法。深入解析Interceptor接口与AbstractInterceptor类,演示如何通过拦截器监控和控制Action执行流程。

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

基本步骤

1、自定义一个类,直接或间接实现Interceptor接口
(间接实现:继承AbstractInterceptor类)
在这里插入图片描述
2、在struts.xml中注册自定义的拦截器类

<interceptors>
			<interceptor
				name="myInterceptor"
				class="com.rain.interceptor.MyInterceptor" />
			<interceptor
				name="interceptor"//名字自定义
				class="com.rain.interceptor.Interceptor2" />//类的全路径名
		</interceptors>

3、在需要使用拦截器的Action中****引用已注册的拦截器

	<action
			name="my"
			class="com.rain.action.MyAction">
			<interceptor-ref name="my"></interceptor-ref>
			<result name="success" type="chain">next</result>

		</action>

Interceptor

实现Interceptor 接口的,必须实现所有方法。

public interface Interceptor extends Serializable {

    void destroy();
    void init();
    String intercept(ActionInvocation invocation) throws Exception;
}
public class Interceptor2 implements Interceptor {
	
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		return invocation.invoke();
	}
	@Override
	public void destroy() {}

	@Override
	public void init() {}

}

方法介绍
Øvoid init():

该方法在拦截器实例创建后、intercept()方法被调用之前调用,用于初始化拦截器所需要的资源,例如数据库连接的初始化。该方法只执行一次。

Øvoid destroy():

该方法在执行Action之后,拦截器实例被销毁之前调用,用于释放在init()方法中分配的资源。该方法只执行一次。

ØString intercept(ActionInvocation invocation) throws Exception:

  1. 该方法在Action执行之前被调用,利用invocation参数,可以获取action执行的状态。
  2. 在intercept()方法中,如果要继续执行后续的部分(包括余下的应用于Action的拦截器、Action和Result),可以调用invocation.invoke()。
  3. 如果要终止后续的执行,可以直接返回一个结果码,框架将根据这个结果码来呈现对应的结果视图。需要调用invocation.invoke()

*【ActionInvocation常用方法】

1、public Object getAction():获取Action组件实例

2、public ActionContext getInvocationContext():获取Action运行环境,从而可获取各种Web元素。

3、public String invoke():如果有可调用的拦截器,则调用下一个拦截器,如果没有可调用的拦截器,则调用Action的业务方法。

AbstractInterceptor

  1. 实现AbstractInterceptor抽象类的,只需重写intercept方法即可。
  2. 它实现了Interceptor接口,并给出了init()和destroy()方法的空实现。拦截器类也可以选择继承AbstractInterceptor类,那么你只需要重写抽象的intercept()方法就可以了。
public abstract class AbstractInterceptor implements Interceptor {

    public void init() {}
    
    public void destroy() {}
    
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}

Struts2还提供了一个特殊的拦截器抽象基类

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor

这个拦截器可以指定要拦截或排除的方法列表。一般,拦截器将拦截Action的所有方法调用,但在某些情况,对某些方法的拦截将会出现一些问题。

例如:对表单字段进行验证的拦截器,当我们通过doDefault()方法输出表单时,该方法不应该被拦截,因此此时表单字段都没有数据。

  • excludeMethods 排除
  • includeMethods 拦截
<interceptor-ref name="validation">

  <param name="excludeMethods">input,back,cancel</param>
  <param name="includeMethods">execute</param>
</interceptor-ref>
  1. 当执行Action的input、back和cancel方法时,验证拦截器将不执行对输入数据的验证。
  2. 当执行Action的execute方法时,验证拦截器将执行对输入数据的验证。
  3. 在设置拦截器或排除的方法时,如果有多个方法,那么以逗号(,)分隔
  4. 如上所示。如果一个方法的名字同时出现在execludeMethods和includeMethods参数中,那么它会被当作要拦截的方法。也就是说, includeMethods优先于execludeMethods。

案例

在这里插入图片描述
编写拦截器
com.rain.interceptor.MyInterceptor

public class MyInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {

		System.out.println("自定义拦截器开始运行!");
		long startTime=System.currentTimeMillis();
		System.out.println("开始时间为:"+startTime);
		
		String result=invocation.invoke();
		
		System.out.println("自定义拦截器已经结束!");
		long endTime=System.currentTimeMillis();
		System.out.println("结束时间为:"+endTime);
		System.out.println("程序执行花费了:"+(endTime-startTime));

		return result;
	}

}

com.rain.interceptor.Interceptor2

public class Interceptor2 extends AbstractInterceptor {
	
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		
		System.out.println("执行第二个拦截器");
		return invocation.invoke();
	}

}

xml

	<package
		name="interceptor"
		namespace="/"
		extends="struts-default">

		<interceptors>
			<interceptor
				name="myInterceptor"
				class="com.rain.interceptor.MyInterceptor" />
			<interceptor
				name="interceptor"
				class="com.rain.interceptor.Interceptor2" />
			<interceptor-stack name="my">
				<interceptor-ref name="myInterceptor"></interceptor-ref>
				<interceptor-ref name="interceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>

		<action
			name="my"
			class="com.rain.action.MyAction">
			<interceptor-ref name="my"></interceptor-ref>
			<param name="aaa">你好aaa</param>
			<result name="success" >my.jsp</result>
		

		</action>
	</package>

Action

public class MyAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	public String aaa;
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("程序正在执行action");
		System.out.println("aaa的值"+this.aaa);
		return super.execute();
	}

}
对照前面的执行顺序

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值