深入解析Java的Struts框架中的控制器DispatchAction
Struts中的表單處理器為ActionForm,而struts中的控制器主要是Action,以及DispatchAction控制器等。
Action
在struts中,所有的用戶都會經(jīng)過ActionServlet的處理,而實際的工作是交給Action對象來處理的,ActionServlet可以從配置文件中創(chuàng)建ActionMapping對象,從ActionMapping對象中找到對應使用的Action,然后將用戶請求轉交給Action。
對Struts一個ActionMapping只能生成一個Action對象,當用戶發(fā)起請求的時候會檢查所需要的Action對象是否存在,如果不存在就會生成一個Action對象,在以后的處理過程中使用這個對象。
當我們使用Action的時候需要繼承arg.apache.struts.action.Action這個類,在子類中加入所需要的業(yè)務邏輯處理,這些子類會返回ActionForward對象,ActionServlet接受這個對象,把頁面轉發(fā)到指定頁面,從而把用戶請求的結果發(fā)送到對應的頁面。我們在struts-config.xml中進行配置。配置的主要屬性如下:
(1) path屬性:訪問Action的URL地址,當用戶請求路徑和URL匹配時,ActionServlet會把這個用戶請求發(fā)送給Action處理。
(2) type屬性:指定處理請求的Action對應的類,需要寫類文件的包路徑。
(3) name屬性:指定我們的Action用到的ActionForm名字,這個ActionForm必須是在<form-beans>中定義過的。
(4) scope屬性:指定ActionForm的使用范圍,缺省值為session范圍。
(5) input屬性:指定表單驗證出錯的時候轉向頁面。
(6) validate屬性:指明是否自動調用ActionForm中的validate方法對表單進行驗證。
配置示例如下代碼。
<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>
問題
當我們完成用戶增刪改查操作時采用struts框架,我們需要為增刪改查建立四個不同的Action,如果有更多的增刪改查操作,比如對物料增刪改查也需要建立四個Action,這樣造成了大量的Action。
問題的解決
在struts中的Action類中,只提供了一個execute()方法,一個用戶請求URL只能對應一個servlet,在struts中提供了另一個控制器類org.apache.struts.actions.DispatchAction,這個類可以經(jīng)完成相關業(yè)務邏輯所需方法幾種在一個DispatchAction類中,我們繼承DispatchAction類后不重寫execute()方法,而是編寫自己的方法,在不同的方法中處理不同的動作。刪除用戶增刪改查對應的Action,建立UserAction。

界面中調用代碼如下所示。
<body> <a href="user/user_maint.do?command=list"title="請點擊訪問用戶管理系統(tǒng)">用戶管理系統(tǒng)</a> </body>
其中l(wèi)ist對應著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 {
//調用業(yè)務邏輯操作
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;
//取得需要刪除的userId的集合
String[] userIdList = uaf.getSelectFlag();
//調用業(yè)務邏輯操作
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());
//調用業(yè)務邏輯操作
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);
//調用業(yè)務邏輯操作
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();
//調用業(yè)務邏輯操作
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的時候,配置了parameter屬性,并且指定了parameter屬性值為command,當用戶單擊添加或刪除用戶操作時,會以http://localhost:8080/struts_dispatchaction_usermgr/user/user_maint.do?command=list,這個請求會被映射到UserAction控制器中,Struts根據(jù)method參數(shù)的值把這個請求發(fā)送到控制器UserAction的list方法。這樣取得參數(shù)完成頁面的調用。
從上述可以看出,DispatchAction可以通過command這個參數(shù)的值來決定調用DispatchAction的哪個方法,DispatchAction是從用戶請求的URL中提取parameter定義參數(shù)的值,從而決定調用哪個方法處理用戶請求。所以DispatchAction不能通過ActionForm向服務器提交請求,因為提交表單的時候不能向服務器傳遞參數(shù)。
根據(jù)上述示例我們可以總結出DispatchAction與Action區(qū)別:Action是從表單中取得數(shù)據(jù),并且自動轉換為對應的類型。而DispatchAction取得配置文件中parameter,截取parameter定義的參數(shù)值。但是DispatchAction可以處理多個動作而不需要建立多個Action。
DispatchAction可以在同一個控制器中處理多個動作,但只能通過URL來調用控制器,根據(jù)用戶提交的參數(shù)來決定調用哪個方法來處理用戶請求。不能通過表單提交用戶請求信息,在struts中如果要在同一個表單中處理不同的動作,可以使用LookupDispatchAction。在這里就不詳細講述了,有興許的童鞋可以查找些資料來實現(xiàn)。
相關文章
SpringBoot實現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例
本文主要介紹了SpringBoot實現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04
springboot使用redis實現(xiàn)從配置到實戰(zhàn)
本文主要介紹了springboot使用redis ,采用的是RedisTemplate的形式,還有一種采用spring支持的注解進行訪問緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Spring boot 在idea中添加熱部署插件的圖文教程
這篇文章主要介紹了Spring boot 在idea中添加熱部署插件的圖文教程,本文通過圖文并茂的形式給大家展示具體步驟,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10
java中@EnableAutoConfiguration注解使用
在Spring Boot框架中,@EnableAutoConfiguration是一種非常重要的注解,本文就來介紹一下java中@EnableAutoConfiguration注解使用,感興趣的可以了解一下2023-11-11
SpringBoot+SpringSession+Redis實現(xiàn)session共享及唯一登錄示例
這篇文章主要介紹了SpringBoot+SpringSession+Redis實現(xiàn)session共享及唯一登錄示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04

