struts2拦截器的故事

        拦截器体系是struts2框架的重要组成部分,我们可以它的拦截器看做是一个大型的空容器。对于任何mvc框架来说,他们都会完成一些通用的控制逻辑,将请求参数封装程dto,执行输入校验,解析文件上传中的文件域,防止表单的多次提交。

        而struts2框架的绝大部分功能都是通过拦截器来完成的,当strutsPrepareAndExecuteFilter拦截到用户请求之后,大量拦截器讲会对用户的请求进行处理,然后才会调用用户开发的action实例方法来处理请求。在strtuts2中拦截器主要有内建拦截器和默认拦截器两种;

        从struts框架来看,拦截器几乎完成了struts2框架70%的工作,包括解析请求参数,将请求参数赋值给action属性,执行校验,文件上传等;struts设计的灵巧性,更大程度的得益于拦截器设计,当需要扩展struts2功能时,只需要提供对应拦截器,并将它配置在struts2容器中即可;strtus2中内建了大量的拦截器,这些拦截器以name-class的形式配置在struts-default.xml文件中,其中name是拦截器的名字,也就是以后使用该拦截器的唯一标示,class则指定了该拦截器的实现类,如果我们定义的package继承struts2的默认struts-default 包,则可以自由使用下面定义的拦截器,否则必须自己定义这些拦截器;那么我们该如何配置呢?请继续往下看:

       在struts.xml文件中定义拦截器只需要为拦截器指定一个拦截器名,就完成了拦截器定义,定义拦截器使用<interceptor/>元素来定义,定义拦截器最简单的格式如下:

      <interceptor name="拦截器名称" class=“拦截器实现类”/>;

      大部分时候,只需要通过上面的格式就可以完成拦截器的配置,如果还需要在配置拦截器时传入拦截器参数,则需要在<interceptor>元素中使用<param>子元素;如下图:

      

       除此之外,还可以把多个拦截器连在一起成为拦截器栈,例如,如果需要在action执行前同时做登陆检查,安全检查和记录日志;则可以把这三个动作对应的拦截器设置一个拦截器栈;定义拦截器栈中使用<intercepor-stack……>元素,拦截器栈是由多个拦截器组成的,所以需要使用<intercepor-ref>元素来定义多个拦截器引用,即该拦截器栈由多个<intercepor-ref>元素指定的拦截器组成;

       从程序结构上看,拦截器栈是由多个拦截器组成,即一个拦截器栈包含了多个拦截器;但从程序功能上来看,拦截器栈和拦截器时统一的;它们的包含的方法都会在action的execute方法执行之前自动执行。实际上,我们完全可以拦截器栈当成一个更大的拦截器;

      

     关于struts2的拦截器讲解先到这里,后期会有进一步的整理和总结,如果有更好的建议,欢迎大家来拍砖; 

  



原文地址:https://www.cnblogs.com/xzpblog/p/5117904.html