深刻解析Java的Struts框架中的掌握器DispatchAction。本站提示廣大學習愛好者:(深刻解析Java的Struts框架中的掌握器DispatchAction)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java的Struts框架中的掌握器DispatchAction正文
Struts中的表單處置器為ActionForm,而struts中的掌握器重要是Action,和DispatchAction掌握器等。
Action
在struts中,一切的用戶都邑經由ActionServlet的處置,而現實的任務是交給Action對象來處置的,ActionServlet可以從設置裝備擺設文件中創立ActionMapping對象,從ActionMapping對象中找到對應應用的Action,然後將用戶要求轉交給Action。
對Struts一個ActionMapping只能生成一個Action對象,當用戶提議要求的時刻會檢討所須要的Action對象能否存在,假如不存在就會生成一個Action對象,在今後的處置進程中應用這個對象。
當我們應用Action的時刻須要繼續arg.apache.struts.action.Action這個類,在子類中參加所須要的營業邏輯處置,這些子類會前往ActionForward對象,ActionServlet接收這個對象,把頁面轉發到指定頁面,從而把用戶要求的成果發送到對應的頁面。我們在struts-config.xml中停止設置裝備擺設。設置裝備擺設的重要屬性以下:
(1) path屬性:拜訪Action的URL地址,當用戶要求途徑和URL婚配時,ActionServlet會把這個用戶要求發送給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,這個類可以經完成相干營業邏輯所需辦法幾種在一個DispatchAction類中,我們繼續DispatchAction類後不重寫execute()辦法,而是編寫本身的辦法,在分歧的辦法中處置分歧的舉措。刪除用戶增刪改核對應的Action,樹立UserAction。
界面中挪用代碼以下所示。
<body> <a href="user/user_maint.do?command=list"title="請點擊拜訪用戶治理體系">用戶治理體系</a> </body>
個中list對應著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 { //挪用營業邏輯操作 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(); //挪用營業邏輯操作 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()); //挪用營業邏輯操作 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); //挪用營業邏輯操作 UserManager.getInstance().modifyUser(user); returnmapping.findForward("modify_success"); } /** * 依據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(); //挪用營業邏輯操作 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依據method參數的值把這個要求發送到掌握器UserAction的list辦法。如許獲得參數完成頁面的挪用。
從上述可以看出,DispatchAction可以經由過程command這個參數的值來決議挪用DispatchAction的哪一個辦法,DispatchAction是從用戶要求的URL中提取parameter界說參數的值,從而決議挪用哪一個辦法處置用戶要求。所以DispatchAction不克不及經由過程ActionForm向辦事器提交要求,由於提交表單的時刻不克不及向辦事器傳遞參數。
依據上述示例我們可以總結出DispatchAction與Action差別:Action是從表單中獲得數據,而且主動轉換為對應的類型。而DispatchAction獲得設置裝備擺設文件中parameter,截取parameter界說的參數值。然則DispatchAction可以處置多個舉措而不須要樹立多個Action。
DispatchAction可以在統一個掌握器中處置多個舉措,但只能經由過程URL來挪用掌握器,依據用戶提交的參數來決議挪用哪一個辦法來處置用戶要求。不克不及經由過程表單提交用戶要求信息,在struts中假如要在統一個表單中處置分歧的舉措,可使用LookupDispatchAction。在這裡就不具體講述了,有也許的童鞋可以查找些材料來完成。