Eso depende de cómo envíe el formulario. Si está usando <f:ajax>
o cualquier otra etiqueta basada en Ajax para realizar el envío por Ajax, entonces su mejor opción es usar jsf.ajax.addOnEvent()
para agregar una función que deshabilita el botón cuando la solicitud Ajax está a punto de ser enviada y la vuelve a habilitar después de la respuesta de Ajax es recuperada.
E.g. de la siguiente manera, que incluirá después de que se incluyan los scripts Ajax de JSF, p. dentro de un <script>
o <h:outputScript>
refiriendo un archivo .js
en <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;
}
});
Si eres no usando Ajax para realizar el enviar, a continuación, una de las maneras de hacerlo es tirar una función setTimeout()
en onclick
que desactiva el botón unos pocos ms después del clic.
Básicamente,
<h:commandButton
id="foo"
value="submit"
action="#{bean.submit}"
onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);"
/>
El setTimeout()
es obligatorio, ya que cuando se desactiva inmediatamente, entonces el par de name=value
el botón no se enviará junto con la solicitud que causaría JSF sea incapaz de identificar el action
para ser ejecutado. Por supuesto, puede refactorizarlo a alguna función lista para DOM o carga de ventana que aplica esto para todos los botones de envío (jQuery sería tremendamente útil en esto).
java.net.SocketException: error de escritura de socket: Conexión terminada anormalmente por igual – user684434