2011-10-21 13 views
8

Estoy trabajando en un proyecto que se desarrolla en JSF. Cada vez que refrescamos la página JSF, el último evento de acción se vuelve a ejecutar. Por ejemplo, cuando envío el formulario para eliminar una entrada de una lista y actualizar la página de resultados, también se elimina otra entrada de la lista en la misma posición. ¿Cómo es esto causado y cómo puedo resolverlo?Cómo evitar la re-ejecución de la última acción de envío de formulario cuando la página se actualiza?

que he probado en faces-config.xml, pero eso no resuelve mi problema,

para conseguir más clara sobre problema que estoy enfrentando es que soy commandLink para eliminar un recurso de tabla de datos, estoy usando ActionListener atributo que llama a un método en mi backingbean, entonces el problema es cuando alguna vez estoy refrescando el evento de acción de página que se produce y se ejecuta el método que elimina otro recurso de la tabla. Gracias de antemano

Respuesta

18

Los síntomas indican que la página fue solicitada por una solicitud POST y que está ignorando la advertencia del navegador web de que los datos se reenviarán al actualizar la solicitud. Actualizar una solicitud POST dará como resultado que se vuelva a ejecutar. Este no es un problema específico de JSF.

La solución común a eso es enviar un redireccionamiento a una solicitud GET después de ejecutar la solicitud POST. De esta forma, el cliente terminará teniendo la solicitud GET en la vista del navegador. Al actualizar esto, solo volverá a ejecutar la solicitud GET que no (no debería) modificar nada (a menos que esté haciendo esto en el constructor de un bean con ámbito de solicitud asociado a la vista). Esto también se conoce como el patrón POST-Redirect-GET.

Con JSF 2.0, puede lograrlo simplemente agregando el parámetro faces-redirect=true al resultado de la acción del bean.

public String submit() { 
    // ... 

    return "viewid?faces-redirect=true"; 
} 

Si usted todavía está utilizando pasado de moda <navigation-case> s en faces-config.xml, a continuación, el mismo efecto se puede lograr mediante la adición de <redirect/> al caso. La única desventaja es que los beans de ámbito solicitado se guardan de esta forma (una redirección básicamente instruye al navegador web para crear una nueva solicitud) y por lo tanto no puede pasar datos en el alcance de la solicitud para volver a mostrarla en la página redirigida. Por ejemplo, mostrar un mensaje de éxito. En JSF 2.0 podría utilizar el alcance de flash para esto o simplemente dejar que el POST se realice por <f:ajax> enviar en lugar de un envío normal.

+0

Cada vez que veo una respuesta como esta, siento que hay una sección grande del "manual" que debería haber leído pero no lo hice. @BalusC ¿tiene un enlace a todas las reglas que se aplican al valor de retorno del método de ** acción **? Esta es la primera vez que escucho el parámetro ** faces-redirect **. ¿Qué otros parámetros son posibles allí? Sospecho que hay algo que habría sido útil que yo no sé. – AlanObject

+4

@ Alan: Este en particular (patrón de PRG) es el conocimiento general de desarrollo web y la comprensión de cómo funciona HTTP y navegadores web. En cuanto a los parámetros de acción especiales admitidos, el otro es 'includeViewParams = true'. Esto incluye todos los '' declarados de la vista actual como parámetros de solicitud del objetivo de resultado. Lo aprendí leyendo blogs/documentación/recursos. También se menciona en el tutorial de Java EE 6. También se debe mencionar en un libro JSF 2.0 poco decente, como [JSF 2.0: The Complete Reference] (http://jsfcompref.com/) y [Core JSF] (http://horstmann.com/corejsf/). – BalusC

+0

@BalusC Tengo el mismo problema, solo tengo una tabla de datos donde puedo hacer CRUD en las filas. Cuando actualizo la página, la última acción se vuelve a enviar nuevamente. ¿Cómo puedo resolverlo? ¿No tengo un botón de envío? – giorgimode

Cuestiones relacionadas