在很多 Web 應(yīng)用中,為了完成不同的工作,一個 HTML form 標(biāo)簽中可能有兩個或多個 submit 按鈕,如下面的代碼所示:
< html action ="" method ="post" >
< input type ="submit" value ="保存" />
< input type ="submit" value ="打印" />
</ html >
由于在 <form>中的多個提交按鈕都向一個 action提交,使用 Struts2 Action的 execute方法就無法判斷用戶點擊了哪一個提交按鈕。如果大家使用過 Struts1.x就會知道在 Struts1.2.9之前的版本需要使用一個 LookupDispatchAction動作來處理含有多個 submit的 form。但使用 LookupDispatchAction動作需要訪問屬性文件,還需要映射,比較麻煩。從 Struts1.2.9開始,加入了一個 EventDispatchAction動作。這個類可以通過 java反射來調(diào)用通過 request參數(shù)指定的動作(實際上只是判斷某個請求參數(shù)是不存在,如果存在,就調(diào)用在 action類中和這個參數(shù)同名的方法)。使用 EventDispatchAction必須將 submit的 name屬性指定不同的值以區(qū)分每個 submit。而在 Struts2中將更容易實現(xiàn)這個功能。
當(dāng)然,我們也可以模擬 EventDispatchAction的方法通過 request獲得和處理參數(shù)信息。但這樣比較麻煩。在 Struts2中提供了另外一種方法,使得無需要配置可以在同一個 action類中執(zhí)行不同的方法(默認(rèn)執(zhí)行的是 execute方法)。使用這種方式也需要通過請求參來來指定要執(zhí)行的動作。請求參數(shù)名的格式為
action!method.action
注:由于 Struts2只需要參數(shù)名,因此,參數(shù)值是什么都可以。
下面我就給出一個實例程序來演示如何處理有多個 submit的 form:
【第 1步】實現(xiàn)主頁面 (more_submit.jsp)
<% @ page language = " java " import = " java.util.* " pageEncoding = " GBK " %>
<% @ taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > My JSP 'hello.jsp' starting page </ title >
</ head >
< body >
< s:form action ="submit.action" >
< s:textfield name ="msg" label ="輸入內(nèi)容" />
< s:submit name ="save" value ="保存" align ="left" method ="save" />
< s:submit name ="print" value ="打印" align ="left" method ="print" />
</ s:form >
</ body >
</ html >在 more_submit.jsp中有兩個 submit:保存和打印。其中分別通過 method屬性指定了要調(diào)用的方法: save和 print。因此,在 Action類中必須要有 save和 print方法。
【第 2步】實現(xiàn) Action類( MoreSubmitAction)
package action;
import javax.servlet.http. * ;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor. * ;
public class MoreSubmitAction extends ActionSupport implements ServletRequestAware
{
private String msg;
private javax.servlet.http.HttpServletRequest request;
// 獲得HttpServletRequest對象
public void setServletRequest(HttpServletRequest request)
{
this .request = request;
}
// 處理save submit按鈕的動作
public String save() throws Exception
{
request.setAttribute( " result " , " 成功保存[ " + msg + " ] " );
return " save " ;
}
// 處理print submit按鈕的動作
public String print() throws Exception
{
request.setAttribute( " result " , " 成功打印[ " + msg + " ] " );
return " print " ;
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this .msg = msg;
}
}上面的代碼需要注意如下兩點:
save和 print方法必須存在,否則會拋出 java.lang.NoSuchMethodException異常。
Struts2 Action動作中的方法和 Struts1.x Action的 execute不同,只使用 Struts2 Action動作的 execute方法無法訪問 request對象,因此, Struts2 Action類需要實現(xiàn)一個 Struts2自帶的攔截器來獲得 request對象,攔截器如下:
org.apache.struts2.interceptor. ServletRequestAware【第 3步】配置 Struts2 Action
struts.xml 的代碼如下:
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="demo" extends ="struts-default" >
< action name ="submit" class ="action.MoreSubmitAction" >
< result name ="save" >
/result.jsp
</ result >
< result name ="print" >
/result.jsp
</ result >
</ action >
</ package >
</ struts >【第 4步】編寫結(jié)果頁( result.jsp)
<% @ page pageEncoding = " GBK " %>
< html >
< head >
< title > 提交結(jié)果 </ title >
</ head >
< body >
< h1 > ${result} </ h1 >
</ body >
</ html >在 result.jsp中將在 save和 print方法中寫到 request屬性中的執(zhí)行結(jié)果信息取出來,并輸出到客戶端。
啟動 Tomcat后,在 IE中執(zhí)行如下的 URL來測試程序:
http://localhost:8080/moresubmit/more_submit.jsp大家也可以直接使用如下的 URL來調(diào)用 save和 print方法:
調(diào)用 save方法: http://localhost:8080/moresubmit/submit!save.action調(diào)用 print方法: http://localhost:8080/moresubmit/submit!print.action