拦截器基础知识

拦截器基础知识

         拦截器是struts2的重要组成部分,拦截器拦截到用户的请求之后,大量拦截器将会对对用户请求进行处理,然后才调用用户开发的Action实例的方法来处理请求。

         Struts2已经默认启用了大量通用功能的拦截器,只要我们配置Action的package继承了struts-default包,这些拦截器就会起作用。

         Struts2内建了大量的拦截器,这些拦截器以name-class 对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识;class指定了该拦截器的实现类。

几个内建拦截器:

params:是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。

prepare:如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。

 

配置拦截器:

         在struts.xml文件中定义拦截器只需为拦截器指定一个拦截器名,就完成拦截器定义。

定义拦截器使用<interceptor.../>元素来定义,格式如下:

<interceptor name="拦截器名" class="拦截器实现类"/>

 

还可以把多个拦截器连在一起组成拦截器栈。

         如果需要在Action执行前同时做登录检查、安全检查和记录日志,则可以把这三个动作对应的拦截器组成一个拦截器栈。定义拦截器栈使用<interceptor-stack .../>元素,拦截器栈是由多个拦截器组成的。因此需要在<interceptor-stack.../>元素中使用<interceptor-ref.../>元素来定义多个拦截器引用。即拦截器栈由多个<interceptor-ref.../>元素指定的拦截器组成。

从程序功能上来看,拦截器栈和拦截器是统一的,它们包含的方法都会在Action的execute方法执行之前自动执行。

因为拦截器栈和拦截器的功能几乎完全相同,可以出现以下情况:拦截器栈里可以包含拦截器栈。一个拦截器栈中包含另一个拦截器栈,而不是直接写成另一个拦截器栈中所包含的所有拦截器,是为了软件复用

使用拦截器栈:

一旦定义了拦截器栈和拦截器后,可以使用这个拦截器栈和拦截器来拦截Action了,拦截器(包含拦截器栈)的拦截行为将会在Action的execute方法执行之前被执行。

配置默认拦截器:

当配置一个包时,可以为其指定默认拦截器(栈)。一旦为某个包指定了默认的拦截器,如果该包中的Action没有显示指定拦截器,则默认的拦截器将会起作用。

配置默认拦截器使用<default-interceptor-ref.../>元素,该元素作为<package.../>元素的子元素使用,为该包下的所有Action配置默认的拦截器。

配置默认拦截器是一种使用拦截器的方式——避免在每个Action中单独配置拦截器,通过在该包下配置拦截器,可以实现为该包下所有Action同时配置相同的拦截器。

实现拦截器类:

大部分Web应用的通用功能,都可以通过直接使用这些拦截器来完成。

如果用户要开发自定义的拦截器类,应该实现com.opensymphony.xwork2.interceptor.Interceptor接口。该接口里包含了如下三个方法:

Init():在该拦截器被实例化之后,在该拦截器执行拦截之前,系统将回调该方法。

对于每个拦截器而言,其init()方法只执行一次。因此,该方法的方法体主要用于初始化性资源,例如数据库连接等。

Destroy():该方法与init()方法对应。在拦截器实例被销毁之前,系统回调该拦截器的destroy方法,该方法用于销毁init()方法里打开的资源。

Intercept(ActionInvocationinvocation):该方法是用户需要实现的拦截动作。就像Action的execute一样,intercept方法会返回一个字符串作为逻辑视图。如果该方法直接返回了一个字符串,系统会跳转到该逻辑视图对应的实际视图资源,不会调用被拦截的Action.

拦截方法的拦截器:

在某些情况下,不想拦截所有的方法,只需要拦截指定的方法,就使用struts2拦截器的方法过滤特性。Struts2提供了一个MethodFilterInterceptor类。

 

 

 

<actionname="viewBook">

         <result>/WEB-INF/content/viewBook.jsp</result>

         <interceptor-ref name="defaultStack"/>

         <interceptor-ref name="authority"/>

</action>

上面名为viewBook的Action,没有指定class属性,默认使用ActionSupport类。

 

 

考虑到这个拦截器的重复使用,可能多个Action都需要跳转到login逻辑视图,故将login的结果映射定义成一个全局结果映射。

<global-results>

         <result name="login">/WEB-INF/content/login.jsp</result>

</global-results>

 

 

 

 

以上只是个人的看书笔记,可能有点乱。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值