RSS
热门关键字:  java  Ajax  JSP  JSF  Struts
当前位置 : 首页>JSF>列表

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

来源: 作者: 时间:2007-09-28 点击:

 

在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]);

共2页: 上一页 1 [2] 下一页
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册