<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 銀河使者 閱讀(53328) 評論(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
    主站蜘蛛池模板: 精品久久亚洲一级α| 亚洲日产2021三区在线| 亚洲成a人片在线不卡一二三区| 91精品导航在线网址免费| 亚洲尹人香蕉网在线视颅| 免费国产黄网站在线观看视频| 亚洲av无码不卡一区二区三区| a级黄色毛片免费播放视频| 国产亚洲成av人片在线观看| 久久这里只精品国产免费10| 精品日韩亚洲AV无码| 成年人视频免费在线观看| 一本色道久久88亚洲精品综合| 最近中文字幕mv免费高清电影| 亚洲欧美不卡高清在线| 四虎永久免费观看| www免费黄色网| 亚洲日本一区二区| 99精品全国免费观看视频| 亚洲国产AV无码一区二区三区| 免费人妻av无码专区| 两个人看的www高清免费视频| 久久亚洲日韩精品一区二区三区| 麻豆一区二区免费播放网站| 国产AV无码专区亚洲AV蜜芽| 亚洲中久无码不卡永久在线观看| 久久午夜免费鲁丝片| 亚洲国产成+人+综合| 免费一级黄色毛片| 久久久久久AV无码免费网站下载| 精品亚洲国产成人| 亚洲精品第一国产综合境外资源| 久久精品免费视频观看| 亚洲人成欧美中文字幕| 亚洲日韩精品一区二区三区| 亚洲视频免费播放| 色视频在线观看免费| 亚洲的天堂av无码| 免费国产人做人视频在线观看| 性xxxxx大片免费视频| 精品亚洲国产成人av|