隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

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

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

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

          3) 調(diào)用processLocale方法
          當ControllerConfig對象的locale屬性為true,將讀取用戶請求中包含的Locale信息,然后把Locale實例保存在session范圍內(nèi).

          4) 調(diào)用processContendType(contentType)方法
          讀取ControllerConfig對象的conttentType屬性,然后調(diào)用response.setContentType(contentType)方法,設(shè)置響應(yīng)結(jié)果的文檔類型和字符編碼.
          processContent()方法如下

        87. protected void processContent(HttpServletRequest request,   
        88.                                  HttpServletResponse response) 
        89.  {   
        90.   
        91.        String contentType = moduleConfig.getControllerConfig().getContentType();   
        92.        if (contentType != null
        93.       {   
        94.            response.setContentType(contentType);   
        95.        }   
        96.   
        97.    }   

           


          5) 調(diào)用processNoCache()方法
          讀取ControllerConfig對象的nocache屬性,如果nocache屬性為true,在響應(yīng)結(jié)果中將加入特定的頭參數(shù):Pragma,Cache-Control和Expires,
          防止頁面被存儲在客戶的瀏覽器的緩存中,processNoCache方法的代碼如下:

        98. protected void processNoCache(HttpServletRequest request,   
        99.                                   HttpServletResponse response) 
        100. {   
        101.   
        102.         if (moduleConfig.getControllerConfig().getNocache()) 
        103.         {   
        104.             response.setHeader("Pragma""No-cache");   
        105.             response.setHeader("Cache-Control""no-cache,no-store,max-age=0");   
        106.             response.setDateHeader("Expires"1);   
        107.         }   
        108.     }  



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

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

          8)調(diào)用processRoles()方法
          先判斷是否為Action配置了安全角色,如果配置了安全角色,就調(diào)用isUserInRole()方法判斷當前用戶是否具備必需的角色,如果不具備,就結(jié)束請求處理流程.,向用戶返回恰當?shù)腻e誤消息.

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

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

          11)調(diào)用processValidate()方法
          如果為ActionMapping配置了ActionForm,并且ActionMapping的validate屬性為true,就調(diào)用ActionForm的validate()方法,如果validate方法返回的ActionErrors對象中包含ActionMessage對象,說明表單驗證失敗。就把ActionErrors對象放在request范圍內(nèi),再把請求轉(zhuǎn)發(fā)到ActionMapping的input屬性指定的Web組件。如果ActionForm的validate方法執(zhí)行表單驗證成功,就繼續(xù)執(zhí)行下面的處理流程。

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

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

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

          15)調(diào)用processActionPerform
          該方法調(diào)用Action實例的execute方法,該方法位于try/catch中,以及捕獲異常。processActionPerform()方放代碼如下。

        109. protected ActionForward   
        110.        processActionPerform(HttpServletRequest request,   
        111.                             HttpServletResponse response,   
        112.                             Action action,   
        113.                             ActionForm form,   
        114.                             ActionMapping mapping)   
        115.        throws IOException, ServletException {   
        116.        try 
        117.       {   
        118.            return (action.execute(mapping, form, request, response));   
        119.        } catch (Exception e)
        120.        {   
        121.            return (processException(request, response,   
        122.                                     e, form, mapping));   
        123.        }   
        124.    

           


          16)調(diào)用processActionForward方法
          把你的Action的excute方法返回的ActionFoward對象作為參數(shù)傳給它,processActionForward對象包的請求轉(zhuǎn)發(fā)信息來執(zhí)行請求轉(zhuǎn)發(fā)或重定向。

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

          二.擴展RequestProcessor
          如果想修改RequestProcessor的一些默認功能,改易覆蓋RequestProcessor基類中的相關(guān)方法.

        125. Public class CustomRequestProcessor extends RequestProcessor{   
        126.   protected void processPreprocess (HttpServletRequest request,   
        127.                                  HttpServletResponse response) {    
        128. ………………….   
        129. }   
        130. }  

          在struts配置文件中,<controller>元素的processorClass屬性用于配置你自己的RequestProcessor

        131. </controller    
        132. contentType=“text/html:charset=”GB2312”   
        133. locale=”true” nocache=”true” processorCalss=”com.test.CustomRequestProcessor”/>  

           




           

        134. posted on 2009-04-05 11:15 lanxin1020 閱讀(186) 評論(0)  編輯  收藏 所屬分類: struts1
          主站蜘蛛池模板: 崇礼县| 宣威市| 灵川县| 华安县| 崇礼县| 寻乌县| 镇巴县| 陇西县| 黔西| 锡林浩特市| 临清市| 泰州市| 高阳县| 军事| 平顶山市| 富阳市| 江安县| 五河县| 芮城县| 陆川县| 扶余县| 竹山县| 基隆市| 云南省| 扎赉特旗| 沙洋县| 温宿县| 朝阳区| 济南市| 尉犁县| 东乌| 石家庄市| 明溪县| 浦东新区| 县级市| 贵州省| 漯河市| 宁波市| 启东市| 台南县| 白水县|