欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

struts2中的拦截器详解。

程序员文章站 2022-07-09 17:16:43
...

一.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>标签。语法格式如下。

struts2中的拦截器详解。

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

步骤二:配置拦截器栈

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

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

语法格式如下。

struts2中的拦截器详解。

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

struts2中的拦截器详解。

以上配置中,定义的拦截器栈是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的功能。