Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 338|回复: 0

[jsf学习]JSF中防止页面刷新重复提交

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-9 23:49:45 | 显示全部楼层 |阅读模式
    在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;
         }
             
         // <editor-fold defaultstate="collapsed" desc="保存恢复视图">
        /** *//**
          *  保存视图
          */
        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;
         }
         // </editor-fold>
    }
      

      


    在页面中使用如下:

    <%@ taglib uri="http://www.byd.com.cn/component" prefix="byd" %>
    <byd:HtmlRefresh id="HtmlRefresh1" binding="#{Page1.htmlRefresh1}" />

    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;
         }

    开发环境:NetBeans5.5.1 + netbeans-visualweb-5_5-windows-zh_CN.exe




      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/9/234944468.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 18:10 , Processed in 0.319718 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表