Esto es por diseño. Solo se destruirá inmediatamente cuando una acción POST genere una navegación que no sea una devolución de datos a la misma vista (es decir, el método de acción no devolvió null
o void
, sino un String
completo, incluso cuando esté vacío).
El <h:link>
genera un enlace GET que no invoca ninguna acción POST. Como no es confiablemente posible notificar al lado del servidor mediante una solicitud HTTP (XML) cuando la vista está descargada, no se puede notificar a JSF que destruya el bean con ámbito de vista asociado con la vista. En tal caso, el bean con ámbito de vista solo se destruirá cuando expire la sesión o cuando se hayan superado las vistas lógicas máximas en sesión (el valor predeterminado es 15) y la vista asociada es la primera en orden.
Si realmente quiere estropear la vista con ámbito de frijol por una acción navigaiton, entonces su mejor apuesta es hacer una petición POST por <h:commandLink>
lugar y una redirección devolviendo el resultado de navegación con ?faces-redirect=true
parámetro. Pero después de todo esto no es amigable con los motores de búsqueda, ya que los bots no indexarán los enlaces POST.
No me gustaría que la vista siga estando en la sesión. Si tiene la intención de hacer algo de limpieza o registro, buscaría formas alternativas, dependiendo del requisito funcional concreto.
En teoría sería posible por HTML DOM onbeforeunload
evento, pero este es un evento no estándar y el comportamiento del navegador es indeterminado en cuanto a lo que sucede cuando se envía una petición AJAX durante ese evento. A veces llegará, pero a veces tampoco. Actualización: en práctica, esto se ha implementado en OmniFaces @ViewScoped
desde OmniFaces 2.2 con la ayuda de synchronous XHR y está funcionando bastante bien en los principales navegadores. Desde la versión 2.3, incluso destruye físicamente el estado de la vista lateral del servidor JSF asociado.
Una pequeña corrección está en orden. Incluso si realiza un redireccionamiento, si lo redirecciona a la misma vista desde donde se originó la solicitud POST, JSF no destruirá el bean con ámbito de vista. Para que se destruya una vista del bean con ámbito, deberá renderizar una vista diferente por completo después de procesar la solicitud POST. – RajV