Struts框架中類的功能與方法

Struts框架只允許應用中存在一個ActionServlet類,但是可以存在多個客戶化的RequestProcessor類,每個子應用模塊都可以有單獨的RequestProcessor類, ActionServlet主要負責初始化,以及介紹請求並找到合適的RequestRrocessor,之後真正幹活的是RequestProecssor和Action.

一.RequestProcessor的process方法

1) 調用processMultipart()方法 
如果HTTP請求方式爲post,並且contentType爲”multipart/form-data”開頭,標準的HttpServletRequest對象將被重新包裝,以方便處理”multipart”類型的HTTP請求.如果請求方式爲get,或正congtentType屬性不是”mulitipart”,就直接返回原始的HttpServletRequest對象. 

2) 調用processPath()方法 
獲得請求的URI的路徑,這一信息可用於選擇合適的Struts Action組件. 

3) 調用processLocale方法 
當ControllerConfig對象的locale屬性爲true,將讀取用戶請求中包含的Locale信息,然後把Locale實例保存在session範圍內. 

4) 調用processContendType(contentType)方法 
讀取ControllerConfig對象的conttentType屬性,然後調用response.setContentType(contentType)方法,設置響應結果的文檔類型和字符編碼. 
processContent()方法如下 

Java代碼  收藏代碼
  1. protected void processContent(HttpServletRequest request,  
  2.                                  HttpServletResponse response) {  
  3.   
  4.        String contentType = moduleConfig.getControllerConfig().getContentType();  
  5.        if (contentType != null) {  
  6.            response.setContentType(contentType);  
  7.        }  
  8.   
  9.    }   


5) 調用processNoCache()方法 
讀取ControllerConfig對象的nocache屬性,如果nocache屬性爲true,在響應結果中將加入特定的頭參數:Pragma,Cache-Control和Expires, 
防止頁面被存儲在客戶的瀏覽器的緩存中,processNoCache方法的代碼如下: 
Java代碼  收藏代碼
  1. protected void processNoCache(HttpServletRequest request,  
  2.                                   HttpServletResponse response) {  
  3.   
  4.         if (moduleConfig.getControllerConfig().getNocache()) {  
  5.             response.setHeader("Pragma""No-cache");  
  6.             response.setHeader("Cache-Control""no-cache,no-store,max-age=0");  
  7.             response.setDateHeader("Expires"1);  
  8.         }  
  9.     }  


6)調用processPreprocess()方法 
該方法不執行任何操作.直接返回true.子類可以覆蓋這個方法. 
執行客戶化的預處理請求操作. 

7)調用processMapping()方法 
尋找和用戶請求的URI匹配的ActionMapping,如果不存在這樣的ActionMapping,則向用戶返回恰當的錯誤信息. 

8)調用processRoles()方法 
先判斷是否爲Action配置了安全角色,如果配置了安全角色,就調用isUserInRole()方法判斷當前用戶是否具備必需的角色,如果不具備,就結束請求處理流程.,向用戶返回恰當的錯誤消息. 

9)調用processActionForm()方法 
先判斷是否爲ActionMapping配置了ActionForm,如果配置了ActionForm,就先從ActionForm的存在範圍內(request或session)尋找改ActionForm實例,如果不存在,就創建一個實例,接下來把它保存在合適的範圍內,保存時使用的屬性key爲ActionMapping的name屬性。 

10)調用processPopulate()方法 
如果爲ActionMapping配置了ActionForm,就先調用ActionForm的reset()方法,再把請求中的表單數據組裝到ActionForm中。 

11)調用processValidate()方法 
如果爲ActionMapping配置了ActionForm,並且ActionMapping的validate屬性爲true,就調用ActionForm的validate()方法,如果validate方法返回的ActionErrors對象中包含ActionMessage對象,說明表單驗證失敗。就把ActionErrors對象放在request範圍內,再把請求轉發到ActionMapping的input屬性指定的Web組件。如果ActionForm的validate方法執行表單驗證成功,就繼續執行下面的處理流程。 

12)調用processForward()方法 
判斷是否在ActionMapping中配置了forward屬性。如果配置了這個屬性,就調用RequestDispatcher的forward方法,請求處理流程結束。否則進行下一步。 

13)調用processInclude()方法 
判斷是否在ActionMapping中配置了include屬性。如果配置了這個屬性,就調用RequestDispatcher的include方法,請求處理流程結束。否則進行下一步。 

14)調用processActionCreate()方法 
先判斷是否在Action緩存中存在這個Action實例,如果沒有就新建一個Action實例,把它放在Action緩存中。可以看出Action也是隻有一個實例在運行的。 

15)調用processActionPerform 
該方法調用Action實例的execute方法,該方法位於try/catch中,以及捕獲異常。processActionPerform()方放代碼如下。 
Java代碼  收藏代碼
  1. protected ActionForward  
  2.        processActionPerform(HttpServletRequest request,  
  3.                             HttpServletResponse response,  
  4.                             Action action,  
  5.                             ActionForm form,  
  6.                             ActionMapping mapping)  
  7.        throws IOException, ServletException {  
  8.        try {  
  9.            return (action.execute(mapping, form, request, response));  
  10.        } catch (Exception e) {  
  11.            return (processException(request, response,  
  12.                                     e, form, mapping));  
  13.        }  
  14.    


16)調用processActionForward方法 
把你的Action的excute方法返回的ActionFoward對象作爲參數傳給它,processActionForward對象包的請求轉發信息來執行請求轉發或重定向。 

在RequestProcessor類的process方法中,會訪問ControllerConfig、ActionMappig和ActionForward實力的屬性,ControllerConfig類和struts配置文件的<controlle>r元素對應,ActionMapping類和<action>元素對應,ActionForward和<forward>元素對應,process方法通過訪問這三個類實例的屬性來獲得相關的配置信息。 
寫了這麼多,RequestProcessor幹得事夠多的吧。 

二.擴展RequestProcessor類 
如果想修改RequestProcessor的一些默認功能,改易覆蓋RequestProcessor基類中的相關方法. 
Java代碼  收藏代碼
  1. Public class CustomRequestProcessor extends RequestProcessor{  
  2.   protected void processPreprocess (HttpServletRequest request,  
  3.                                  HttpServletResponse response) {   
  4. ………………….  
  5. }  
  6. }  

在struts配置文件中,<controller>元素的processorClass屬性用於配置你自己的RequestProcessor類
Java代碼  收藏代碼
  1. </controller   
  2. contentType=“text/html:charset=”GB2312”  
  3. locale=”true” nocache=”true” processorCalss=”com.test.CustomRequestProcessor”/>  
擴展類DelegatingRequestProcessor類

採用DelegatingRequestProcessor將處理轉發給Spring容器中的bean 

    DelegatingRequestProcessor繼承自RequestProcessor。爲了讓Struts使用DelegatingRequestProcessor,還需要在struts-config.xml文件中增加如下代碼: 

         <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" /> 

   這一行代碼是告訴Struts用DelegatingRequestProcessor來代替原來的RequestProcessor。完成設置這個設置後,Struts會將攔截到的用戶請求轉發到Spring context下的bean,根據bean的name屬性來匹配。而Struts中的action配置則無需配置type屬性(即使配置了type屬性也不起任何作用,除非在spring的配置文件裏找不到對應的name屬性值,除非這個條件直到今天才知道。記下來備忘:))。 

   配置了上面的一行代碼後,就可以在Spring的配置文件(可以不是applicationContext.xml,比如假設這裏是action-servlet.xml)中配置用來處理請求的Action bean了。配置的時候需要注意的是Action bean不再需要id屬性,而要用name替代id屬性,這時name屬性的值應與struts-config.xml中配置的Action的path屬性的值相同。 

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