Strust組件—RequestProcessor類詳解

來源:互聯網
上載者:User

Struts架構只允許應用中存在一個ActionServlet類,但是可以存在多個客戶化的RequestProcessor類,每個子應用模組都可以有單獨的RequestProcessor類,

ActionServlet主要負責初始化,以及介紹請求並找到合適的RequestRrocessor,之後真正幹活的是RequestProecssor和Action.
上回說到ActionServlet的process方法最終會調用RequestProcessor類的process方法.下面介紹這個方法.
一.RequestProcessor的process方法 代碼      public void process(HttpServletRequest request,                            HttpServletResponse response)            throws IOException, ServletException {            // Wrap multipart requests with a special wrapper            request = processMultipart(request);            // Identify the path component we will use to select a mapping            String path = processPath(request, response);            if (path == null) {                return;            }             if (log.isDebugEnabled()) {                log.debug("Processing a '" + request.getMethod() +                          "' for path '" + path + "'");            }            // Select a Locale for the current user if requested            processLocale(request, response);            // Set the content type and no-caching headers if requested            processContent(request, response);            processNoCache(request, response);            // General purpose preprocessing hook            if (!processPreprocess(request, response)) {                return;            }            this.processCachedMessages(request, response);            // Identify the mapping for this request            ActionMapping mapping = processMapping(request, response, path);            if (mapping == null) {                return;            }            // Check for any role required to perform this action            if (!processRoles(request, response, mapping)) {                return;            }            // Process any ActionForm bean related to this request            ActionForm form = processActionForm(request, response, mapping);            processPopulate(request, response, form, mapping);            // Validate any fields of the ActionForm bean, if applicable            try {                if (!processValidate(request, response, form, mapping)) {                    return;                }            } catch (InvalidCancelException e) {                ActionForward forward = processException(request, response, e, form, mapping);                processForwardConfig(request, response, forward);                return;            } catch (IOException e) {                throw e;            } catch (ServletException e) {                throw e;            }                            // Process a forward or include specified by this mapping            if (!processForward(request, response, mapping)) {                return;            }            if (!processInclude(request, response, mapping)) {                return;            }            // Create or acquire the Action instance to process this request            Action action = processActionCreate(request, response, mapping);            if (action == null) {                return;            }            // Call the Action instance itself            ActionForward forward =                processActionPerform(request, response,                                     action, form, mapping);               // Process the returned ActionForward instance            processForwardConfig(request, response, forward);           }   
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()方法如下
代碼 protected void processContent(HttpServletRequest request,                                     HttpServletResponse response) {              String contentType = moduleConfig.getControllerConfig().getContentType();           if (contentType != null) {               response.setContentType(contentType);           }          }   

 

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

 

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()方放代碼如下。
代碼 protected ActionForward           processActionPerform(HttpServletRequest request,                                HttpServletResponse response,                                Action action,                                ActionForm form,                                ActionMapping mapping)           throws IOException, ServletException {           try {               return (action.execute(mapping, form, request, response));           } catch (Exception e) {               return (processException(request, response,                                        e, form, mapping));           }       

 

16)調用processActionForward方法
把你的Action的excute方法返回的ActionFoward對象作為參數傳給它,processActionForward對象包的請求轉寄資訊來執行請求轉寄或重新導向。

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

二.擴充RequestProcessor類
如果想修改RequestProcessor的一些預設功能,改易覆蓋RequestProcessor基類中的相關方法.
代碼 Public class CustomRequestProcessor extends RequestProcessor{      protected void processPreprocess (HttpServletRequest request,                                     HttpServletResponse response) {     ………………….    }    }  
在struts設定檔中,<controller>元素的processorClass屬性用於配置你自己的RequestProcessor類 代碼 </controller     contentType=“text/html:charset=”GB2312”    locale=”true” nocache=”true” processorCalss=”com.test.CustomRequestProcessor”/>   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.