亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

RequestProcessor類詳解

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

ActionServlet主要負責初始化,以及介紹請求并找到合適的RequestRrocessor,之后真正干活的是RequestProecssor和Action.
上回說到ActionServlet的process方法最終會調用RequestProcessor類的process方法.下面介紹這個方法.
一.RequestProcessor的process方法
Java代碼 復制代碼
  1. ? ??
  2. public ? void ?process(HttpServletRequest?request, ??
  3. ????????????????????????HttpServletResponse?response) ??
  4. ???????? throws ?IOException,?ServletException?{ ??
  5. ???????? //?Wrap?multipart?requests?with?a?special?wrapper ??
  6. ????????request?=?processMultipart(request); ??
  7. ???????? //?Identify?the?path?component?we?will?use?to?select?a?mapping ??
  8. ????????String?path?=?processPath(request,?response); ??
  9. ???????? if ?(path?==? null )?{ ??
  10. ???????????? return ; ??
  11. ????????}? ??
  12. ???????? if ?(log.isDebugEnabled())?{ ??
  13. ????????????log.debug( "Processing?a?'" ?+?request.getMethod()?+ ??
  14. ?????????????????????? "'?for?path?'" ?+?path?+? "'" ); ??
  15. ????????} ??
  16. ???????? //?Select?a?Locale?for?the?current?user?if?requested ??
  17. ????????processLocale(request,?response); ??
  18. ???????? //?Set?the?content?type?and?no-caching?headers?if?requested ??
  19. ????????processContent(request,?response); ??
  20. ????????processNoCache(request,?response); ??
  21. ???????? //?General?purpose?preprocessing?hook ??
  22. ???????? if ?(!processPreprocess(request,?response))?{ ??
  23. ???????????? return ; ??
  24. ????????} ??
  25. ???????? this .processCachedMessages(request,?response); ??
  26. ???????? //?Identify?the?mapping?for?this?request ??
  27. ????????ActionMapping?mapping?=?processMapping(request,?response,?path); ??
  28. ???????? if ?(mapping?==? null )?{ ??
  29. ???????????? return ; ??
  30. ????????} ??
  31. ???????? //?Check?for?any?role?required?to?perform?this?action ??
  32. ???????? if ?(!processRoles(request,?response,?mapping))?{ ??
  33. ???????????? return ; ??
  34. ????????} ??
  35. ???????? //?Process?any?ActionForm?bean?related?to?this?request ??
  36. ????????ActionForm?form?=?processActionForm(request,?response,?mapping); ??
  37. ????????processPopulate(request,?response,?form,?mapping); ??
  38. ???????? //?Validate?any?fields?of?the?ActionForm?bean,?if?applicable ??
  39. ???????? try ?{ ??
  40. ???????????? if ?(!processValidate(request,?response,?form,?mapping))?{ ??
  41. ???????????????? return ; ??
  42. ????????????} ??
  43. ????????}? catch ?(InvalidCancelException?e)?{ ??
  44. ????????????ActionForward?forward?=?processException(request,?response,?e,?form,?mapping); ??
  45. ????????????processForwardConfig(request,?response,?forward); ??
  46. ???????????? return ; ??
  47. ????????}? catch ?(IOException?e)?{ ??
  48. ???????????? throw ?e; ??
  49. ????????}? catch ?(ServletException?e)?{ ??
  50. ???????????? throw ?e; ??
  51. ????????} ??
  52. ???????????? ??
  53. ???????? //?Process?a?forward?or?include?specified?by?this?mapping ??
  54. ???????? if ?(!processForward(request,?response,?mapping))?{ ??
  55. ???????????? return ; ??
  56. ????????} ??
  57. ???????? if ?(!processInclude(request,?response,?mapping))?{ ??
  58. ???????????? return ; ??
  59. ????????} ??
  60. ???????? //?Create?or?acquire?the?Action?instance?to?process?this?request ??
  61. ????????Action?action?=?processActionCreate(request,?response,?mapping); ??
  62. ???????? if ?(action?==? null )?{ ??
  63. ???????????? return ; ??
  64. ????????} ??
  65. ???????? //?Call?the?Action?instance?itself ??
  66. ????????ActionForward?forward?= ??
  67. ????????????processActionPerform(request,?response, ??
  68. ?????????????????????????????????action,?form,?mapping); ??
  69. ??
  70. ???????? //?Process?the?returned?ActionForward?instance ??
  71. ????????processForwardConfig(request,?response,?forward); ??
  72. ??
  73. ????}???
       
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()方法如下
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. ???}???
       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方法的代碼如下:
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. ????}??
      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()方放代碼如下。
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. ???
       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基類中的相關方法.
Java代碼 復制代碼
  1. Public? class ?CustomRequestProcessor? extends ?RequestProcessor{ ??
  2. ?? protected ? void ?processPreprocess?(HttpServletRequest?request, ??
  3. ?????????????????????????????????HttpServletResponse?response)?{? ??
  4. …………………. ??
  5. } ??
  6. }??
      Public class CustomRequestProcessor extends RequestProcessor{
  protected void processPreprocess (HttpServletRequest request,
                                 HttpServletResponse response) { 
………………….
}
}
    

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

RequestProcessor類詳解


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 青青久视频 | 久久天天躁狠狠躁夜夜呲 | 嘿嘿嘿视频免费网站在线观看 | 四虎网址在线观看 | 久久99热国产这有精品 | 99精品在免费线视频 | 欧美高清一区二区三 | 欧美午夜艳片欧美精品 | 综合色在线观看 | 久久久久久久久中文字幕 | 黄色在线观看网站 | 中文字幕中文字幕在线 | 天天操人人射 | 97视频网站 | 91久久天天躁狠狠躁夜夜 | 91精品国产免费自在线观看 | 亚洲精品国产福利一区二区三区 | 2020年新四虎免费 | 欧美成人午夜 | 99精品观看| 免费欧洲毛片a级视频老妇女 | 视频在线国产 | 亚洲天天做日日摸天天做 | 欧美国产永久免费看片 | 国产福利99 | 国产乱在线观看视频 | 国产精品毛片一区二区三区 | 尹人香蕉久久99天天拍欧美p7 | 亚洲视频综合网 | 国产精品久久久视频 | 最新国产精品视频 | 久久精品首页 | 精品亚洲国产国拍 | 波多野给衣一区二区三区 | 久久精品视频日本 | 99免费在线视频 | 欧美久久综合网 | 国产高清在线a视频大全凹凸 | 中文字幕一区视频 | 97精品视频在线 | 九九在线观看精品视频6 |