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

          常用鏈接

          留言簿

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

          以下是redirect在Struts1和Struts2中的實現:

           

          Struts1

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

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

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

          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是創建用戶的Action,userDetail是查看用戶詳細信息的Action,都是由類lab.action.UserAction來提供工作。如果從一個action redirect到另外一個action,那么redirect的result的type為redirect-action。

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

           

          如果是要redirect到一個jsp頁面,并且帶有參數(這種情況應該很少),按照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>

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

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

           

          以下是實驗代碼的鏈接,在壓縮包中,去掉了struts相關的lib包,如果要在本地運行這個實驗應用,只需把對應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,需要把應用編譯成Java 1.4格式的(如果是使用Eclipse,只需修改應用的compile level即可)。

          實驗應用下載鏈接

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

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

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


          網站導航:
           
          主站蜘蛛池模板: 即墨市| 滨州市| 来凤县| 广东省| 永宁县| 贡嘎县| 巴塘县| 娄烦县| 漳浦县| 大悟县| 会泽县| 连云港市| 民乐县| 游戏| 崇信县| 运城市| 阿拉善盟| 攀枝花市| 宁南县| 济宁市| 丽水市| 大化| 五指山市| 青州市| 内丘县| 简阳市| 嘉荫县| 健康| 濮阳市| 徐水县| 射洪县| 吕梁市| 菏泽市| 长宁县| 南和县| 溧阳市| 商丘市| 翁源县| 安宁市| 双流县| 上思县|