Java学习

java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已经搬家了,新的地址是 http://www.javaly.cn 如果有对文章有任何疑问或者有任何不懂的地方,欢迎到www.javaly.cn (Java乐园)指出,我会尽力帮助解决。一起进步

 

JSF中如何防止页面刷新重复提交

在WEB开发中都会碰见这样的情况,就是用户在进行了一项操作后按F5刷新页面会重复提交页面的问题。

先了解下浏览器按F5会发生什么事,在按下F5后浏览器并不是简单的刷新页面,而是模拟上一次的请求一模一样的再向服务器请求一次,加入上一次的请求 是向服务器请求保存数据,那按F5后就会再一次请求保存数据,这样就等于重复提交了一次保存数据,如果我们系统中不做判断的话,很容易在用户不小心按F5 后再一次把数据保存进数据库了。

方案:

因为按F5是完全模拟上次的请求再请求一次,可以说发送的数据和上次请求的是一样的,就想到可以在客户端和服务器端各保存一个标识状态,然后在请求中比较2个表示状态就好了。

解决方法做成1个组件,这样就可以在所有需要使用的页面上使用该组件了,下面就直接看组件的代码吧

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中防刷新的控件 同时在客户端和服务端保存一样的值,

* 每次请求都改变2个的值(和以前的值相反),如果是刷新,取到的客户端的值将服务端的值不一样。

*/

public class HtmlRefresh extends UIComponentBase...{

private boolean m_refreshState;

private boolean m_isRefresh;

/** *//**

* 当前请求是否是刷新

* @return true 是;false 不是;

*/

public boolean IsRefresh()...{

return m_isRefresh;

}

/** *//**

* 返回对应的渲染器,这里没有单独的渲染器,所以返回null

*/

public String getFamily()...{

return null;

}

//

/** *//**

* 保存视图

*/

public Object saveState(FacesContext context)...{

Object values[] = new Object[2];

values[0] = super.saveState(context); // 系统自己的State

// 保存客户端的值

values[1] = !m_refreshState;

// 服务器的值保存到session中

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

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

session.setAttribute("ServerRefresh",m_refreshState);

return values;

}

/** *//**

* 恢复视图

*/

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

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

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

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

// 取服务器端值

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 找个美女做老婆 阅读(1255) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

本blog已经搬到新家了, 新家:www.javaly.cn
 http://www.javaly.cn

常用链接

留言簿(6)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜