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方法对表单进行验证。
配置示例如下代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<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。
界面中调用代码如下所示。
1
2
3
|
< body > < a href = "user/user_maint.do?command=list" title = "请点击访问用户管理系统" >用户管理系统</ a > </ body > |
其中list对应着UserAction中的list方法,传递的字符串与UserAction中的方法名相同。
UserAction中的代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
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配置文件代码如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
< 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。在这里就不详细讲述了,有兴许的童鞋可以查找些资料来实现。