2012-02-06 15 views
5

En JSF2, ¿hay alguna forma de manejar el envío de formularios múltiples (el usuario hace clic en el botón de envío varias veces)? Ahora estamos obteniendo la siguiente excepción en el servidorEvitar el envío de formularios múltiples

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: error de escritura de socket: Conexión terminada anormalmente por igual – user684434

Respuesta

3

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

+0

¿Le algunos punteros o enlaces para que sea lo más DOM Listo o Función de ventana onload. – user684434

+0

Lo sentimos, no necesita ser ejecutado durante el DOM listo o la carga de la ventana. Simplemente póngalo sin modificar en un '

0

Puede agregar un botón desactivado en la página que no hace nada y mostrarlo cuando se hace clic en el botón Enviar.

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