====== Pasar Mensajes JSF entre Redireciones ====== Un problema general que tiene JSF, es el pasar mensajes entre redireciones, es decir, cuando se utiliza el patrón de navegacion //POST-REDIRECT-GET//. Este patrón suele ocurrir cuando utilizamos en las reglas de navegacón la etiqueta //// tanto en JSF como en JBoss Seam, o devolvemos directamente un //view ID// en un metodo //action//. También cuando se utiliza el parámetro //faces-redirect// con valor //true//. Para solventar este problema, el Framework JBoss Seam, creo el componente [[https://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/faces/FacesMessages.html|FacesMessages]] de ámbito conversación, que permite pasar los mensajes entre redirecciones si estamos en la misma conversación. El problema se presenta cuando utilizamos los métodos //clickAndKillLastConversation()// del componente [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-seam-components/|MenuManagerBean]] (Estos métodos destruyen la conversación anterior y crean una nueva conversación temporal o de largo recorrido, según la confguración indicada) y además utilizamos la etiqueta //// en el fichero //.page.xml// o en la entrada de la página del fichero //pages.xml// tanto en la página actual como en la nueva. En este caso podemos seguir utilizando el componente [[https://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/faces/FacesMessages.html|FacesMessages]] (en los beans de respaldo) o [[https://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/international/StatusMessages.html|StatusMessages]] (en los servicios, PAOs o DAOs), después de la llamada al método //clickAndKillLastConversation()//. Sino tenemos esa posibilidad, podemos utilizar el componente [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-seam-components/es/um/atica/seam/faces/MultiPageFacesMessages.html|MultiPageFacesMessages]] de ámbito sesión. Tiene los mismos métodos que el componente //FacesMessages//, pero no permite añadir mensajes destinados a controles JSF, solo permite mensajes globales. Ejemplo: package es.um.atica.prueba.backbeans; import org.jboss.seam.annotations.Name; import org.jboss.seam.core.Conversation; import org.jboss.seam.faces.FacesMessages; import es.um.atica.seam.components.MenuManagerBean; import es.um.atica.seam.faces.MultiPageFacesMessages; @Name("estadosBean") public class EstadosBean { public String navega(String viewId) { MultiPageFacesMessages.instance().add( "MultiPageFacesMessages antes de kill [#0] - [#1].", viewId, Conversation.instance().getId() ); FacesMessages.instance().add( "FacesMessages antes de kill [#0] - [#1].", viewId, Conversation.instance().getId() ); MenuManagerBean.instance().clickAndKillLastConversation(); FacesMessages.instance().add( "FacesMessages despues de kill [#0] - [#1].", viewId, Conversation.instance().getId() ); MultiPageFacesMessages.instance().add( "MultiPageFacesMessages despues de [#0] - [#1].", viewId, Conversation.instance().getId() ); return viewId; } } El resultado sería: {{ :fdw2.0:fundeweb2.0:gt:mensajes-redirect.jpg | Mensajes Redirect}} Solo en el caso anterior, utilizaremos el nuevo componente. ---- --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 08/11/2019 13:48//