隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          公告

          關注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網站

          關注的網站

          協議

          喜歡的Blog

          國內廣告平臺

          圖書出版

          在線培訓

          開發工具

          微博客戶端

          手機鈴聲

          操作系統

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統

          數學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1974645
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          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 銀河使者 閱讀(53346) 評論(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
          主站蜘蛛池模板: 杂多县| 长顺县| 绵竹市| 右玉县| 民县| 昌都县| 灵石县| 富蕴县| 女性| 惠水县| 隆化县| 武安市| 洪雅县| 治县。| 潢川县| 即墨市| 扬中市| 蓬溪县| 赣州市| 富阳市| 汉阴县| 唐河县| 乌鲁木齐市| 格尔木市| 湖州市| 临武县| 济南市| 洱源县| 冀州市| 永川市| 龙山县| 昭苏县| 鸡西市| 施甸县| 南和县| 大丰市| 南陵县| 封开县| 巫山县| 阳山县| 电白县|