在很多Web应用中为了完成不同的工作一个HTML form标签中可能有两个或多个submit按钮如下面的代码所示
<![if !supportLineBreakNewLine]>
<html action= method=post>
<input type=submit value=保存 />
<input type=submit value=打印 />
</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)
<%@ page language=java import=javautil* pageEncoding=GBK%>
<%@ taglib prefix=s uri=/strutstags %>
<html>
<head>
<title>My JSP hellojsp starting page</title>
</head>
<body>
<s:form action=submitaction >
<s:textfield name=msg label=输入内容/>
<s:submit name=save value=保存 align=left method=save/>
<s:submit name=print value=打印 align=left method=print />
</s:form>
</body>
</html>
在more_submitjsp中有两个submit保存和打印其中分别通过method属性指定了要调用的方法save和print因此在Action类中必须要有save和print方法
【第步】实现Action类(MoreSubmitAction)
package action;
import javaxservlethttp*;
import comopensymphonyxworkActionSupport;
import orgapachestrutsinterceptor*;
public class MoreSubmitAction extends ActionSupport implements
ServletRequestAware {
private String msg;
private javaxservlethttpHttpServletRequest request;
// 获得HttpServletRequest对象
public void setServletRequest(HttpServletRequest request) {
thisrequest = request;
}
// 处理save submit按钮的动作
public String save() throws Exception {
requestsetAttribute(result 成功保存[ + msg + ]);
return save;
}
// 处理print submit按钮的动作
public String print() throws Exception {
requestsetAttribute(result 成功打印[ + msg + ]);
return print;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
thismsg = msg;
}
}
上面的代码需要注意如下两点
save和print方法必须存在否则会抛出javalangNoSuchMethodException异常
Struts Action动作中的方法和Strutsx Action的execute不同只使用Struts Action动作的execute方法无法访问request对象因此Struts Action类需要实现一个Struts自带的拦截器来获得request对象拦截器如下
orgapachestrutsinterceptor ServletRequestAware
【第步】配置Struts Action
strutsxml的代码如下
<?xml version= encoding=UTF ?>
<!DOCTYPE struts PUBLIC
//Apache Software Foundation//DTD Struts Configuration //EN
dtd>
<struts>
<package name=demo extends=strutsdefault >
<action name=submit class=actionMoreSubmitAction>
<result name=save >
/resultjsp
</result>
<result name=print>
/resultjsp
</result>
</action>
</package>
</struts>
【第步】编写结果页(resultjsp) <%@ page pageEncoding=GBK%>
<html>
<head>
<title>提交结果</title>
</head>
<body>
<h>${result}</h>
</body>
</html>
在resultjsp中将在save和print方法中写到request属性中的执行结果信息取出来并输出到客户端
启动Tomcat后在IE中执行如下的URL来测试程序
大家也可以直接使用如下的URL来调用save和print方法
调用save方法//localhost:/moresubmit/submit!saveaction
调用print方法//localhost:/moresubmit/submit!printaction
源代码?aid=