struts2的一些用法(三):3.拦截器的设置

struts2的拦截器是基于AOP的机制,底层应用的是JDK代理,挺白痴的,明明CGlib更好一些的技术,
竟然以JDK的动态代理作为主轴,勉强可以用面向接口编程来解释,不过局限性差到让人落泪,设计的人脑袋坏了不成;

拦截器本身也算是struts2的亮点之一,不过与spring的AOP相比,的确是相形见拙;
 
  1.现在说说拦截器,连接器本身需要继承接口或者抽象类,抽象类:AbstractInterceptor
      他是在第二层的应用:
         第一层:转换数据类型;
         第二层:拦截器;
          第三层:Action
      也就是说,struts2表单传值时需要通过拦截器进行封装的,这就需要struts2的默认拦截器,<interceptor-ref name="defaultStack" />
      注意:默认拦截器是在不设置任何拦截器的时候,给予默认设置的,当时只要设置任何一个连接器他否会覆盖掉默认拦截器,
           故此,我们需要手动设置,如下:
 
  1.   <struts>
  2.                 <package name="struts" extends="struts-default" >
  3.                     <interceptors>
  4.                         <interceptor name="work" class="interceptor.Work_Interceptor"></interceptor>
  5.                         //设置拦截器!
  6.                     </interceptors>
  7.                     <action name="login" class="com.struts.action.UserAction" method="add">
  8.                         <interceptor-ref name="work"></interceptor-ref>
  9.                         //在此Action上应用此连接器;
  10.                         <interceptor-ref name="defaultStack" />
  11.                         //设置默认连接器;
  12.                         <result name="sueecc">/sueecc.jsp</result>
  13.                     </action>
  14.                 </package>
  15.             </struts>
2.拦截器的执行顺序:
   是根据配置文件的顺序;
   如果有三个拦截器分别是拦截器一,拦截器二,拦截器三;
   执行顺序:拦截器一->拦截器二->拦截器三->action->拦截器三->拦截器二->拦截器一
  
  3.拦截器可以依赖注入:
 
    写入值分为两种Ioc与非Ioc;
   
    非Ioc存值:
       action中:
       ActionContext.getContext();
      
    Ioc注入:
      Ioc拥有两种注入方式:初始注入,动态注入
        
  1. 初始注入:
  2.         <interceptors>
  3.             <interceptor name="work" class="interceptor.Work_Interceptor">
  4.                 <param name="wang">1234</param>
  5.                 //初始注入
  6.             </interceptor>
  7.         </interceptors>
  8.         
  9.         动态注入:
  10.         <action name="login" class="POJO.User" >
  11.             <interceptor-ref name="work">
  12.                 <param name="wang">1234</param>
  13.                 //动态注入
  14.             </interceptor-ref>
  15.             <result name="succee">/succee.jsp</result>
  16.             <result name="input">/index.jsp</result>
  17.         </action>
4.自定义的默认拦截器:
    
  1. <default-interceptor-ref name=""></default-interceptor-ref>
  2.       //默认拦截器,他可以让所有的action都默认使用你定义的这个拦截器;
5.具体方法拦截器 MethodFilterInterceptor
  1.  struts.xml:
  2.    <interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3">
  3.         <param name="includeMethods">拦截的方法名</param>
  4.     </interceptor>
  1. 拦截器:
  2.       public class MyInterceptor3 extends MethodFilterInterceptor {
  3.             protected String doIntercept(ActionInvocation invocation) throws Exception {
  4.                 System.out.println("my interceptor3");
  5.                 String result = invocation.invoke();
  6.                 return result;
  7.             }
  8.         }
  9.   
  10.       User u = (User) invocation.getAction();
  11.       //返回action的对象,赋值后的对象;
 6.监听器(PreResultListener):
          监听器的初始点是拦截器或者是自定义方法;
 
 7.拦截器与过滤器的区别:
    1.拦截器是基于反射机制,过滤器是基于函数回调的;
    2.过滤器是依赖servlet,拦截器是不依赖于servlet容器;
    3.拦截器只能对action的请求起作用,而过滤器是对任何请求起作用;
    4.拦截器可以访问actionContext,值栈里的对象.而过滤器不能;
    5.action的生命周期中,一个拦截器可以被调用多次,而过滤器只能调用一次;
   
8.标识的拦截器,这个话说偶然间看了看,自己还没敲例子,等以后有时间在来说说这个吧

   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章