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){ ...}
前端控制器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){ ...}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.