<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 68, comments - 19, trackbacks - 0, articles - 1

    Struts 1 核心類RequestProcessor

    Posted on 2010-12-07 17:03 viery 閱讀(1032) 評論(0)  編輯  收藏 所屬分類: JavaEE

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

     

    ActionServlet主要負責初始化,以及介紹請求并找到合適的RequestRrocessor,之后真正干活的是RequestProecssor和Action. 

    在ActionServlet的doGet/doPost中會調用process方法而最終會調用RequestProcessor類的process方法.而在process又調用了17個 processXXX其它方法來完成工作。下面介紹這個方法. 

     

    public void process(HttpServletRequest request,
                            HttpServletResponse response)
            throws IOException, ServletException {

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

            /*
       獲得請求的URI的路徑,這一信息可用于選擇合適的Struts Action組件.
      */
            String path = processPath(request, response);
            if (path == null) {
                return;
            }
           
            if (log.isDebugEnabled()) {
                log.debug("Processing a '" + request.getMethod() +
                          "' for path '" + path + "'");
            }

            //當ControllerConfig對象的locale屬性為true,將讀取用戶請求中包含的Locale信息,然后把Locale實例保存在session范圍內.
            processLocale(request, response);

            //讀取ControllerConfig對象的conttentType屬性,然后調用response.setContentType(contentType)方法,設置響應結果的文檔類型和字符
            processContent(request, response);

      /*
       讀取ControllerConfig對象的nocache屬性,如果nocache屬性為true,在響應結果中將加入特定的頭參數:Pragma,Cache-Control和Expires,
       防止頁面被存儲在客戶的瀏覽器的緩存中.
       */
            processNoCache(request, response);

           //該方法不執行任何操作.直接返回true.子類可以覆蓋這個方法. 執行客戶化的預處理請求操作.
            if (!processPreprocess(request, response)) {
                return;
            }
           
      //從session中獲取ActionMessages對象
            this.processCachedMessages(request, response);

            // 尋找和用戶請求的URI匹配的ActionMapping,如果不存在這樣的ActionMapping,則向用戶返回恰當的錯誤信息
            ActionMapping mapping = processMapping(request, response, path);
            if (mapping == null) {
                return;
            }

            /*
        先判斷是否為Action配置了安全角色,如果配置了安全角色,就調用isUserInRole()方法判斷當前用戶是否具備必需的角色,
        如果不具備,就結束請求處理流程.,向用戶返回恰當的錯誤消息.
      */
            if (!processRoles(request, response, mapping)) {
                return;
            }

             /*
       先判斷是否為ActionMapping配置了ActionForm,如果配置了ActionForm,就先從ActionForm的存在范圍內(request或session)尋找改ActionForm實例,
       如果不存在,就創建一個實例,接下來把它保存在合適的范圍內,保存時使用的屬性key為ActionMapping的name屬性。
      */
            ActionForm form = processActionForm(request, response, mapping);

      //如果為ActionMapping配置了ActionForm,就先調用ActionForm的reset()方法,再把請求中的表單數據組裝到ActionForm中。
            processPopulate(request, response, form, mapping);

      /*
       如果為ActionMapping配置了ActionForm,并且ActionMapping的validate屬性為true,就調用ActionForm的validate()方法,
       如果validate方法返回的ActionErrors對象中包含ActionMessage對象,說明表單驗證失敗。
       就把ActionErrors對象放在request范圍內,再把請求轉發到ActionMapping的input屬性指定的Web組件。
       如果ActionForm的validate方法執行表單驗證成功,就繼續執行下面的處理流程。
      */
            if (!processValidate(request, response, form, mapping)) {
                return;
            }

      //判斷是否在ActionMapping中配置了forward屬性。如果配置了這個屬性,就調用RequestDispatcher的forward方法,請求處理流程結束。否則進行下一步。
            if (!processForward(request, response, mapping)) {
                return;
            }
           
      //判斷是否在ActionMapping中配置了include屬性。如果配置了這個屬性,就調用RequestDispatcher的include方法,請求處理流程結束。否則進行下一步。
            if (!processInclude(request, response, mapping)) {
                return;
            }

            // 先判斷是否在Action緩存中存在這個Action實例,如果沒有就新建一個Action實例,把它放在Action緩存中。可以看出Action也是只有一個實例在運行的。
            Action action = processActionCreate(request, response, mapping);
            if (action == null) {
                return;
            }

            //該方法調用Action實例的execute方法,該方法位于try/catch中,以及捕獲異常。
            ActionForward forward =
                processActionPerform(request, response,
                                     action, form, mapping);

            //把你的Action的excute方法返回的ActionFoward對象作為參數傳給它,processActionForward對象包的請求轉發信息來執行請求轉發或重定向。
            processForwardConfig(request, response, forward);

        }

    主站蜘蛛池模板: 精品熟女少妇AV免费观看| 亚洲AV无码专区电影在线观看| 99久久精品国产亚洲| 亚洲高清在线mv| 久久久精品2019免费观看| 女人18毛片a级毛片免费视频| 亚洲伊人久久大香线蕉| 免费精品国产自产拍在线观看| 国产麻豆免费观看91| 亚洲s码欧洲m码吹潮| 四虎影视永久免费观看| 亚洲福利电影一区二区?| 男女猛烈xx00免费视频试看| 国产免费观看a大片的网站| 精品免费AV一区二区三区| 亚洲国产精品尤物yw在线| 亚洲国产精品一区二区久| 成年女人免费视频播放体验区| 亚洲AV综合永久无码精品天堂| 哒哒哒免费视频观看在线www | 日本zzzzwww大片免费| 亚洲国产综合无码一区二区二三区| 男女超爽视频免费播放| 亚洲一区二区三区影院| 久久成人免费电影| 国产精品亚洲片在线va| 中文字幕免费在线视频| 亚洲精品综合一二三区在线| 国产免费播放一区二区| 亚洲国产美国国产综合一区二区| 成人免费视频网站www| 男人的天堂av亚洲一区2区| 黄瓜视频影院在线观看免费| 午夜亚洲国产理论片二级港台二级| 亚洲国产小视频精品久久久三级| 久久99免费视频| 水蜜桃亚洲一二三四在线| 狠狠躁狠狠爱免费视频无码| 久久久久亚洲av无码专区| 国产网站在线免费观看| 久久久久久AV无码免费网站下载 |