在很多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=submit class=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屬性中的執行結果信息取出來並輸出到客戶端
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28505.html