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

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

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

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

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    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()方法
    該方法不執(zhí)行任何操作.直接返回true.子類可以覆蓋這個方法.
    執(zhí)行客戶化的預處理請求操作.

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

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

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

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

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

    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對象包的請求轉發(fā)信息來執(zhí)行請求轉發(fā)或重定向。

    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”/>  

     




     

  • posted on 2009-04-05 11:15 lanxin1020 閱讀(184) 評論(0)  編輯  收藏 所屬分類: struts1
    主站蜘蛛池模板: 亚洲高清毛片一区二区| 亚洲精品无码久久| 久久久精品免费视频| 国产日产亚洲系列| 高清永久免费观看| 亚洲精品V欧洲精品V日韩精品| 九九视频高清视频免费观看 | 有色视频在线观看免费高清在线直播| 成人免费看吃奶视频网站| 亚洲欧美国产欧美色欲| 日韩特黄特色大片免费视频| 亚洲精品永久在线观看| 国产精品公开免费视频| 免费一级毛片在线播放视频免费观看永久| 国产成人涩涩涩视频在线观看免费| 亚洲AV无码XXX麻豆艾秋| 四虎在线播放免费永久视频 | 久久精品乱子伦免费| 91天堂素人精品系列全集亚洲| 18女人腿打开无遮掩免费| 亚洲人成人网站18禁| 亚洲精品偷拍视频免费观看 | 4444亚洲国产成人精品| 大地资源免费更新在线播放| 亚洲国产aⅴ成人精品无吗| 久久久久亚洲av成人无码电影| 免费成人高清在线视频| 亚洲中字慕日产2021| 免费中文字幕一级毛片| 久久福利青草精品资源站免费| 亚洲国产综合精品| 你懂的免费在线观看网站| youjizz亚洲| 国产精品亚洲二区在线观看| 四虎国产成人永久精品免费| 亚洲熟妇无码八V在线播放| 亚洲熟女少妇一区二区| 成年女人18级毛片毛片免费观看| jizz中国免费| 久久久久久亚洲精品影院| 亚洲午夜未满十八勿入网站2|