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.標識的攔截器,這個話說偶然間看了看,自己還沒敲例子,等以後有時間在來說說這個吧

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