Struts1_03_控制器組件

一、Struts控制器的組件
  前端控制器ActionServlet:
        init方法初始化Struts的配置文件(ModuleConfig)。
        接收用戶的.do請求交給請求處理器
  請求處理器RequestProcessor:調用process()方法,
創建ActionFrom,執行驗證。
        創建Action,調用execute()方法。返回ActionForward。
  業務控制器Action:回調方法execute(),在這個方法中去調用業務邏輯類處理用戶的請求


二、分析Struts源代碼中的控制器部分
執行流程 
 1. struts應用程序在被web容器加載時,自動初始化ActionServlet
 2. ActionServlet初始化時,調用init()方法,在init方法中它加載struts配置文件並解析成一個ModuleConfig
 3. 用戶提交一個http://.../xxx.do請求,ActionServlet截獲。調用相應的doGet或doPost,在這兩個方法中都調用了一個process()方法,在process方法中要是調用RequestProcessor類的process()方法。
 4. RequestProcessor類的process()方法
    processPath(req, res)      -->/xxx
    processMapping(/xxx)    --> ModuleConfig找到ActionMapping(代表一個<action>)
    processActionForm()      -->查找或創建對應的ActionForm對象。
    processPopulate()           -->把用戶提交的請求數據封裝到對應的ActionForm對象。
    processValidate()            -->調用對應ActionForm對象中的validate()方法對錶單數據進行驗證。 前提<action>標記的validate="true"
    processForward()            -->如果<action>標記配置了forward屬性。那麼它就調用這個方法進行請求轉發
    processActionCreate()    -->創建或找到相應的Action實例。
    processActionPerform()  -->調用相應Action實例中的execute()回調方法來進行業務操作。
    processForwardConfig()  -->根據Action實例的execute()方法的返回值來做跳轉。


三、ActionServlet:
  注意它在web.xml中的配置,  修改了一次struts的配置文件,就要重部署一次項目。


四、Action類: public ActionForward execute(ActionMapping mapping, ActionForm form,.)
  1.參數: ActionMapping對象-->對應配置文件中的<action>標記。
    1)<action>標記的參數:
      path: 配置此Action要處理的路徑. 以/開頭,不帶擴展名
      type: 指定此Action類的全限定名
      name: 指定此Action類對應的ActionForm。 name屬性要和<form-bean>標記name值相同
      scope: 指定和此Action類對應的ActionForm的存儲範圍。默認session
      attribute: 指定存放ActionForm的名。request.setAttribute(attribute, actionForm);
      unknown: 爲true時,表示這個Action用來處理無效的URL. 默認爲false
      forward: 指定要轉發到的路徑。這個action專門用來做請求轉發。不能和type一起使用
      validate: true表示要驗證表單(調用ActionForm中的validate()方法),false不驗證. 默認true
      input: 驗證失敗時的轉發路徑。
      parameter: 指定Action的配置參數。一般用來跟DispatchAction配合使用。


   2)ActionMapping的常用方法: 
       public ActionForward mapping.findForward("邏輯名");
       public ActionForward mapping.getInputForward();
      
  2. 返回值:ActionForward對象 -->代表一個轉發路徑.  對應<forward>標記
    1) <forward>的常用屬性:
         name: 指定轉發路徑的邏輯名
         path: 指定路徑的URL。以/開頭
         redirect: 爲true,表示採用重定向。爲false,表示採用請求分派。默認false
    2)在Action的execute()方法中用actionMapping.findForward("邏輯名");來獲取
    3)也可以使用它的構造方法來創建 
               Forward(String path); 
               Forward(String name, String path);
               Forward(String name, String path, boolean redirect);
    4)如果要在轉發路徑上添加動態參數,怎麼辦?
        a. ActionForward forward = actionMapping.findForward("邏輯名");
           forward.setPath(forward.getPath() +"?參數名=" + 參數值);
           return forward;
        b. ActionForward forward = new ActionForward("xxx.jsp?參數名=" + 參數值);
           return forward;


五. DispatchAction類的使用:對於同一組相關的業務操作,使用DispatchAction可以減少Action的數量:  如針對同一個實體的CRUD
   1. <action>標記一定要加上parameter="method"
   2. 用戶的請求路徑URL一定要帶上<action>標記parameter屬性指定的參數:
          如xx.do?method=xxx
   3. 你寫的這個類要繼承自DispatchAction,且要有名字跟<action>標記parameter屬性指定的參數值相同的方法。其它跟execute()一樣。
       public ActionForward xxx(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res){ ...}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章