【问题标题】:Double click submit of a form versus submit twice双击提交表单与提交两次
【发布时间】:2013-11-06 21:32:08
【问题描述】:

当我们比较双击提交按钮和单击两次提交按钮后触发的事件时,在逻辑流方面有什么区别?

我有一个 Struts 1 应用程序(设计得很糟糕),我无法理解双击时实际发生的情况。

JSP如下图,点击Add xItem会调用action类的doAdd()方法(此时doAdd方法中str为null)转发给xItemAdd.jsp

xItemAdd.jsp 包含一个带有几个复选框和一个加载按钮的主要表单。单击加载时调用 doAdd,其中选定复选框和列表框的值被获取/放入会话属性并再次转发到 xItemAdd.jsp

xItemAdd.jsp 包含在选中相应复选框时显示表单的脚本。所以现在如果选择了 1 和 3 个复选框并单击了加载,则会显示 Form1 和 Form3

   <% for(int i=0;i<selmsgs.size();size++)
       {Systeml.out.println("i :"+i +"size "+selmsgs.size());
...%>

这是一个动作类的sn-p

   Class MyAction

    {...
     public Object doAdd(.......)
       { System.out.println("Add method :");
       String[] str=request.getParameter("SelectionList");
        ArrayList<String>[] mylist=request.getParameter("CheckedValues").split(',');
         //Allowing duplicate values to be added in mylist
        if(str!=null&&str.equals("true")
          request.getSession.setAttribute("IsLoaded","false"); 
           
        if(str!=null)
        {
         request.getSession.setAttribute("ObjectList",mylist);
        request.getSession.setAttribute("IsLoaded","true"); 
        }
       return SUCCESS;   
       }
    }

按预期单击图 2 中的加载按钮,视图变为图 3,如果再次单击,则加载表单(用于选定的复选框)并保持如图 3 所示 但是如果双击加载按钮会出现奇怪的行为,每个选定的表单都会重复出现。所以图 3 就像 Form 1,Form3 和 Form1,Form3

doAdd 方法返回后,JSP 被调用两次,如图 3 所示的 jsp 中的打印行打印出类似的内容

i: 0 size :2

i:0 size  :1

i:1 size : 2

看起来好像两个线程正在执行 JSP 脚本

您能否解释一下在此处双击加载按钮与同时单击两次加载按钮之间的行为差​​异,因为两者都会提交两次表单?

双击加载按钮后实际发生了什么?

【问题讨论】:

    标签: jsp jakarta-ee struts-1 double-submit-problem


    【解决方案1】:

    双击提交按钮是两次单击。第一个将被发送到服务器进行静默处理(因为浏览器不会收到响应,尽管服务器会发送它),第二个也将在服务器上处理,但浏览器会收到响应。

    按钮不是图标。双击对他们没有意义。用户应该知道按钮是单击的。如果您的应用程序的用户不知道这一点,您可能希望在处理提交之前使用 javascript 禁用单击按钮,以防止他们尝试双击。见https://stackoverflow.com/questions/5944254/preventing-double-click-of-submit-button

    【讨论】:

    • 如果第二次点击不够快,则对第一次点击的响应已经呈现,在这种情况下,双击会有所不同..但如果在双击的情况下发送了两个请求到服务器然后应该为每个点击/请求调用doAdd方法。可能是我遗漏了一些东西,需要再次检查。据我记得doAdd只被调用了一次,但是JSPS被调用了两次。还有如何浏览器是否知道是否解析响应?是否需要先收到第一个请求的响应?
    • 当您单击该按钮两次时,浏览器会简单地抛出对第一个请求的引用(因为每个窗口/选项卡只能执行一次),因此它会在服务器上进行处理,但浏览器不会等待它,它等待第二个。
    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多