隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          Struts2教程2:處理一個form多個submit

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          上一篇:Struts2教程1:第一個Struts2程序

            在很多Web應用中,為了完成不同的工作,一個HTML form標簽中可能有兩個或多個submit按鈕,如下面的代碼所示:

          <html action=""  method="post">
           
          <input type="submit" value="保存" />
          <input type="submit" value="打印" />
          </html>

          由于在<form>中的多個提交按鈕都向一個action提交,使用Struts2 Actionexecute方法就無法判斷用戶點擊了哪一個提交按鈕。如果大家使用過Struts1.x就會知道在Struts1.2.9之前的版本需要使用一個LookupDispatchAction動作來處理含有多個submitform。但使用LookupDispatchAction動作需要訪問屬性文件,還需要映射,比較麻煩。從Struts1.2.9開始,加入了一個EventDispatchAction動作。這個類可以通過java反射來調用通過request參數指定的動作(實際上只是判斷某個請求參數是不存在,如果存在,就調用在action類中和這個參數同名的方法)。使用EventDispatchAction必須將submitname屬性指定不同的值以區分每個submit。而在Struts2中將更容易實現這個功能。

          當然,我們也可以模擬EventDispatchAction的方法通過request獲得和處理參數信息。但這樣比較麻煩。在Struts2中提供了另外一種方法,使得無需要配置可以在同一個action類中執行不同的方法(默認執行的是execute方法)。使用這種方式也需要通過請求參來來指定要執行的動作。請求參數名的格式為

          action!method.action

          注:由于Struts2只需要參數名,因此,參數值是什么都可以。

          下面我就給出一個實例程序來演示如何處理有多個submitform

          【第1步】實現主頁面(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="輸入內容"/>  
                  
          <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屬性指定了要調用的方法:saveprint。因此,在Action類中必須要有saveprint方法。

          【第2步】實現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;
              }
          }

          上面的代碼需要注意如下兩點:

          saveprint方法必須存在,否則會拋出java.lang.NoSuchMethodException異常。

          Struts2 Action動作中的方法和Struts1.x Actionexecute不同,只使用Struts2 Action動作的execute方法無法訪問request對象,因此,Struts2 Action類需要實現一個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步】編寫結果頁(result.jsp


          <%@ page pageEncoding="GBK"%>
          <html>
            
          <head>
              
          <title>提交結果</title>
            
          </head>
            
          <body>
              
          <h1>${result}</h1>
            
          </body>
          </html>

          result.jsp中將在saveprint方法中寫到request屬性中的執行結果信息取出來,并輸出到客戶端。

          啟動Tomcat后,在IE中執行如下的URL來測試程序:

              http://localhost:8080/moresubmit/more_submit.jsp

          大家也可以直接使用如下的URL來調用saveprint方法:

          調用save方法:http://localhost:8080/moresubmit/submit!save.action

          調用print方法:http://localhost:8080/moresubmit/submit!print.action

          源代碼:http://www.itpub.net/attachment.php?aid=520773


          下一篇:Struts2教程3:struts.xml常用配置解析





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-04-16 09:18 銀河使者 閱讀(53334) 評論(41)  編輯  收藏 所屬分類: Struts2 原創

          評論

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          使用dmi也可以實現.另外問一下result里面的name屬性可以自定義.有什么原則?
          2008-07-19 21:36 | aidirac

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          result里面的屬性可以是任何值,不能是execute,還有其它幾個actionsupport定義的方法名,否則會拋出異常,
          2008-07-19 21:56 | 銀河使者

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          實現多submit的方法非常多,這只是其中之一,在struts1.2.9以后的struts1.x版本中提供了一個action來處理,原理是通過判斷某個請求參數是否為null來處理(這個請求參數就是某個submit的name屬性值)
          2008-07-19 21:58 | 銀河使者

          # re: Struts2教程2:處理一個form多個submit[未登錄]  回復  更多評論   

          public class MoreSubmitAction extends ActionSupport implements ServletRequestAware

          這個就是一個action處理不同的請求,類似于strtus1.2中的dispachaction 呵呵o(∩_∩)o... 還有你說的多個submit大題小做了 還有更簡單的方法 可以把<input type="submit" value="打印"> 改成不同的按鈕,在onclick事件中動態改變action就可以了 超簡單 <input type="button" value="打印" onclick="print();">

          <script>
          function print(){
          document.forms.testForm.action="你要轉到的action";
          document.forms.testForm.submit();//提交表單
          }
          </script>

          你的教程寫的很棒,支持樓主額!贊一個,狂頂!?。。。。。?!(*^__^*) 嘻嘻……
          2008-08-18 01:55 | 小毅

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          沒錯,用javascript也是一種方法。不過我的教程只在演示struts 2關于這方面的功能,并不是為了實現而實現。 用javascript適合于所有的語言、所有的web系統。
          2008-08-18 09:24 | 銀河使者

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          學習了
          的確很好?。?!
          2008-10-22 16:06 | lyshyhaungli

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          感謝樓主!一直支持!
          2008-11-12 15:28 | luo

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          x寫的 很好
          2008-11-26 14:07 | bb

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          可能在按鈕的action屬性來指定要提交的東西!
          2008-12-17 10:53 | zhongmingweixp

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          寫的很好, 頂,頂,頂,頂,頂,頂,頂,頂,頂,頂,頂.........
          2009-01-19 13:44 | java_xu

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          本例中依然有編碼問題,在表單中填入中文,提交后無法顯示。我添加了一個filter進行調用request.setCharacterEncoding("GBK") , 并且將該filter配置在FilterDispatcher之前,但是依然無效。不解,希望博主指教。
          2009-01-21 17:37 | Hadis

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @Hadis
          是這樣的,Struts 2默認采用了UTF-8編碼(可以在struts.properties或struts.xml文件中修改這一設置),而我用的是GBK,把你的程序都改成UTF-8試試。實在不行,把你做的例子發給我,我的mail是asklining@126.com,我看看。發過來時別忘了留言。
          2009-01-21 17:49 | 銀河使者

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          我把more_submit.jsp的pageEncoding改成UTF-8 可以顯示中文了
          但是為什么這個時候使用過濾器設置request的編碼無效了呢?
          2009-01-21 18:49 | Hadis

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @Hadis
          是這樣的,過濾器是對Servlet的,而Struts 2是通過攔截器來處理action的,當客戶端發送請求時,首先這個請求會被struts 2的過濾器攔截(在web.xml文件中可以看到處理action的struts 2過濾器),并進行分析,如果是action,則進行Struts 2的處理流程,也就是調用相應的struts 2攔截器,最后會調用action類的execute方法。在這個過程中,和web.xml中配置的其他過濾器一點關系都沒有,因為在web.xml文件中配置的過濾器并不會過濾action,而處理action的是由struts2的攔截器完成的。

          如果客戶端發送的是非action的請求,則struts2會將其交由Servlet引擎來處理,這時過濾器才有效。

          如果非要在程序中設置request的編碼,可以在struts 2的攔截器中設置。
          2009-01-21 19:20 | 銀河使者

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          filter不是針對請求url的嗎?針對符合filter-mapping的url進行處理,當鏈上的所有fliter都處理結束的時候發送到請求的servlet,對吧?你的意思是不是說,因為頁面請求的資源是一個action,所以struts2的filter得到請求之后并不發送到過濾鏈上。struts2是如何保證自己的filter優先處理請求呢?我還有好多問題想請教如果方便的話希望博主可以加我的QQ:89477048
          2009-01-21 21:04 | Hadis

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          "Filters with matching URL patterns are placed in the chain in the order in which they are declared in the DD"這一句是我從head first上面copy的,我把自己的requestEncodingFliter聲明在struts2的FilterDispatcher前面,這樣應該是我的過濾器先處理請求將之編碼改變為GBK,為什么是無效的呢?
          2009-01-21 21:12 | Hadis

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @Hadis

          一般FilterDispatcher可設為"/*"以結果所有的請求,當然,也可以設為*.action,只截獲action請求,

          不知你客戶端的jsp頁面是GBK,還是utf-8,就算你在自己的過濾器中設了GBK,在執行FilterDispathcer時仍然按著Struts 2的設置來處理,就是說,還是會設成utf-8。你可以在自己的過濾器中在設置完request的gbk編碼后,使用request.getParameter方法來自己讀一下請求參數的值,看看是不是亂碼!
          2009-01-21 21:21 | 銀河使者

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          十分感謝博主的提示~??!
          2009-01-21 21:54 | Hadis

          # re: Struts2教程2:處理一個form多個submit[未登錄]  回復  更多評論   

          希望能把標簽生成的html和js部分貼出來就好,這樣更方便理解
          2009-03-12 23:05 | yxy

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @yxy
          這個沒什么不好理解的,只是通過url來通知服務端調用哪個方法。
          2009-03-13 08:38 | 銀河使者

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          sdsfg

          2009-09-09 15:49 | f

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          教程非常好!
          2010-03-09 10:19 | man

          # re: Struts2教程2:處理一個form多個submit[未登錄]  回復  更多評論   

          很通俗,很好,很容易看懂,多謝
          2010-07-20 20:53 | 楓葉

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          org.apache.struts2.interceptor. ServletRequestAware

          2010-07-26 15:36 | 淘寶網女裝皇冠店

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          博主,問一個弱智問題,${result}為什么取不到屬性值?
          2010-11-03 10:52 | micahel

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          buxing a :ljh0242@163.com
          2011-03-22 09:28 | ljj

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          問一下,如果想使用超鏈接,通過js提交form跳轉該如何寫呢,我在firefox里試可以,但在ie中卻不行,能進入action,但頁面只是刷一下,沒有跳到相應的頁面
          2011-04-27 10:51 | ssjtt

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          真的是個好東西 啊 謝謝樓主了啊啊
          2011-05-31 21:40 | ealge

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          轉到的result頁面依然顯示是${result}..為什么呢?
          2011-08-31 20:15 | ysj

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          Struts has detected an unhandled exception:

          Messages: No result defined for action ygh.struts.moresubmit.action.MoreSubmitAction and result success

          2011-11-13 09:48 | ygh

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @銀河使者
          你可以使用<c:out value="${result}" />
          2011-11-24 09:39 | 刀傷

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          對樓主把提交的方法寫在jsp標簽里表示不滿。
          <s:submit name="save" value="保存" align="left" method="save"/>
          <s:submit name="print" value="打印" align="left" method="print" />



          我覺得寫在這里更合理些
          <struts>
          <package name="demo" extends="struts-default" >
          <action name="submit" class="action.MoreSubmitAction" method = " 這里 ">
          <result name="save" >
          2012-06-21 14:29 | lukia

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          學習了
          2013-09-10 10:37 | 魚兒

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          樓主已經寫得很詳細了, 補充一點:
          可以帶參數調用print方法:
          http://localhost:8080/moresubmit/submit!print.action?msg=參數
          這樣更便于調試
          2014-02-07 16:33 | 呂小布

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          為什么我照著做,返回的是No result defined for action action.MoreSubmitAction and result success
          2014-03-07 22:07 | Fylee

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          不錯
          2014-04-02 00:12 | shunshine

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          博主你好,如果method是用在jsp表單那執行會出現錯誤,應該是沒有傳回相應的method,我將method放在struts.xml的action里面并指定一個method就可以實現,不過兩個按鈕只顯示一個值
          2014-04-02 11:09 | anymore

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          博主您好,請教個問題。

          調用save方法:http://localhost:8080/moresubmit/submit!save.action

          我配置的是/* 不是*.action

          請問我直接地址欄輸入應該怎么寫?
          2014-06-04 11:34 | yoursair

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @ygh
          哥們,我之前也報你這個錯,后經發現<constant name="struts.enable.DynamicMethodInvocation" value="true" /> value必須要是true,如果是false,就不能動態配置了 所以報錯
          2014-06-24 11:05 | clear

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @clear
          請問這個代碼是寫在哪里呢?struts.xml?
          2014-08-13 11:24 | leietal

          # re: Struts2教程2:處理一個form多個submit  回復  更多評論   

          @clear
          加上去已解決了,在struts.xml文件中打不出這個標簽。。。
          2014-08-13 11:43 | leietal
          主站蜘蛛池模板: 陆河县| 丰宁| 大港区| 东乌珠穆沁旗| 美姑县| 建湖县| 宜良县| 临泉县| 林芝县| 克拉玛依市| 资兴市| 乌恰县| 大庆市| 邵东县| 建水县| 桃园县| 平泉县| 卢湾区| 滁州市| 盱眙县| 朝阳区| 奈曼旗| 陇南市| 宝坻区| 徐水县| 霍城县| 商洛市| 东安县| 图们市| 宝坻区| 六盘水市| 南陵县| 海晏县| 石狮市| 湟中县| 徐州市| 临沧市| 张掖市| 土默特右旗| 甘泉县| 且末县|