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

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

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

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

    Struts2教程2:處理一個(gè)form多個(gè)submit

    本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

    上一篇:Struts2教程1:第一個(gè)Struts2程序

      在很多Web應(yīng)用中,為了完成不同的工作,一個(gè)HTML form標(biāo)簽中可能有兩個(gè)或多個(gè)submit按鈕,如下面的代碼所示:

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

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

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

    action!method.action

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

    下面我就給出一個(gè)實(shí)例程序來演示如何處理有多個(gè)submitform

    【第1步】實(shí)現(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中有兩個(gè)submit:保存和打印。其中分別通過method屬性指定了要調(diào)用的方法:saveprint。因此,在Action類中必須要有saveprint方法。

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

    上面的代碼需要注意如下兩點(diǎn):

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

    Struts2 Action動作中的方法和Struts1.x Actionexecute不同,只使用Struts2 Action動作的execute方法無法訪問request對象,因此,Struts2 Action類需要實(shí)現(xiàn)一個(gè)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中將在saveprint方法中寫到request屬性中的執(zhí)行結(jié)果信息取出來,并輸出到客戶端。

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

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

    大家也可以直接使用如下的URL來調(diào)用saveprint方法:

    調(diào)用save方法:http://localhost:8080/moresubmit/submit!save.action

    調(diào)用print方法:http://localhost:8080/moresubmit/submit!print.action

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


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





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

    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 銀河使者 閱讀(53329) 評論(41)  編輯  收藏 所屬分類: Struts2 原創(chuàng)

    評論

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

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

    public class MoreSubmitAction extends ActionSupport implements ServletRequestAware

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

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

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    學(xué)習(xí)了
    的確很好啊!!
    2008-10-22 16:06 | lyshyhaungli

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    @Hadis
    是這樣的,過濾器是對Servlet的,而Struts 2是通過攔截器來處理action的,當(dāng)客戶端發(fā)送請求時(shí),首先這個(gè)請求會被struts 2的過濾器攔截(在web.xml文件中可以看到處理action的struts 2過濾器),并進(jìn)行分析,如果是action,則進(jìn)行Struts 2的處理流程,也就是調(diào)用相應(yīng)的struts 2攔截器,最后會調(diào)用action類的execute方法。在這個(gè)過程中,和web.xml中配置的其他過濾器一點(diǎn)關(guān)系都沒有,因?yàn)樵趙eb.xml文件中配置的過濾器并不會過濾action,而處理action的是由struts2的攔截器完成的。

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

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    filter不是針對請求url的嗎?針對符合filter-mapping的url進(jìn)行處理,當(dāng)鏈上的所有fliter都處理結(jié)束的時(shí)候發(fā)送到請求的servlet,對吧?你的意思是不是說,因?yàn)轫撁嬲埱蟮馁Y源是一個(gè)action,所以struts2的filter得到請求之后并不發(fā)送到過濾鏈上。struts2是如何保證自己的filter優(yōu)先處理請求呢?我還有好多問題想請教如果方便的話希望博主可以加我的QQ:89477048
    2009-01-21 21:04 | Hadis

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    "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前面,這樣應(yīng)該是我的過濾器先處理請求將之編碼改變?yōu)镚BK,為什么是無效的呢?
    2009-01-21 21:12 | Hadis

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    @Hadis

    一般FilterDispatcher可設(shè)為"/*"以結(jié)果所有的請求,當(dāng)然,也可以設(shè)為*.action,只截獲action請求,

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

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

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    sdsfg

    2009-09-09 15:49 | f

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

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

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    org.apache.struts2.interceptor. ServletRequestAware

    2010-07-26 15:36 | 淘寶網(wǎng)女裝皇冠店

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    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:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    對樓主把提交的方法寫在jsp標(biāo)簽里表示不滿。
    <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:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    學(xué)習(xí)了
    2013-09-10 10:37 | 魚兒

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    樓主已經(jīng)寫得很詳細(xì)了, 補(bǔ)充一點(diǎn):
    可以帶參數(shù)調(diào)用print方法:
    http://localhost:8080/moresubmit/submit!print.action?msg=參數(shù)
    這樣更便于調(diào)試
    2014-02-07 16:33 | 呂小布

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    不錯(cuò)
    2014-04-02 00:12 | shunshine

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    博主您好,請教個(gè)問題。

    調(diào)用save方法:http://localhost:8080/moresubmit/submit!save.action

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

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    @ygh
    哥們,我之前也報(bào)你這個(gè)錯(cuò),后經(jīng)發(fā)現(xiàn)<constant name="struts.enable.DynamicMethodInvocation" value="true" /> value必須要是true,如果是false,就不能動態(tài)配置了 所以報(bào)錯(cuò)
    2014-06-24 11:05 | clear

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

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

    # re: Struts2教程2:處理一個(gè)form多個(gè)submit  回復(fù)  更多評論   

    @clear
    加上去已解決了,在struts.xml文件中打不出這個(gè)標(biāo)簽。。。
    2014-08-13 11:43 | leietal
    主站蜘蛛池模板: 91人成网站色www免费下载| 无码视频免费一区二三区 | 在线免费观看韩国a视频| 污视频网站在线观看免费| 亚洲AV无码成人精品区在线观看 | 免费国产作爱视频网站| 蜜芽亚洲av无码一区二区三区 | 国产精品亚洲综合网站| 情人伊人久久综合亚洲| 女性自慰aⅴ片高清免费| 黄色短视频免费看| 久久亚洲国产成人影院| 久久亚洲国产中v天仙www| 成年女人18级毛片毛片免费观看| 国产福利在线观看永久免费| 亚洲欧洲日本国产| 亚洲人成电影在线播放| 欧美最猛性xxxxx免费| 99在线视频免费观看| 亚洲老熟女五十路老熟女bbw| 亚洲va国产va天堂va久久| 国产精品99久久免费| 最近中文字幕大全免费视频| 久青草国产免费观看| 亚洲1区1区3区4区产品乱码芒果| 国产亚洲精品福利在线无卡一| 岛国av无码免费无禁网站| 亚在线观看免费视频入口| 有色视频在线观看免费高清在线直播 | 在线观看av永久免费| 国产在线观看免费av站| 国产成人+综合亚洲+天堂| 亚洲性色高清完整版在线观看| 亚洲精品午夜国产VA久久成人 | 国产性爱在线观看亚洲黄色一级片| 国产在线a免费观看| 一级毛片免费视频| 光棍天堂免费手机观看在线观看| 色屁屁在线观看视频免费| 亚洲日本va一区二区三区| 亚洲国产福利精品一区二区|