struts2默认拦截器(Interceptor)讲解(八)

这一篇主要讲解struts中的默认拦截器,这些拦截器是已经封装好的。当然也可以自定义拦截器。

 

1、拦截器的基本概念
2、拦截器的使用方法
3、认识内置拦截器

了解拦截器(Interceptor)的基本概念,了解什么是面向方面的编程思想(AOP),掌握拦截器的使用方法,了解Struts2的内置拦截器。

 

Action的属性如何被自动填充?如何将参数的数据类型自动转换?
      系统如何知道Action是否实现了ModelDriven接口?如何自动调用接口的方法?
      系统如何将Action属性传递到JSP视图?
      ......这一切都是因为有了幕后英雄—拦截器

 

 


什么是拦截器?

     拦截器是动态拦截Action调用的组件对象。之所以称为“拦截器”,是因为它可以在Action的业务方法执行前后进行拦截调用,实现特定功能。

为什么要使用拦截器?

    Struts2框架中包含大量的拦截器,实现了框架的大部分基础功能,如:避免表单重复提交、类型转换、输入验证、文件上传等都是在拦截器帮助下实现的。使用拦截器可使程序开发人员的工作变得轻松。
   

      面向方面的编程(AOP)( Aspect-Oriented Programming)  AOP是对OOP的完善和补充。
      OOP:基本设计思想(封装、继承、多态)对象之间通过继承、多态建立一种层次关系。  OOP适合系统中核心业务的描述处理,但对于系统中公共行为(如日志管理、权限认证、事务处理等)的描述处理力不从心,而这些公共行为又是普遍存在和十分重要的。
      AOP:是将那些封装的对象“剖开”,从中找到这些对象对某一特定需求的共同关切点,即方面,并将这些特定方面的功能实现封装到可重用模块。

 

 

【拦截器的设计思想】
       拦截器设计采用AOP的思想,Struts2框架中,Action是封装了业务处理行为的对象,而公共行为(基础功能)放到拦截器中实现,而不是分散到Action中实现。
       AOP设计思想使得系统功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。

 

如何将实现业务处理的Action类和实现了公共行为的拦截器类关联到一起,共同实现系统功能?
       配置!!!
       通过查看Struts2框架的默认配置文件struts-default.xml,了解拦截器的配置和使用。
       打开项目的“Referenced Libraries”继续打开struts2-core-2.2.1.1.jar找到struts-default.xml文件双击打开

 

拦截器的配置包括拦截器的定义拦截器的引用两部分


1、拦截器的定义
  在<interceptors>元素内定义了一组拦截器和一组拦截器栈


【拦截器】 <interceptor>元素用于定义一个拦截器,如:
  

<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

       定义拦截器时name指定拦截器的名称,class指定实现了拦截器功能的类,将一个拦截器名与一个拦截器类进行了关联

【拦截器栈】 <interceptor-stack>用于定义一个拦截器栈
       由于拦截器较多,为了使用和管理的方便,可将多个拦截器组织在一起形成一个拦截器栈,使用拦截器栈可以将多个拦截器作为一个整体来引用。
在<interceptor-stack>内使用<interceptor-ref name="拦截器名"/>来引用拦截器

 

2、拦截器的默认引用
     <default-interceptor-ref name="defaultStack"/>
     defaultStack是struts-default包指定的默认拦截器栈,这个包的继承者内所有的Action都将与这个拦截器栈中的所有拦截器关联。
     我们创建的Web应用程序中,struts.xml中定义的包默认都是从struts-default包继承,因此我们在之前创建的Action可以实现数据类型自动转换、Action属性自动填充、基于框架注入获取Web元素。    

 

【在Action中订制内置拦截器】

<package name="user" extends="struts-default">
        <action name="login" class="com.hnjm.action.LoginAction">
              <interceptor-ref name="timer"/>
              <interceptor-ref name="defaultStack"/>
              <result>/success.jsp</result>
              <result name="input">/login.jsp</result>
         </action>
</package>


【说明】
  在配置文件中为Action显式引用拦截器后,继承的默认拦截器将不再起作用,为了继续使用,必须显式引用默认拦截器

  1、测试运行,观察控制台的输出
 在控制台显示Action的业务方法运行时间

2011-3-15 20:48:47 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Executed action [//login!execute] took 63 ms.


2、增加<interceptor-ref name="logger"/>测试运行
3、将<interceptor-ref name="defaultStack"/>删除,再测试运行

 

4、package中定义自己的拦截器栈,并在action中引用

<package name="user" extends="struts-default">
   <interceptors>
      <interceptor-stack name="mystack">
            <interceptor-ref name="logger" />
            <interceptor-ref name="timer" />
            <interceptor-ref name="defaultStack" />
       </interceptor-stack>
   </interceptors>
    <action name="login" class="com.hnjm.action.LoginAction">
         <interceptor-ref name="mystack"></interceptor-ref>
         <result>/success.jsp</result>
         <result name="input">/login.jsp</result>
         <result name="invalid.token">/err.jsp</result>
    </action>
</package>


 

 

Struts2框架中的拦截器

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值