2012-02-06 88 views
5

在JSF2中,有没有办法处理多个表单提交(用户多次点击提交按钮)?现在我们得到服务器中的以下例外避免多个表单提交

java.lang.IllegalStateException: Response already committed 
java.lang.IllegalStateException: Response already committed 
javax.faces.FacesException: socket write error: Connection aborted by peer 
+0

java.net.SocketException异常:套接字写入错误:通过对 – user684434 2012-02-06 17:01:07

回答

3

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

例如如下所示,包含JSF Ajax脚本之后包含的内容,例如,在<script><h:outputScript>内部提及<h:head>中的.js文件。

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来执行提交,然后的方式之一是在onclick一个setTimeout()功能,禁用该按钮后点击几毫秒扔是

基本上,

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

setTimeout()是强制性的,因为当你立即禁用它,那么name=value对按钮将不会被这将导致JSF是无法识别的请求一起发送要执行action。你当然可以重构它到一些DOM准备或窗口onload函数,它适用于所有提交按钮(jQuery将在这方面非常有用)。

+0

中止连接你一些指点或使得它作为DOM就绪或窗口的onload功能链接。 – user684434 2012-02-06 17:17:23

+0

对不起,在DOM ready或window onload期间不需要执行它。只要将它修改为'

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