在很多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=
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26511.html