struts2中的拦截器详解。

一.struts2中的拦截器简介

拦截器是在某个方法或者字段被访问之前进行拦截,然后在之前或者之后加入某些操作的手段。拦截器的方法大多数通过代理来实现,struts2中的拦截器实现比较简单,当请求到达strut2的servletdispatcher时,struts2会查找配置文件,并根据配置文件实例化相对的拦截器对象,然后串成一个列表,最后一个一个调用列表中的拦截器。struts2提供了很多内置的拦截,大多数情况都能满足需求,当开发者有特殊需求时,可自定义拦截器。

二.struts2中自定义拦截器的三种方式

自定义拦截器需要直接或者间接实现Interceptor类。该类定义为。

	public interface Interceptor extends Serializable
	{
		void init();
		void destroy();
		String interceptor (ActionInvocation invocation)throw Exception; 
	}

其中,init()方法在拦截器创建时就被调用,在拦截器整个生命周期中只被调用一次,可用来对相关资源做初始化。

destroy()方法,在拦截器实例被销毁之前,用来对拦截器相关的资源进行释放,也只被执行一次。

interceptor()方法,是拦截器的核心方法,用来实现具体的拦截操作。返回字符用来跳转到相应的视图页面,

其中,ActionInvocation参数中包含被拦截的action的引用,可以通过该参数的invoke()方法转给下一个拦

截器或者转到action的execute()方法;

自定义拦截器方法一

直接实现interceptor,在自定义拦截器中实现拦截器接口定义的方法。

自定义拦截器方法二

继承AbstractInterceptor,该抽象类的具体实现如下。

	public abstract class AbstractInterceptor implements Interceptor
		{
			void init(){};
			void destroy(){};
			String interceptor (ActionInvocation invocation)throw Exception; 
		}
由此可见,AbstractInterceptor类已经对Interceptor接口进行了空实现,自定义拦截器只需要实现interceptor方法即可,

在需要打开系统资源时,才覆盖init()和destroy()。

自定义拦截器方法三

实现过滤方法的拦截器MethodFilterInterceptor,此拦截器继承了AbstractInterceptor ,是一个拦截某一个具体的方法的方法过滤拦截器,并且,已经自动实现好了Intercept()方法 ,因此,我们想要拦截某一个方法的时候,只要继承MethodFilterInterceptor类,然后实现doIntercept()就可以 。实例如下。

		public class MyInterceptor extends MethodFilterInterceptor {  
   		 @Override  
   		 protected String doIntercept(ActionInvocation invocation) throws Exception {  
      			  System.out.println("------MyInterceptor invoked begin------");  
        		  String result = invocation.invoke();  
      			  System.out.println("------MyInterceptor invoked finish------");  
        		 return result;  
  	 	 }  
		}  

三.自定义拦截器的配置。

拦截器的配置在strut.xml中完成,使用标签<interceptors>

步骤一:注册拦截器。

注册拦截器用<interceptor>标签。语法格式如下。

name属性用来指定拦截器的名字,class属性用来指定拦截器的实现类,<param>用来传入参数。

步骤二:配置拦截器栈

在实际开发中,需要在action执行前后同时执行多个拦截动作,此时可把多个拦截器组成一个拦截器栈。

定义拦截器栈使用<interceptor-stack>,当配置多个拦截器,使用<interceptor-ref>来指定多个拦截器,

语法格式如下。

小结,以上两步的配置可以总结为下图所示。

以上配置中,定义的拦截器栈是myStack,除了引进两个自定义的拦截器interpretor1和interpretor2外,

还引用了一个内置的拦截器栈defaultStack,并且,这个拦截器必须要引入。

步骤三:定制拦截方法

在拦截器栈配置时,定制方法的拦截,使用标签<param>,语法实例如下。

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

步骤四:指定包中默认拦截器栈

使用标签<default-interceptor-ref>,为包指定默认的拦截器。语法格式如下。

			<default-interceptor-ref name="myStack"></default-interceptor-ref>
还可以为单独的action指定拦截器,使用标签<interceptor-ref>,语法格式如下。
			<interceptor-ref name="myStack"></interceptor-ref>

四.总结

拦截器是实现struts2的基础,熟悉掌握自定义拦截器能够更好的发挥strut2的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值