2012-02-06 13 views
5

In JSF2, esiste un modo per gestire l'invio di più moduli (l'utente fa clic sul pulsante di invio più volte)? Ora stiamo ottenendo la seguente eccezione nel serverEvita l'invio di più moduli

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: errore di scrittura socket: connessione interrotta dal peer – user684434

risposta

3

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).

+0

Ti alcune indicazioni o collegamenti per rendere il piu DOM pronto o Funzione finestra onload. – user684434

+0

Spiacente, non è necessario che venga eseguito durante il DOM ready o l'onload della finestra. Basta metterlo immodificato in un '

0

È possibile aggiungere un pulsante disabilitato sulla pagina che non fa nulla e mostrarlo quando si fa clic sul pulsante di invio.

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