Java學(xué)習(xí)

          java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經(jīng)搬家了,新的地址是 http://www.javaly.cn 如果有對文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會(huì)盡力幫助解決。一起進(jìn)步

           

          JSF中如何防止頁面刷新重復(fù)提交

          在WEB開發(fā)中都會(huì)碰見這樣的情況,就是用戶在進(jìn)行了一項(xiàng)操作后按F5刷新頁面會(huì)重復(fù)提交頁面的問題。

          先了解下瀏覽器按F5會(huì)發(fā)生什么事,在按下F5后瀏覽器并不是簡單的刷新頁面,而是模擬上一次的請求一模一樣的再向服務(wù)器請求一次,加入上一次的請求 是向服務(wù)器請求保存數(shù)據(jù),那按F5后就會(huì)再一次請求保存數(shù)據(jù),這樣就等于重復(fù)提交了一次保存數(shù)據(jù),如果我們系統(tǒng)中不做判斷的話,很容易在用戶不小心按F5 后再一次把數(shù)據(jù)保存進(jìn)數(shù)據(jù)庫了。

          方案:

          因?yàn)榘碏5是完全模擬上次的請求再請求一次,可以說發(fā)送的數(shù)據(jù)和上次請求的是一樣的,就想到可以在客戶端和服務(wù)器端各保存一個(gè)標(biāo)識(shí)狀態(tài),然后在請求中比較2個(gè)表示狀態(tài)就好了。

          解決方法做成1個(gè)組件,這樣就可以在所有需要使用的頁面上使用該組件了,下面就直接看組件的代碼吧

          package com.byd.jsfcomponents.Refresh;

          import java.io.IOException;

          import jaax.faces.component.UIComponentBase;

          import javax.faces.context.ExternalContext;

          import javax.faces.context.FacesContext;

          import javax.faces.context.ResponseWriter;

          import javax.servlet.http.HttpSession;

          /** *//**

          * JSF中防刷新的控件 同時(shí)在客戶端和服務(wù)端保存一樣的值,

          * 每次請求都改變2個(gè)的值(和以前的值相反),如果是刷新,取到的客戶端的值將服務(wù)端的值不一樣。

          */

          public class HtmlRefresh extends UIComponentBase...{

          private boolean m_refreshState;

          private boolean m_isRefresh;

          /** *//**

          * 當(dāng)前請求是否是刷新

          * @return true 是;false 不是;

          */

          public boolean IsRefresh()...{

          return m_isRefresh;

          }

          /** *//**

          * 返回對應(yīng)的渲染器,這里沒有單獨(dú)的渲染器,所以返回null

          */

          public String getFamily()...{

          return null;

          }

          //

          /** *//**

          * 保存視圖

          */

          public Object saveState(FacesContext context)...{

          Object values[] = new Object[2];

          values[0] = super.saveState(context); // 系統(tǒng)自己的State

          // 保存客戶端的值

          values[1] = !m_refreshState;

          // 服務(wù)器的值保存到session中

          ExternalContext exContext = FacesContext.getCurrentInstance().getExternalContext();

          HttpSession session = (HttpSession)exContext.getSession(true);

          session.setAttribute("ServerRefresh",m_refreshState);

          return values;

          }

          /** *//**

          * 恢復(fù)視圖

          */

          public void restoreState(FacesContext context, Object state)...{

          Object values[] = (Object[]) state;

          super.restoreState(context, values[0]);

          this.m_refreshState = (Boolean)values[1];

          // 取服務(wù)器端值

          ExternalContext exContext = FacesContext.getCurrentInstance().getExternalContext();

          HttpSession session = (HttpSession)exContext.getSession(true);

          Boolean _bRefresh = false;

          if(session.getAttribute("ServerRefresh") != null)...{

          _bRefresh = Boolean.valueOf(session.getAttribute("ServerRefresh").toString());

          }

          m_isRefresh = m_refreshState == _bRefresh;

          }

          //

          }

          在頁面中使用如下:

          JAVABEAN代碼:

          private HtmlRefresh htmlRefresh1 = new HtmlRefresh();

          public HtmlRefresh getHtmlRefresh1() {

          return htmlRefresh1;

          }

          public void setHtmlRefresh1(HtmlRefresh htmlRefresh1) {

          this.htmlRefresh1 = htmlRefresh1;

          }

          public String button1_action() {

          // 先判斷是否刷新

          if(htmlRefresh1.IsRefresh()){

          this.label1.setText("請別刷新提交");

          }else{

          this.label1.setText("正常提交");

          }

          return null;

          }

          posted on 2009-07-23 14:57 找個(gè)美女做老婆 閱讀(1271) 評論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 墨玉县| 新平| 莲花县| 阿合奇县| 双江| 临武县| 奉贤区| 濮阳县| 沧源| 中超| 乌海市| 三明市| 新密市| 临潭县| 阳原县| 米泉市| 灵石县| 彭水| 札达县| 称多县| 蕲春县| 苍南县| 本溪市| 临夏市| 池州市| 宁海县| 临洮县| 余姚市| 宁南县| 石景山区| 扎囊县| 江源县| 鹤山市| 屏东市| 江门市| 龙州县| 龙里县| 股票| 竹北市| 灵丘县| 安吉县|