Struts旅程(五)struts控制器DispatchAction
来源:互联网 发布:守望先锋 网络质量 编辑:程序博客网 时间:2024/05/16 13:59
上篇演示了struts框架的由来,从而体现struts框架优点。Struts中的表单处理器为ActionForm,而struts中的控
s制器主要是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(如图5.1)。
图5.1
界面中调用代码如下所示。
- <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。在这里就不详细讲述了,有兴许的童鞋可以查找些资料来实现。
下一篇struts页面转发控制ActionForward和ActionMapping。
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(五)struts控制器DispatchAction
- struts控制器DispatchAction
- Struts -- DispatchAction
- struts DispatchAction
- struts DispatchAction
- Struts-DispatchAction
- struts旅程(二)Struts登录示例
- struts旅程(二)Struts登录示例
- struts旅程(二)Struts登录示例
- struts旅程(二)Struts登录示例
- Struts之DispatchAction使用(录像教程)
- Struts 之 DispatchAction
- Struts : 使用 DispatchAction
- Struts 之 DispatchAction
- Struts : DispatchAction 的使用
- Struts之DispatchAction
- Struts之DispatchAction
- 购买阿里云服务器-创建阿里云实例
- 我的产品开发之旅(4) - 设计UI定义相关表
- 漫谈继承技术(三)
- 倒置一个句子中的英文单词
- 课题投票(WEB开发)
- Struts旅程(五)struts控制器DispatchAction
- Java中自定义枚举(Enum)项的值,可设置为指定的值
- qt:graphicsitem graphicsscene graphicsview坐标关系实例
- linux主机名称的小问题
- char* 和char []的区别
- 如何彻底卸载和重装ADS1.2//ADS与K…
- STM32输出PWM状态总结
- 为所有li节点增加onclick事件
- STM32如何配置使用SPI通信