<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

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

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

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

     

    Struts1

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

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

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

    return redirect;

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

     

    Struts2:

    在Struts2中,情況有所不同。但是Struts2里面的方式,更加的合理,因為不需要在Action代碼中編碼來完成,完全是通過配置完成的。在配置文件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是查看用戶詳細信息的Action,都是由類lab.action.UserAction來提供工作。如果從一個action redirect到另外一個action,那么redirect的result的type為redirect-action。

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

     

    如果是要redirect到一個jsp頁面,并且?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>

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

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

     

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

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

    實驗應(yīng)用下載鏈接

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲婷婷第一狠人综合精品| 日本精品久久久久久久久免费 | 亚洲国产日韩a在线播放| 免费一级毛片免费播放| 免费国产成人午夜在线观看| 亚洲日韩国产精品乱-久| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 伊人久久亚洲综合影院首页| 免费一级大黄特色大片| 久草免费手机视频| 久久亚洲中文无码咪咪爱| 亚洲国产精品久久久天堂| 热99re久久精品精品免费| 免费在线黄色电影| 亚洲国产成人精品无码区二本| 亚洲精品无码精品mV在线观看| 成年私人影院免费视频网站| 色www永久免费网站| 亚洲精品国产摄像头| 亚洲最新永久在线观看| 亚洲av成人一区二区三区在线观看 | 亚洲国产高清在线一区二区三区| 99久久免费中文字幕精品| 精品特级一级毛片免费观看| 亚洲视频在线免费看| 亚洲日韩在线中文字幕第一页| 精品久久久久成人码免费动漫| 美女无遮挡拍拍拍免费视频 | 亚洲欧美熟妇综合久久久久| 亚洲AV美女一区二区三区| 午夜亚洲av永久无码精品| 希望影院高清免费观看视频 | 亚洲国产激情一区二区三区| 毛片免费观看网站| 91成人在线免费视频| 中国好声音第二季免费播放| 亚洲精品GV天堂无码男同| 亚洲人成毛片线播放| 亚洲福利视频一区| 亚洲开心婷婷中文字幕| 亚洲国产精品无码久久青草|