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

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

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

    隨筆 - 42  文章 - 71  trackbacks - 0
    <2009年1月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    避免重復(fù)提交這個(gè)問題在Web應(yīng)用開發(fā)領(lǐng)域應(yīng)該是一個(gè)老生常談的問題了,主流的一些Web應(yīng)用框架也提供了方便使用的功能來(lái)實(shí)現(xiàn)這個(gè)需求,比如Struts的Token。但是有些時(shí)候,可能用戶確實(shí)需要刷新提交之后所轉(zhuǎn)到的頁(yè)面,比如假設(shè)如下的需求:用戶注冊(cè)了一個(gè)賬號(hào),但是這個(gè)賬號(hào)需要管理員批準(zhǔn)才可以進(jìn)行工作,于是,用戶在注冊(cè)頁(yè)面填寫了詳細(xì)信息之后,提交,轉(zhuǎn)到詳細(xì)信息頁(yè)面,然后刷新這個(gè)頁(yè)面來(lái)查看自己的狀態(tài)。此時(shí),我覺得使用redirect是非常方便的。

    以下是redirect在Struts1和Struts2中的實(shí)現(xiàn):

     

    Struts1

    在Struts1中,有一個(gè)org.apache.struts.action.ActionRedirect的類,這個(gè)類是ActionForward類的子類,是專門用來(lái)做redirect跳轉(zhuǎn)的。使用起來(lái)非常的簡(jiǎn)單,只需在你的Action類的方法中,返回一個(gè)ActionRedirect類的實(shí)例即可。

    ----------------------------------------------------

    ActionRedirect redirect = new ActionRedirect(mapping.findForward("detailAction")); // 這里是在struts-config.xml文件中定義的<forward>節(jié)點(diǎn)的name屬性
            redirect.addParameter("id", user.getId()); //這里是要在url后面附加的參數(shù)名稱及其值

    return redirect;

    ----------------------------------------------------

     

    Struts2:

    在Struts2中,情況有所不同。但是Struts2里面的方式,更加的合理,因?yàn)椴恍枰贏ction代碼中編碼來(lái)完成,完全是通過配置完成的。在配置文件struts.xml中,

    ----------------------------------------------------

            <action name="userCreate" method="create" class="lab.action.UserAction">
                <result name="detailAction" type="redirect-action">
                    <param name="actionName">userDetail</param>
                    <param name="namespace">/</param>
                    <param name="parse">true</param>
                    <param name="user.id">${user.id}</param>
                </result>
            </action>
            <action name="userDetail" method="detail" class="lab.action.UserAction">
                <result name="detailPage">userDetail.jsp</result>
            </action>

    ----------------------------------------------------

     

    這里,userCreate是創(chuàng)建用戶的Action,userDetail是查看用戶詳細(xì)信息的Action,都是由類lab.action.UserAction來(lái)提供工作。如果從一個(gè)action redirect到另外一個(gè)action,那么redirect的result的type為redirect-action。

    其中,參數(shù)actionName為要跳轉(zhuǎn)到的action的name,無(wú)需.action后綴,struts框架會(huì)根據(jù)你配置的屬性來(lái)確定后綴是什么。namespace為搜索action時(shí)使用的命名空間。parse是表示要對(duì)參數(shù)進(jìn)行解析。后面的幾個(gè)參數(shù)就是根據(jù)實(shí)際需要來(lái)定義參數(shù)名稱和參數(shù)的值,這里會(huì)由struts框架將這些參數(shù)附加到URL后面。例如在上面的例子中,user.id為參數(shù)名,${user.id}為參數(shù)值,該值通過解析userCreate對(duì)應(yīng)的類中的user屬性的id屬性來(lái)得到,和在jsp頁(yè)面使用方式相同,其實(shí)都是來(lái)自于Value Stack。

     

    如果是要redirect到一個(gè)jsp頁(yè)面,并且?guī)в袇?shù)(這種情況應(yīng)該很少),按照struts2的文檔描述:

    ----------------------------------------------------

    <result name="success" type="redirect">
      <param name="location">foo.jsp</param>
      <param name="parse">false</param>
    </result>
    <package name="passingRequestParameters" extends="struts-default" namespace="/passingRequestParameters">
       <-- Pass parameters (reportType, width and height) -->
       <!--
       The redirect-action url generated will be :
       /genReport/generateReport.jsp?reportType=pie&width=100&height=100
       -->
       <action name="gatherReportInfo" class="...">
          <result name="showReportResult" type="redirect">
             <param name="location">generateReport.jsp</param>
             <param name="namespace">/genReport</param>
             <param name="reportType">pie</param>
             <param name="width">100</param>
             <param name="height">100</param>
          </result>
       </action>
    </package>

    ----------------------------------------------------
    另外,對(duì)于比如查詢統(tǒng)計(jì)這樣的功能,用戶刷新頁(yè)面的幾率是非常大的,這種情況下,建議使用get方式來(lái)提交form,以避免IE那個(gè)總是跳出來(lái)的對(duì)話框。

    相比于forward方式的跳轉(zhuǎn)而言,redirect的跳轉(zhuǎn)會(huì)在瀏覽器地址欄暴露更多的信息,可能會(huì)被使用者惡意篡改,所以在使用redirect的時(shí)候,要對(duì)數(shù)據(jù)在后臺(tái)進(jìn)行更加嚴(yán)格和全面的校驗(yàn)。

     

    以下是實(shí)驗(yàn)代碼的鏈接,在壓縮包中,去掉了struts相關(guān)的lib包,如果要在本地運(yùn)行這個(gè)實(shí)驗(yàn)應(yīng)用,只需把對(duì)應(yīng)struts版本的struts<version>-blanck-<version>.war里面的lib目錄下的jar文件取出則可。

    實(shí)驗(yàn)在Windows XP SP2, resin-3.2.1, Sun JDK 1.5, struts 1.2.9/struts 2.0.11.1下運(yùn)行通過。如果是使用struts1,需要把應(yīng)用編譯成Java 1.4格式的(如果是使用Eclipse,只需修改應(yīng)用的compile level即可)。

    實(shí)驗(yàn)應(yīng)用下載鏈接

    Technorati 標(biāo)簽: ,,
    posted on 2009-01-12 10:41 YODA 閱讀(3829) 評(píng)論(3)  編輯  收藏

    FeedBack:
    # re: 使用redirect避免重復(fù)提交 2009-01-12 11:18 老土
    知道重復(fù)提交是什么意思嗎?是在提交的時(shí)候,提交了不止一次,通常都是點(diǎn)擊按鈕后,在還沒有處理完成的時(shí)候,繼續(xù)點(diǎn),就是發(fā)送多個(gè)請(qǐng)求。
    你說的只是跳轉(zhuǎn),跟重復(fù)提交扯不到一邊。  回復(fù)  更多評(píng)論
      
    # re: 使用redirect避免重復(fù)提交[未登錄] 2009-01-12 11:21 YODA
    對(duì),樓上說的有道理。是我粗心,落了這一部分了。
    重復(fù)點(diǎn)擊也是一個(gè)問題,這個(gè)可以在點(diǎn)擊提交按鈕之后臨時(shí)禁用這個(gè)按鈕來(lái)規(guī)避。
    但是如果是forward方式跳轉(zhuǎn),在提交后刷新頁(yè)面也會(huì)導(dǎo)致重復(fù)提交的問題。  回復(fù)  更多評(píng)論
      
    # re: 使用redirect避免重復(fù)提交 2009-01-12 13:51 老土
    提交后,如果操作成功,沒有人會(huì)用forward來(lái)做跳轉(zhuǎn),用forward是操作不成功返回輸入頁(yè)面的時(shí)候。
    Token是防止重復(fù)提交,但是跳轉(zhuǎn)不是。  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 含羞草国产亚洲精品岁国产精品| 自怕偷自怕亚洲精品| 亚洲AV香蕉一区区二区三区| 在线不卡免费视频| 亚洲午夜无码久久| 国产伦一区二区三区免费| 福利片免费一区二区三区| 亚洲国产高清在线一区二区三区 | 2022免费国产精品福利在线| 国产精品亚洲а∨无码播放| A级毛片成人网站免费看| 亚洲欧洲日产国码无码久久99| 日韩电影免费观看| 午夜亚洲www湿好大| 久久永久免费人妻精品下载 | 久久精品夜色国产亚洲av| 免费国产午夜高清在线视频 | 日韩精品电影一区亚洲| 国产V片在线播放免费无码| 国产亚洲精品免费视频播放| 久久99热精品免费观看牛牛| 亚洲人妖女同在线播放| 国产午夜免费秋霞影院| 拍拍拍无挡视频免费观看1000| 亚洲欧洲尹人香蕉综合| 日韩精品免费电影| 中文字幕乱理片免费完整的| 亚洲视频免费观看| 国产伦精品一区二区三区免费下载| 三级黄色片免费看| 久久精品国产亚洲αv忘忧草 | 亚洲制服中文字幕第一区| 色多多www视频在线观看免费| 在线亚洲97se亚洲综合在线| 亚洲精品视频在线免费| 成人精品国产亚洲欧洲| 亚洲国产成人久久综合一| 好男人看视频免费2019中文| 福利免费在线观看| 亚洲天堂免费在线| 亚洲精品无码专区久久久|