在JSF2中,有没有办法处理多表单提交(用户多次点击提交按钮)?现在我们在服务器
中获得以下异常java.lang.IllegalStateException: Response already committed
java.lang.IllegalStateException: Response already committed
javax.faces.FacesException: socket write error: Connection aborted by peer
答案 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();
});