避免多次提交表单

时间:2012-02-06 16:52:08

标签: jsf-2

在JSF2中,有没有办法处理多表单提交(用户多次点击提交按钮)?现在我们在服务器

中获得以下异常
java.lang.IllegalStateException: Response already committed
java.lang.IllegalStateException: Response already committed
javax.faces.FacesException: socket write error: Connection aborted by peer

2 个答案:

答案 0 :(得分:4)

这取决于您提交表单的方式。如果您使用<f:ajax>或任何其他基于Ajax的标记来执行Ajax提交,那么最好的办法是使用jsf.ajax.addOnEvent()添加一个函数,该函数在Ajax请求即将发布时禁用该按钮在检索到Ajax响应后发送并重新启用它。

E.g。如下所示,包含在包含JSF Ajax脚本之后,例如:在<script><h:outputScript>内引用.js中的<h:head>文件。

jsf.ajax.addOnEvent(function(data) {
    if (data.source.type != "submit") {
        return; // Ignore anything else than input type="submit".
    }

    switch (data.status) {
        case "begin":
            data.source.disabled = true; // Disable input type="submit".
            break;
        case "complete":
            data.source.disabled = false; // Re-enable input type="submit".
            break;
    }    
});

如果你使用Ajax来执行提交,那么其中一种方法是在setTimeout()中输入一个onclick函数来禁用一些按钮点击后的ms。

基本上,

<h:commandButton 
    id="foo"
    value="submit"
    action="#{bean.submit}"
    onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);"
/>

setTimeout()是强制性的,因为当您立即禁用它时,该按钮的name=value对将不会与请求一起发送,这将导致JSF无法识别{ {1}}要执行。你当然可以将它重构为一些DOM ready或window onload函数,它将这个应用于所有提交按钮(jQuery对此非常有用)。

答案 1 :(得分:0)

您可以在页面上添加禁用按钮,该按钮不执行任何操作,并在单击提交按钮时显示该按钮。

<div id="disabled" style="display:none;">
     <span class="disabled-button"/>
</div>
<div id="enabled" style="display:block;">
     <span class="enabled-button">
          <h:commandLink id="submit"/>
     </span>
</div>


$('#submit').live("click", function() {
$('#enabled').hide();
$('#disabled').show();
});