Struts2教程:处理一个form多个submit

在很多 Web 应用中,为了完成不同的工作,一个 HTML form 标签中可能有两个或多个 submit 按钮,如下面的代码所示:

1 <form action=""  method="post">
2  .............................................
3 <input type="submit" value="保存" />
4 <input type="submit" value="打印" />
5 </form>
由于在 <form> 中的多个提交按钮都向一个 action 提交,使用 Struts2 Action execute 方法就无法判断用户点击了哪一个提交按钮。如果大家使用过 Struts1.x 就会知道在 Struts1.2.9 之前的版本需要使用一个 LookupDispatchAction 动作来处理含有多个 submit form 。但使用 LookupDispatchAction 动作需要访问属性文件,还需要映射,比较麻烦。从 Struts1.2.9 开始,加入了一个 EventDispatchAction 动作。这个类可以通过 java 反射来调用通过 request 参数指定的动作(实际上只是判断某个请求参数是不存在,如果存在,就调用在 action 类中和这个参数同名的方法)。使用 EventDispatchAction 必须将 submit name 属性指定不同的值以区分每个 submit 。而在 Struts2 中将更容易实现这个功能。 
   
当然,我们也可以模拟EventDispatchAction的方法通过request获得和处理参数信息。但这
样比较麻烦。在Struts2中提供了另外一种方法,使得无需要配置可以在同一个action类中执
行不同的方法(默认执行的是execute方法)。使用这种方式也需要通过请求参来来指定要执
行的动作。请求参数名的格式为
action!method.action
注:由于Struts2只需要参数名,因此,参数值是什么都可以。
下面我就给出一个实例程序来演示如何处理有多个submit的form:
【第1步】实现主页面(more_submit.jsp)

 1 <%@ page language="java"  import="java.util.*" pageEncoding="GBK"%>
 2 <%@ taglib prefix="s" uri="/struts-tags" %>
 3 <html>
 4 <head>
 5 <title>My JSP 'hello.jsp' starting page</title>
 6 </head>
 7 <body>
 8 <s:form action="submit.action" >
 9 <s:textfield name="msg" label="输入内容"/>
10 <s:submit name="save" value="保存" align="left" method="save"/>
11 <s:submit name="print" value="打印" align="left" method="print" />
12 </s:form>
13 </body>
14 </html>
在more_submit.jsp中有两个submit:保存和打印。其中分别通过method属性指定了要调用
的方法:save和print。因此,在Action类中必须要有save和print方法。
【第2步】实现Action类(MoreSubmitAction)
 1  package action;
 2 
 3  import javax.servlet.http.*;
 4  import com.opensymphony.xwork2.ActionSupport;
 5  import org.apache.struts2.interceptor.*;
 6  public  class MoreSubmitAction  extends ActionSupport  implements ServletRequestAware
 7 {
 8  private String msg;
 9  private javax.servlet.http.HttpServletRequest request;
10  //  获得HttpServletRequest对象
11  public  void setServletRequest(HttpServletRequest request)
12 {
13  this.request = request;
14 }
15  //  处理save submit按钮的动作
16  public String save()  throws Exception
17 {
18 request.setAttribute("result", "成功保存[" + msg + "]");
19  return "save";
20 }
21  //  处理print submit按钮的动作
22  public String print()  throws Exception
23 {
24 request.setAttribute("result", "成功打印[" + msg + "]");
25  return "print";
26 }
27  public String getMsg()
28 {
29  return msg;
30 }
31  public  void setMsg(String msg)
32 {
33  this.msg = msg;
34 }
35 }
上面的代码需要注意如下两点:
save和print方法必须存在,否则会抛出java.lang.NoSuchMethodException异常。
Struts2 Action动作中的方法和Struts1.x Action的execute不同,只使用Struts2 Action动作的
execute方法无法访问request对象,因此,Struts2 Action类需要实现一个Struts2自带的拦
截器来获得request对象,拦截器如下:
org.apache.struts2.interceptor. ServletRequestAware
【第3步】配置Struts2 Action
struts.xml的代码如下:
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4 "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 <struts>
 6 < package name="demo"  extends="struts-default" >
 7 <action name="submit"  class="action.MoreSubmitAction">
 8 <result name="save" >
 9 /result.jsp
10 </result>
11 <result name="print">
12 /result.jsp
13 </result>
14 </action>
15 </ package>
16 </struts>
【第4步】编写结果页(result.jsp)
1 <%@ page pageEncoding="GBK"%>
2 <html>
3 <head>
4 <title>提交结果</title>
5 </head>
6 <body>
7 <h1>${result}</h1>
8 </body>
9 </html>  
 
在result.jsp中将在save和print方法中写到request属性中的执行结果信息取出来,并输出到
客户端。
启动Tomcat后,在IE中执行如下的URL来测试程序:
http://localhost:8080/moresubmit/more_submit.jsp
大家也可以直接使用如下的URL来调用save和print方法:
调用save方法:http://localhost:8080/moresubmit/submit!save.action
调用print方法:http://localhost:8080/moresubmit/submit!print.action

以前为了写这个想了很长时间,才知道原来name这个属性作用还真的蛮大。
其实再非struts标签中,即纯粹的html标签中也可以使用,写法为:
<input type="submit" name="method:save" value="save"/>
<input type="submit" name="method:print" value="print"/>
上文出自nokiaguy的个人博客,如果想查看原文请点击《 Struts2教程2:处理一个form多个submit 》


------------------------------------------------------
About Me's
                ------一个喜欢在一块青石阶上独立行走的人

你可能感兴趣的:(Struts2教程:处理一个form多个submit)