在很多Web应用中为了完成不同的工作一个HTML form标签中可能有两个或多个submit按钮如下面的代码所示
<![if !supportLineBreakNewLine]>
<htmlaction=…method=post>
……
<inputtype=submitvalue=保存/>
<inputtype=submitvalue=打印/>
</html>
由于在<form>中的多个提交按钮都向一个action提交使用Struts Action的execute方法就无法判断用户点击了哪一个提交按钮如果大家使用过Strutsx就会知道在Struts之前的版本需要使用一个LookupDispatchAction动作来处理含有多个submit的form但使用LookupDispatchAction动作需要访问属性文件还需要映射比较麻烦从Struts开始加入了一个EventDispatchAction动作这个类可以通过java反射来调用通过request参数指定的动作(实际上只是判断某个请求参数是不存在如果存在就调用在action类中和这个参数同名的方法)使用EventDispatchAction必须将submit的name属性指定不同的值以区分每个submit而在Struts中将更容易实现这个功能
当然我们也可以模拟EventDispatchAction的方法通过request获得和处理参数信息但这样比较麻烦在Struts中提供了另外一种方法使得无需要配置可以在同一个action类中执行不同的方法(默认执行的是execute方法)使用这种方式也需要通过请求参来来指定要执行的动作请求参数名的格式为
action!methodaction
注由于Struts只需要参数名因此参数值是什么都可以
下面我就给出一个实例程序来演示如何处理有多个submit的form
【第步】实现主页面(more_submitjsp)
<%@pagelanguage=javaimport=javautil*pageEncoding=GBK%>
<%@taglibprefix=suri=/strutstags%>
<html>
<head>
<title>MyJSPhellojspstartingpage</title>
</head>
<body>
<s:formaction=submitaction>
<s:textfieldname=msglabel=输入内容/>
<s:submitname=savevalue=保存align=leftmethod=save/>
<s:submitname=printvalue=打印align=leftmethod=print/>
</s:form>
</body>
</html>
在more_submitjsp中有两个submit保存和打印其中分别通过method属性指定了要调用的方法save和print因此在Action类中必须要有save和print方法
【第步】实现Action类(MoreSubmitAction)
packageaction;
importjavaxservlethttp*;importcomopensymphonyxworkActionSupport;importorgapachestrutsinterceptor*;publicclassMoreSubmitActionextendsActionSupportimplementsServletRequestAware{privateStringmsg;privatejavaxservlethttpHttpServletRequestrequest;//获得HttpServletRequest对象publicvoidsetServletRequest(HttpServletRequestrequest){thisrequest=request;}//处理savesubmit按钮的动作publicStringsave()throwsException{requestsetAttribute(result成功保存[+msg+]);returnsave;}//处理printsubmit按钮的动作publicStringprint()throwsException{requestsetAttribute(result成功打印[+msg+]);returnprint;}publicStringgetMsg(){returnmsg;}publicvoidsetMsg(Stringmsg){thismsg=msg;}}
上面的代码需要注意如下两点
save和print方法必须存在否则会抛出javalangNoSuchMethodException异常
Struts Action动作中的方法和Strutsx Action的execute不同只使用Struts Action动作的execute方法无法访问request对象因此Struts Action类需要实现一个Struts自带的拦截器来获得request对象拦截器如下
orgapachestrutsinterceptor ServletRequestAware
【第步】配置Struts Action
strutsxml的代码如下
<?xmlversion=encoding=UTF?>
<!DOCTYPEstrutsPUBLIC
//ApacheSoftwareFoundation//DTDStrutsConfiguration//EN
dtd>
<struts>
<packagename=demoextends=strutsdefault>
<actionname=submitclass=actionMoreSubmitAction>
<resultname=save>
/resultjsp
</result>
<resultname=print>
/resultjsp
</result>
</action>
</package>
</struts>
【第步】编写结果页(resultjsp)
<%@pagepageEncoding=GBK%>
<html>
<head>
<title>提交结果</title>
</head>
<body>
<h>${result}</h>
</body>
</html>
在resultjsp中将在save和print方法中写到request属性中的执行结果信息取出来并输出到客户端