程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> struts2 18攔截器詳解(二十)

struts2 18攔截器詳解(二十)

編輯:關於JSP

攔截器總結      攔截器是struts2中非常重要的組成部分,是struts2中極為精妙的一筆,struts2中很多功能都是通過這些攔截器實現,如:異常處理,文件上傳請求參數賦值,數據校驗等這些功能實現都在攔截器中。要深入理解攔截器,理解攔截器的執行流程是關鍵,這就需要對在攔截器執行過程中涉及的一些重要類要比較了解,尤其是ActionContext、ValueStack、ActionInvocation,這幾個類是一直貫穿在struts2整個執行流程當中。只有了解了這些後才能比較好的理解各個攔截器中的代碼。    有些攔截器在攔截器棧中的位置不是隨意的,有一定依據可循,這是由這些攔截器的特定功能所決定的,例如:ExceptionMappingInterceptor攔截器必須放到棧頂,因為只有放到棧頂該攔截器才是最後返回,這個這個攔截器才能包含其它所有攔截器與Action的執行的邏輯,拋了異常才能在ExceptionMappingInterceptor攔截器捕獲到,然後對異常進行集中處理;ModelDrivenInterceptor攔截器要放到ParametersInterceptor之前,因為ModelDrivenInterceptor攔截器會把model壓入值棧,只有放到ParametersInterceptor之前在ParametersInterceptor攔截器進行請求參數設置的時候才能賦值到ModelDrivenInterceptor攔截器壓入值棧的model中;DefaultWorkflowInterceptor攔截器必須放到棧底,因為該攔截器是用於檢測Action執行的過程有無出錯的,這當然也就要放到最後來檢測,如果有錯誤則將導航到指定的Result。當然還有些攔截器位置沒有講,這就由自己去體會吧......   寫了這麼多篇關於攔截器的文章,因為主要是用於講解源碼的,所以就沒有講如何去自定義一個攔截器,在這最後就舉一個自定義攔截器的例子,一個用於判斷用戶是否登錄的攔截器(LoginInterceptor)。下面是該攔截器配置: [html]  <interceptors>       <interceptor name="login" class="com.xtayfjpk.action.LoginInterceptor">           <param name="excludeMethods">loginUI,login</param>       </interceptor>       <interceptor-stack name="defaultStack">           <interceptor-ref name="login"/>           <interceptor-ref name="defaultStack"/>       </interceptor-stack>   </interceptors>        這裡為LoginInterceptor配置了一個參數,表示loginUI與login方法不要應用該攔截器,因為該攔截器是用於判斷是否登錄的,而loginUI與login方法分別是用於顯示用戶登錄界面與處理用戶登錄操作的,如果這兩個方法也進行攔截的話,那用戶永遠也登錄不了了,所以用於顯示登錄界面和處理用戶登錄操作的這兩個方法是不能進行登錄攔截的,所以LoginInterceptor繼承自了MethodFilterInterceptor類。上面的配置中新建了一個攔截器棧,但名字也取為了defaultStack,其主要是為了方便在Action的配置中不要去另外指定攔截器棧的名稱。    下面是該自定義攔截器源碼: [java]   package com.xtayfjpk.action;      import com.opensymphony.xwork2.ActionInvocation;   import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;      public class LoginInterceptor extends MethodFilterInterceptor {       private static final long serialVersionUID = 1L;          @Override       protected String doIntercept(ActionInvocation invocation) throws Exception {           //獲取session中的user           Object user = invocation.getInvocationContext().getSession().get("com.xtayfjpk.user");           if(null==user) {//如果user為null則表示用戶沒有登錄導航到登錄界面               String resultName = "loginUI";               return resultName;           }           //用戶登錄了則調用下一個攔截器           return invocation.invoke();       }   }        到此所有攔截器都講解完畢了,基本上對defaultStack中的所有攔截器都進行了詳細的講解,希望能對大家有所幫助。如有錯誤之處,盡情指正!  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved