Dipende da come si invia il modulo. Se stai utilizzando <f:ajax>
o qualsiasi altro tag Ajax per eseguire l'invio di Ajax, la soluzione migliore è utilizzare jsf.ajax.addOnEvent()
per aggiungere una funzione che disabilita il pulsante quando la richiesta Ajax sta per essere inviata e riattivata dopo la risposta Ajax viene recuperata.
E.g. come segue, che includi dopo che gli script Ajax di JSF sono inclusi, ad es. all'interno di un <script>
o <h:outputScript>
che fa riferimento a un file .js
in <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;
}
});
Se siete non con Ajax per eseguire l'invio, poi uno dei modi è quello di gettare in una funzione setTimeout()
in onclick
che disabilita il pulsante di pochi ms dopo scatto.
Fondamentalmente,
<h:commandButton
id="foo"
value="submit"
action="#{bean.submit}"
onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);"
/>
Il setTimeout()
è obbligatoria, perché quando si disattiva immediatamente, allora il name=value
coppia di tasto non verrà inviato insieme alla richiesta che causerebbe JSF di essere in grado di identificare action
da eseguire. Ovviamente puoi refactarlo su qualche funzione DOM ready o window onload che lo applica a tutti i pulsanti di invio (jQuery sarebbe estremamente utile in questo).
java.net.SocketException: errore di scrittura socket: connessione interrotta dal peer – user684434