首页 > 代码库 > 【跟我一步一步学Struts2】——拦截器

【跟我一步一步学Struts2】——拦截器

前言 


      前面提到过拦截器,并且说拦截器只能拦截Action。这里拦截器的调用体现了责任链模式。为什么说体现了责任链模式呢?

 

下面的一段话说的很明白:

          Struts2将整个执行划分成若干相同类型的元素,每个元素具备不同的逻辑责任,并将它们纳入到一个链式的数据结构中,而每个元素又有责任负责链式结构中下一个元素的执行调用。

         从代码重构的角度来看,实际上是将一个复杂的系统,分而治之,从而使得每个部分的逻辑能够高度重用并具备高度可扩展性。

 

拦截器的原理


          Struts2框架的拦截器是动态配置的,如果不需要使用某个拦截器只需要在配置文件中取消应用即可;应用某个拦截器在配置文件中配置就可以了。不管是否应用某个拦截器,对struts2的框架没有任何影响。

         我们还可以对拦截器进行扩展。由此体现出了拦截器可插拔的特性。

 

理解DRYDon‘t Repeat Yourself)规则


        我们开发软件的时候会遇到这样的情况,多个地方需要相同的代码段,于是我们就“复制”,“粘贴”,从功能上来说,实现了功能;如果是从软件的效率或者是软件的质量上来说是不合格的。从软件的维护上来说会很恶心的。

 

通过下面的图片会更好理解一些:


 


        通常有了重复的代码段我们会选择提取出来,做成一个公共的方法,让每个模块去调用,但是如果现在我要改,不调用上面那个代码段,调用其他的一段代码,那么这三个模块都要手动修改。如果是放在拦截器里面,这时候系统就会自动去调用。方法的调用由系统来完成,我们只需要在配置文件中配置一下即可。

 

       由此可以看出,拦截器实现了自动调用不同的方法体,甚至完全改变目标方法。拦截器强大的解耦功能在此体现的很好。

 

实例


配置文件中拦截器的配置

<packagename="struts2" extends="struts-default">

<interceptors>

<!--定义记录日志拦截器 -->

<interceptorname="myLogInterceptor" class ="com.bjpowernode.struts2.MyLogInterceptor"/>

<!--定义检查安全性拦截器 -->

<interceptorname="mySecurityInterceptor"class="com.bjpowernode.struts2.MySecurityInterceptor"/>

 

<!--拦截器栈 -->

<interceptor-stackname="myInterceptorStack">

<interceptor-refname="defaultStack"/>

<!--自定义拦截器-->

<interceptor-refname="myLogInterceptor"/>

<interceptor-refname="mySecurityInterceptor"/>

</interceptor-stack>

 

</interceptors>

<!--定义为缺省拦截器,所有的Action都会得到使用 -->

<default-interceptor-refname="myInterceptorStack" />

<actionname="login"class="com.bjpowernode.struts2.LoginAction">

<result>/login_success.jsp</result>

<resultname="error">/login_error.jsp</result>

</action>

</package>

 

总结


        从上面可以看出,拦截器是struts2的重要组成部分,使得struts2的配置更加灵活而不影响框架的任何操作,并且体现了高度复用与扩展的思想。这不就是面向对象的体现么,可见拦截器的设计巧妙。从这里我们也能体会出,当我们遇到问题,就要去变,去抽象,去封装,让我们的代码越写越少,维护方便,效率高。

【跟我一步一步学Struts2】——拦截器