Struts的中央控制器

來源:互聯網
上載者:User
在Struts架構中,有多個組件分擔控制器的工作,它們分別是ActionServlet類,RequestProcessor類和Action類等,其中ActionServlet是Struts架構中的核心控制器。
Struts應用程式處理使用者請求的一般過程
ActionServlet類作為中心Servlet,負責處理所有到來的使用者請求。當ActionServlet接收到一個使用者請求時,將執行如下流程:
1.檢索和使用者請求匹配的ActionMapping執行個體,如果不存在,就返回使用者請求路徑無效的錯誤資訊。
2.如果為ActionMapping配置了Form Bean,則擷取相應範圍內的ActionForm執行個體。如果ActionForm執行個體不存在,就建立一個ActionForm對象,把客戶提交的表單資料儲存到ActionForm對象中。
3.根據ActionMapping配置資訊決定是否需要驗證表單。如果需要驗證,就調用ActionForm的validate()方法。
4.如果ActionForm的validate()方法返回null,或者返回一個不包含任何ActionMessage的ActionErrors對象,就表明表單驗證成功,繼續執行下一步。否則返回input屬性指定的頁面,並向使用者顯示ActionErrors集合中的錯誤資訊。
5.ActionServlet根據ActionMapping執行個體包含的映射資訊決定將請求轉寄給哪個Action,如果相應的Action執行個體不存在,則先建立這個執行個體,然後調用Action的execute方法。
6.Action的execute方法返回 一個ActionForward對象,ActionServlet將請求轉寄到這個ActionForward對象指定的組件,通常是一個JSP組件或其他Action。
7.如果ActionForward對象指向一個JSP組件,則將該JSP產生的動態網頁面返回給使用者;如果ActionForward對象指向的仍然是一個Action,則從第1步重新開始執行!

從上述過程可知ActionServlet類是Struts架構的內建核心控制器組件,它繼承了javax.servlet.http.HttpServlet類。Struts的啟動通常從載入ActionServlet開始。Web容器會在初次開機或Struts應用的第一個請求到達時載入ActionServlet。
ActionServlet第一次被載入後,其init()方法被調用。在init()方法中,Struts架構執行所有必要的初始化工作。
然後,Web容器將調用ActionServlet的doPost()或doGet()方法來處理使用者請求,而它們實際上都是調用process()方法具體處理請求的,如下列代碼:
ActionServlet處理使用者請求:

//摘自org.apache.struts.action.ActionServlet.

 public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
    process(request, response);
    }
    
    public void doPost    (HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
    process(request, response);
    }

     protected void process(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
    //根據請求選擇恰當的應用模組
    ModuleUtils.getInstance().selectModule(request,this.getServletContext());
    ModuleConfig config = getModuleConfig(request);
    //擷取模組相關的RequestProcessor執行個體
    RequestProcessor processor = getProcessorForModule(config);
    if (processor == null)
        processor = getRequestProcessor(config);
        //調用processor執行個體的process()方法處理請求
    processor.process(request, response);
    }

在上面我們看到ActionServlet的process()方法中實際處理使用者請求的是RequestProcessor類的process()方法。Struts架構只允許應用程式中存在一個ActionServlet類,但每個應用程式模組都有各自的RequestProcessor類執行個體。在ActionServlet的process()方法中,一旦選擇了正確的應用程式模組,就會調用相應模組RequestProcessor執行個體的process()方法來處理請求。RequestProcessor類的process方法如下:

//摘自RequestProcessor
     public void process(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
     {
         //用一個特殊的封裝對象把Muiltipart請求封裝起來
         request = processMultipart(request);
         //驗證我們用來選擇映射的路徑組件
         String path = processPath(request, response);
         
         if (path != null) 
         {
            if (log.isDebugEnabled())
            log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
           //有請求時, 為目前使用者選擇一個Locale對象
            processLocale(request, response);
            //有請求時,設定內容類型和no-caching字頭
            processContent(request, response);
            processNoCache(request, response);
            if (processPreprocess(request, response))
            {
                processCachedMessages(request, response);
                //驗證這個請求的映射
                ActionMapping mapping = processMapping(request, response, path);
                if (mapping != null && processRoles(request, response, mapping)) 
                {
                    //處理和這個請求相關的任何ActionForm bean
                    ActionForm form = processActionForm(request, response, mapping);
                    processPopulate(request, response, form, mapping);
                    if (processValidate(request, response, form, mapping)&& processForward(request, response, mapping)&& processInclude(request, response, mapping)) 
                    {
                        //建立或擷取Action執行個體來處理這項請求
                        Action action = processActionCreate(request, response, mapping);
                        if (action != null)
                        {
                            //調用Action執行個體本身
                            ActionForward forward = processActionPerform(request, response,action, form, mapping);
                            //處理所返回的ActionForward執行個體
                            processForwardConfig(request, response, forward);
                        }
                    }
                }
            }
         }
     }

ActionServlet在web.xml中的配置:
  像所有Servlet一樣,ActionServlet也需要在web.xml中進行配置。其具體配置方法如下:

 <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

需要特別說明的是,Struts的設定檔struts-config.xml作為ActionServlet的一個初始化參數值在web.xml檔案中聲明。另外,ActionServlet的URL形式是*.do,這樣當在瀏覽器地址輸入任何尾碼為*.do的URL時,系統都會映射到ActionServlet。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.