struts2注解总结----@InterceptorRef

5 篇文章 0 订阅
3 篇文章 0 订阅

写在前面:

本文主要讲的是注解方式的拦截器的使用,所以xml文件的不会细讲,文中的代码也比较简单,没有什么权限控制啊,拦截信息之类的代码,重点还是说明注解方式的使用方法,了解了使用方法之后,内容可以自行扩展,这个根据自己的需要来,好了,就这样。


上次写了@Action和@Result两种注解的使用方式,这次要讲的是@Interceptor和@ParentPackage


介绍:

@InterceptorRef/@InterceptorRefs:

@InterceptorRef可以就是用来配置拦截器的,有如下属性

  1. value:指定拦截器(栈)的名字,即在下面配置的name(一般只有value时,可以省略value)
  2. params:是一个字符串数组,用来传递参数

虽然是使用注解的方式,但是,还是需要在xml文件中预先配置好拦截器的信息

<interceptor name="interceptor1" class="struts2.interceptor.TestInterceptor1"></interceptor>
<interceptor-stack name="interceptorStack1">
	<interceptor-ref name="defaultStack"/>
	<interceptor-ref name="interceptor1"/>
</interceptor-stack>

具体的拦截器类如下

public class TestInterceptor1 extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		System.out.println("--------TestInterceptor1--------");
		return arg0.invoke();
	}
}

好了,这样就定义好了拦截器,如果使用xml配置的方式,那么我们需要使用下面的方式来使用拦截器

<action name="login" class="struts.action.xxx">
        <!--  
           ....
        -->
        <interceptor-ref name="interceptorStack1"/>
</action>
既然Action都是用注解配置的,那么这时的拦截器就不需要写在这了,具体配置有两种方式,一种是配置在类上的,另外一种是配置在方法上的,下面是配置在方法上的(action例子还是上次文章的例子,具体-> 别点我,别点我!!不要啊~~)

@Namespace("/")
@ParentPackage("default")
public class TestAction1 extends ActionSupport {

	@Action(value = "add", 
		results = { @Result(name = "add", location = "/add.jsp")},
		interceptorRefs={
			@InterceptorRef("interceptorStack1")
	})
	public String add() throws Exception {
		return "add";
	}
}

interceptorRefs可以放多个@InterceptorRef,和results类似

当访问/add的时候,控制台会打印出 ---> --------TestInterceptor1--------


接下来是在类上使用注解

@Namespace("/")
@ParentPackage("default")
@InterceptorRefs({
	@InterceptorRef("interceptorStack1")
})
public class TestAction1 extends ActionSupport {

	@Action(value = "add", 
		results = { @Result(name = "add", location = "/add.jsp")}
	)
	public String add() throws Exception {
		return "add";
	}
}
这样的效果和上面的是一样的,访问响应的action会打出  --->  --------TestInterceptor1--------
@InterceptorRefs可以配置多个拦截器,和在@Action中指定interceptorRefs= {}类似,当然,也可以只用@InterceptorRef指定一个拦截器

好了,这就是两种使用的方式,从上面的例子看来,好像没有什么区别,其实,区别还是有的,接下来先看下面的action

@Namespace("/")
@ParentPackage("default")
@InterceptorRef("interceptorStack1")
public class TestAction1 extends ActionSupport {

	@Action(value = "add", results = { @Result(name = "add", location = "/add.jsp") })
	public String add() throws Exception {
		return "add";
	}

	@Action(value = "delete", results = { @Result(name = "delete", location = "/delete.jsp") })
	public String delete() throws Exception {
		return "delete";
	}
}
这样当访问/delete和/add时都会打印出  --->  --------TestInterceptor1--------
即配置在类上的拦截器是作用在所有方法上的

再看下下面混合使用两种方式

@Namespace("/")
@ParentPackage("default")
@InterceptorRef("interceptorStack1")
public class TestAction1 extends ActionSupport {

	@Action(value = "add", 
		results = { @Result(name = "add", location = "/add.jsp")},
		interceptorRefs = {
			@InterceptorRef("interceptorStack2")
	<span style="white-space:pre">	</span>}
	)
	public String add() throws Exception {
		return "add";
	}
	
	@Action(value = "delete", results = { @Result(name = "delete", location = "/delete.jsp") })
	public String delete() throws Exception {
		return "delete";
	}
}

当访问/delete时会打印出 ---> --------TestInterceptor1--------

这是当然的,delete方法并没有什么改变,和上面作用在类上的拦截器的例子一样,拦截器1会拦截器该方法

而访问/add的时候会发生什么?这时会打印出

 ---> --------TestInterceptor1-------- 和 

---> --------TestInterceptor2--------

(拦截器2和1的定义和1一样,只是将1改成2)

这就是作用在方法上的拦截器和定义在类上的区别

定义在方法上的拦截器会只拦截这个方法,而定义在类上的拦截器会拦截所有的方法



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值