Struts2拦截器介绍及说明

来源:互联网 发布:淘宝 自带 库存管理 编辑:程序博客网 时间:2024/06/05 09:25

Struts2拦截器简单介绍

                                                                       10级学员 林常禹课堂笔记

理解struts2中的拦截器

拦截器

在访问struts2中某个action之后或者之前,会自动调用的类,就是struts2中的拦截器,他具有的最大特点就是实现了AOP(面向切面编程),他是可插拔式的,也就是说它可以在需要使用的时候通过配置xml文件来实现,而在不使用的时候又不会影响整个框架的效果,这让struts2的拦截器具有非常好的扩展性

拦截器栈

Struts2中拦截器栈就是将拦截器按照一定的顺序连接在一起的链,当满足拦截的要求时,则会按照实现声明的顺序依次执行拦截器

DRY规则

即don’t repeat yourself,意思就是不书写重复的代码。因为在早起软件开发阶段,由于缺乏经验等原因,导致系统不同的地方会使用相同的办法,而大部分人的操作即将相同代码不断的“复制”,“粘贴”以完成功能实现,如下图示例

 

这样虽然对开发人员而言并不会造成多大的麻烦,但是在开发后的维护与检修过程中却造成了巨大的困扰。未来减少这种困扰就出现了DRY规则,而struts2拦截器则恰恰复合这个规则。

拦截器的意义

其实拦截器也可以理解为调用方法的一种改进。因为拦截器可以在目标对象执行以前由系统自动执行,而调用方法则必须显示的调用才可以。这就使拦截器本身拥有更高层次的解耦性。

拦截器的实现原理

Struts2底层的拦截器方法都是通过JDK中动态代理的方式调用的,感兴趣的同学可以都去学习一下这方面的知识,这里就不纤细赘述了。

Strut2中的拦截器作用

毫不夸张的说,sturts2本身只是一个空的容器,而是大量的拦截器让struts2拥有非常强大的功能,比如防止表单重复提交,进行输入校验…我们可以打开struts2-core.jar包下的struts-default.xml中看到struts2都实现了哪些拦截器。大家应该也都了解struts-default.xml这个文件是我们写struts.xml时需要继承的xml文件,其中就声明了大量的拦截器和拦截器栈。我们可以找到defaultStack这个拦截器栈,它就是struts2默认加载的拦截器栈,他提供了struts2的基本操作,比如得到参数并将参数赋值给对应的action中的属性……

注:当我们手动为某个action添加一个拦截器的时候,会让defaultStack自动无效,所以需要首先引用defaultStack然后再添加其他的拦截器(详细添加方法后续介绍)

自定义拦截器

Struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口,该接口声明了三个方法分别为init()、destroy()和iterceptor(ActionInvocation invocation);

Init()和destroy()方法是在程序启动和结束时各执行一次,无论该拦截器是否使用,只要在struts.xml中注册就会自动调用。

当然,struts2中也提供了几个抽象类来简化

public abstract class AbstractInterceptor implements Interceptor;
public abstract class MethodFilterInterceptor extends AbstractInterceptor;

其中AbstractInterceptor使用时只需要覆盖intercept()方法。

MethodFilterInterceptor额外提供了includeMethod和excludeMethod两个属性,用来执行该过滤器的action的方法。

 

如何配置拦截器

在struts.xml中的package标签中有interceptors标签,在其中可以声明拦截器和拦截器栈。

Interceptor标签即用来声明拦截器,其中有两个属性一个是name用来为声明的拦截器命名,方便以后的调用;另一个为class用来声明拦截器类。

Interceptor-stack即为声明拦截器栈的标签,他有个name属性用来给拦截器栈命名,该标签中可以定义子标签interceptor-ref,用来指定拦截器,其中的name属性即为拦截器或拦截器栈的名称。如下

[html] view plain copy
  1. <interceptors>  
  2.   
  3.            <interceptor name="loginInter" class="cn.csdn.hr.jdk.inter.IsLoginInterceptor"></interceptor>  
  4.   
  5.            <interceptor-stack name="testInter">  
  6.   
  7.             <interceptor-ref name="loginInteger"></interceptor-ref>  
  8.   
  9.            </interceptor-stack>  
  10.   
  11.  </interceptors>  
  12.   
  13.    

在package标签下也可以通过填写default-interceptor-ref来指定该package下的所有action中默认的拦截器,但如果action已经指定拦截器或栈则默认的无效。

<default-interceptor-ref name="testInter"></default-interceptor-ref>

 

在声明好后可以在action中添加interceptor-ref标签可以指定该action调用哪个拦截器或拦截器栈,如下例

[html] view plain copy
  1. <action name="login" class="cn.csdn.hr.action.LoginAction" method="login">  
  2.   
  3.            <result>login.jsp</result>  
  4.   
  5.            <result name="login">index.jsp</result>  
  6.   
  7.            <interceptor-ref name="defaultStack"></interceptor-ref>  
  8.   
  9.            <interceptor-ref name="loginInter"></interceptor-ref>  
  10.   
  11.  </action>  
  12.   
  13.    

在interceptor-ref中也可以通过param标签来设置一些特殊要求,param的name属性不同效果也不同,例子如下

更改拦截器的name属性

<param name="name">更改拦截器以后的名字</param>

 

不需要拦截的方法名

<param name="excludeMethods">不需拦截的方法名以逗号隔开</param>

需要拦截的方法名

<param name="includeMethods">需拦截的方法名以逗号隔开</param>

注:当excludeMethod和includeMethod属性都存在时,则includeMethod属性更高。

 

拦截器的执行流程

拦截器的执行顺序和在struts.xml的配置顺序是有关,也就是说如果a拦截器在b拦截器之前被声明,则会先进入a拦截器,然后进入b拦截器。值得注意的是b拦截器执行之后会回到a拦截器继续执行之后的内容。

小结:

其实struts2本身也拥有很多功能强大的拦截器,同学们也可以仔细的查询一下,这样就省去了自定义拦截器的繁琐,同时也会对struts2有更深的了解。

拦截器在struts2中扮演着至关重要的作用,如果能够理解struts2中的拦截器,就可以基本掌握struts2的所有用法;而最好的理解拦截器的原理的方法就是javaSE中的动态代理机制。所以,对拦截器原理不是很了解的同学们,要多强化下java基础哦!

0 0
原创粉丝点击