深入解析Java的Struts框架中的控制器DispatchAction
Struts中的表單處理器為ActionForm,而struts中的控制器主要是Action,以及DispatchAction控制器等。
Action
在struts中,所有的用戶都會(huì)經(jīng)過ActionServlet的處理,而實(shí)際的工作是交給Action對象來處理的,ActionServlet可以從配置文件中創(chuàng)建ActionMapping對象,從ActionMapping對象中找到對應(yīng)使用的Action,然后將用戶請求轉(zhuǎn)交給Action。
對Struts一個(gè)ActionMapping只能生成一個(gè)Action對象,當(dāng)用戶發(fā)起請求的時(shí)候會(huì)檢查所需要的Action對象是否存在,如果不存在就會(huì)生成一個(gè)Action對象,在以后的處理過程中使用這個(gè)對象。
當(dāng)我們使用Action的時(shí)候需要繼承arg.apache.struts.action.Action這個(gè)類,在子類中加入所需要的業(yè)務(wù)邏輯處理,這些子類會(huì)返回ActionForward對象,ActionServlet接受這個(gè)對象,把頁面轉(zhuǎn)發(fā)到指定頁面,從而把用戶請求的結(jié)果發(fā)送到對應(yīng)的頁面。我們在struts-config.xml中進(jìn)行配置。配置的主要屬性如下:
(1) path屬性:訪問Action的URL地址,當(dāng)用戶請求路徑和URL匹配時(shí),ActionServlet會(huì)把這個(gè)用戶請求發(fā)送給Action處理。
(2) type屬性:指定處理請求的Action對應(yīng)的類,需要寫類文件的包路徑。
(3) name屬性:指定我們的Action用到的ActionForm名字,這個(gè)ActionForm必須是在<form-beans>中定義過的。
(4) scope屬性:指定ActionForm的使用范圍,缺省值為session范圍。
(5) input屬性:指定表單驗(yàn)證出錯(cuò)的時(shí)候轉(zhuǎn)向頁面。
(6) validate屬性:指明是否自動(dòng)調(diào)用ActionForm中的validate方法對表單進(jìn)行驗(yàn)證。
配置示例如下代碼。
<struts-config> <form-beans> <form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm" /> </form-beans> <action-mappings> <action path="/login" type="com.bjpowernode.struts.LoginAction" name="loginForm" scope="request" > <forward name="success" path="/login_success.jsp"/> <forward name="error" path="/login_error.jsp"/> </action> </action-mappings> </struts-config>
問題
當(dāng)我們完成用戶增刪改查操作時(shí)采用struts框架,我們需要為增刪改查建立四個(gè)不同的Action,如果有更多的增刪改查操作,比如對物料增刪改查也需要建立四個(gè)Action,這樣造成了大量的Action。
問題的解決
在struts中的Action類中,只提供了一個(gè)execute()方法,一個(gè)用戶請求URL只能對應(yīng)一個(gè)servlet,在struts中提供了另一個(gè)控制器類org.apache.struts.actions.DispatchAction,這個(gè)類可以經(jīng)完成相關(guān)業(yè)務(wù)邏輯所需方法幾種在一個(gè)DispatchAction類中,我們繼承DispatchAction類后不重寫execute()方法,而是編寫自己的方法,在不同的方法中處理不同的動(dòng)作。刪除用戶增刪改查對應(yīng)的Action,建立UserAction。
界面中調(diào)用代碼如下所示。
<body> <a href="user/user_maint.do?command=list"title="請點(diǎn)擊訪問用戶管理系統(tǒng)">用戶管理系統(tǒng)</a> </body>
其中l(wèi)ist對應(yīng)著UserAction中的list方法,傳遞的字符串與UserAction中的方法名相同。
UserAction中的代碼如下所示:
packagecom.bjpowernode.drp.web.actions; importjava.util.Date; importjava.util.List; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.commons.beanutils.BeanUtils; importorg.apache.struts.action.ActionForm; importorg.apache.struts.action.ActionForward; importorg.apache.struts.action.ActionMapping; importorg.apache.struts.actions.DispatchAction; importcom.bjpowernode.drp.manager.UserManager; importcom.bjpowernode.drp.model.User; importcom.bjpowernode.drp.web.forms.UserActionForm; public classUserAction extends DispatchAction { protected ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { //調(diào)用業(yè)務(wù)邏輯操作 List userList = UserManager.getInstance().findAllUserList(); request.setAttribute("userlist",userList); returnmapping.findForward("list_success"); } /** * 用戶刪除 * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward del(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throws Exception { //獲取從頁面表單中提交過來的值 UserActionForm uaf = (UserActionForm)form; //取得需要?jiǎng)h除的userId的集合 String[] userIdList = uaf.getSelectFlag(); //調(diào)用業(yè)務(wù)邏輯操作 UserManager.getInstance().deleteUsers(userIdList); return mapping.findForward("del_success"); } /** * 用戶添加 * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throwsException { //獲取從頁面表單中提交過來的值 UserActionForm uaf = (UserActionForm)form; Useruser = new User(); BeanUtils.copyProperties(user,uaf); user.setCreateDate(newDate()); //調(diào)用業(yè)務(wù)邏輯操作 UserManager.getInstance().addUser(user); returnmapping.findForward("add_success"); } /** * 修改用戶 * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward modify(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { //獲取從頁面表單中提交過來的值 UserActionForm uaf = (UserActionForm)form; User user = new User(); BeanUtils.copyProperties(user,uaf); //調(diào)用業(yè)務(wù)邏輯操作 UserManager.getInstance().modifyUser(user); returnmapping.findForward("modify_success"); } /** * 根據(jù)ID查詢用戶 * * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward find(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { //獲取從頁面表單中提交過來的值 UserActionForm uaf = (UserActionForm)form; String userId = uaf.getUserId(); //調(diào)用業(yè)務(wù)邏輯操作 User user = UserManager.getInstance().findUserById(userId); //將user對象從Action傳遞到JSP頁面 request.setAttribute("user",user); returnmapping.findForward("find_success"); } }
Struts-config.xml配置文件代碼如下所示。
<struts-config> <form-beans> <form-bean name="userForm"type="com.bjpowernode.drp.web.forms.UserActionForm"/> </form-beans> <action-mappings> <action path="/user/user_maint" type="com.bjpowernode.drp.web.actions.UserAction" name="userForm" scope="request" parameter="command" > <forward name="list_success" path="/user/user_list.jsp"/> <forward name="del_success" path="/user/user_maint.do?command=list"redirect="true"/> <forward name="add_success" path="/user/user_maint.do?command=list"redirect="true"/> <forward name="modify_success" path="/user/user_maint.do?command=list"redirect="true"/> <forward name="find_success" path="/user/user_modify.jsp"/> </action-mappings> </struts-config>
其中配置Action的時(shí)候,配置了parameter屬性,并且指定了parameter屬性值為command,當(dāng)用戶單擊添加或刪除用戶操作時(shí),會(huì)以http://localhost:8080/struts_dispatchaction_usermgr/user/user_maint.do?command=list,這個(gè)請求會(huì)被映射到UserAction控制器中,Struts根據(jù)method參數(shù)的值把這個(gè)請求發(fā)送到控制器UserAction的list方法。這樣取得參數(shù)完成頁面的調(diào)用。
從上述可以看出,DispatchAction可以通過command這個(gè)參數(shù)的值來決定調(diào)用DispatchAction的哪個(gè)方法,DispatchAction是從用戶請求的URL中提取parameter定義參數(shù)的值,從而決定調(diào)用哪個(gè)方法處理用戶請求。所以DispatchAction不能通過ActionForm向服務(wù)器提交請求,因?yàn)樘峤槐韱蔚臅r(shí)候不能向服務(wù)器傳遞參數(shù)。
根據(jù)上述示例我們可以總結(jié)出DispatchAction與Action區(qū)別:Action是從表單中取得數(shù)據(jù),并且自動(dòng)轉(zhuǎn)換為對應(yīng)的類型。而DispatchAction取得配置文件中parameter,截取parameter定義的參數(shù)值。但是DispatchAction可以處理多個(gè)動(dòng)作而不需要建立多個(gè)Action。
DispatchAction可以在同一個(gè)控制器中處理多個(gè)動(dòng)作,但只能通過URL來調(diào)用控制器,根據(jù)用戶提交的參數(shù)來決定調(diào)用哪個(gè)方法來處理用戶請求。不能通過表單提交用戶請求信息,在struts中如果要在同一個(gè)表單中處理不同的動(dòng)作,可以使用LookupDispatchAction。在這里就不詳細(xì)講述了,有興許的童鞋可以查找些資料來實(shí)現(xiàn)。
- Java的Struts框架中配置國際化的資源存儲的要點(diǎn)解析
- 詳解Java的Struts框架以及相關(guān)的MVC設(shè)計(jì)理念
- Java的Struts框架中登陸功能的實(shí)現(xiàn)和表單處理器的使用
- Java的Struts框架中append標(biāo)簽與generator標(biāo)簽的使用
- 簡單說明Java的Struts框架中merge標(biāo)簽的使用方法
- 總結(jié)Java的Struts框架的異常處理方法
- 詳解Java的Struts框架中注釋的用法
- Java的Struts框架中Action的編寫與攔截器的使用方法
- Java下Struts框架中的ActionForm類詳解
相關(guān)文章

SpringBoot實(shí)現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例

springboot使用redis實(shí)現(xiàn)從配置到實(shí)戰(zhàn)

Spring boot 在idea中添加熱部署插件的圖文教程

java中@EnableAutoConfiguration注解使用

SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例