Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

Gracias a JBoss Seam el control de la navegación entre páginas se hace más rico y flexible. No solo tenemos el control de navegación clásico de JSF basado en el fichero faces-config.xml o en redirecciones directas por nombre de ficheros y en los valores o outcomes de los actions de los beans de respaldo. Ahora ya no es obligarotio obligatorio devolver un String en un action, se puede devolver una ruta de navegación en un action o especificarlo en un componente seam: <s:button> o <s:link>.

Para el control de las páginas y la navegación tendremos el fichero pages.xml global, y además, podemos especificar ficheros propios para cada páginas, llamándose el fichero nombrePagina.page.xml

El fichero pages.xml

Este fichero nos permite definir reglas de navegación y otras propiedades de las páginas. Está compuesto por una serie de elementos page, que permiten seleccionar mediante la propiedad view-id una página concreta o un patrón de páginas.

Por convenio la manera de trabajar es la siguiente:

  • Si modelamos comportamiento global de toda la aplicación (restricción de acceso por rol, mensajes de error, etc), lo haremos en el pages.xml
  • Si modelamos comportamiento individual de una pantalla concreta, lo haremos en el fichero nombrePagina.page.xml

El fichero pages.xml

Este fichero nos permite definir reglas de navegación y otras propiedades de las páginas. Está compuesto por una serie de elementos page, que permiten seleccionar mediante la propiedad view-id una página concreta o un patrón de páginas.

En este fichero podemos también gestionar las excepciones que lance En este fichero podemos también gestionar las excepciones que lance nuestra aplicación para redirigir a pantallas de error concretas.

...

  • no-conversation-view-id: Permite especificar a qué página se navega cuando no se tiene conversación.

  • login-view-id: Permite especificar la página de login de la aplicación.

  • https-port : Permite definir los puertos a utilizar cuando utilicemos SSL.

  • http-port: Permite definir los puertos a utilizar cuando no utilicemos SSL.

(advertencia)  Importante: Cuando ponemos una barra “/” al principio de cualquier ruta que queramos especificar, indica que esa ruta es absoluta al módulo Web. Cuando quiera especificar una ruta relativa, no he de añadir ese carácter al principio de la ruta,

...

  • view-id: Permite especificar la página de la aplicación a la que queremos navegar.

  • url: Permite especificar una URL cualquiera.

  • include-page-params: Permite especificar si se incluyen los parámetros de la página a la nueva página destino.

...

Ejemplos de uso

Para la página editDocument.xhtml hemos definido una regla que redirija a viewDocument.xhtml en el caso de que la acción documentEditor.update del bean de respaldo devuelva success:

...

Bloque de código
languagexml
themeEclipse
<exception class="org.jboss.seam.security.NotLoggedInException">
    <redirect view-id="/login.xhtml">
        <message severity="warn">#{messages['org.jboss.seam.NotLoggedIn']}</message>
    </redirect>
</exception>

Ficheros page.xml individuales para cada página

Esta es la práctica recomendada para la mayoría de nuestras páginas.

El contenido de estos ficheros específicos, se puede incluir dentro del fichero global sin ningún problema, pero se suelen utilizar para encontrar la configuración de las página más rápidamente y para tener un fichero pages.xml más sencillo y comprensible.

Para crear un fichero especifico de control de navegación tenemos que cumplir tres sencillas reglas:

  1. El nombre del fichero tiene que coincidir con con el de la página que configura, es decir, si tenemos una pagina llamada pagina miPagina.xhtml, su fichero page.xml específico se llamara pagina miPagina.page.xml. Patrón: nombre_pagina.page.xhtml

  2. El fichero tiene que estar en el mismo directorio que la página XHTML.

  3. Debe contener como elemento XML raíz la etiqueta <page>, por esta razón, se puede copiar su contenido en el archivo pages.xml global.Se

Adicionalmente, se puede especificar un fichero de recursos propio mediante la propiedad bundle.

A continuación vemos un ejemplo de fichero específico. La única diferencia con un elemento <page> del fichero global son los espacios de nombres, la definición del esquema, ya que se tratar de un fichero XML y que no se necesita especificar la propiedad viewId, ya que esta implícita en el nombre del archivo.**

Bloque de código
languagexml
themeEclipse
<?xml version="1.0" encoding="ISO-8859-1"?>
<page xmlns="http://jboss.com/products/seam/pages"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.2.xsd"
      login-required="true">
 
	<!-- Parámetros que se pasarán al navegar -->	
   <param name="anuncioFrom"/>
   <param name="anuncioId" value="#{anuncioHome.anuncioId}"/>
 
</page>	<!-- Listado de reglas de navegación -->
	<navigation>
       <rule if-outcome="_miNavegacion">
           <redirect view-id="/paginas/navegacion.xhtml"/>
       </rule>
   </navigation>
 
</page>


Una vez tengamos nuestros ficheros *.page.xml configurados, para navegar lo único que deberemos hacer es que el backend desencadene dicho proceso. Para ello, aunque hay varias formas de navegar, nosotros usaremos mayoritariamente la que se hace mediante un método Java en el bean de respaldo que devuelva un String que esté mapeado en el fichero *.page.xml

Por ejemplo, en el fichero anterior tenemos la regla  <rule if-outcome="_miNavegacion">, esto significa que si un método Java del bean de respaldo de esta pantalla devuelve un String que se llame "_miNavegacion", se lanzará esta regla y navegará a la ruta indicada.

Bloque de código
public String navega(){
	return "_miNavegacion";
}


Con el fichero *.page.xml descrito anteriormente y este método Java, conseguiríamos navegar.

(advertencia)  Importante: Si nos fijamos, el String devuelto empieza por guión bajo "_". Esto es porque si el String que devuelve el método, coincide con el nombre de algún fichero xhtml, se desencadenará una navegación, pero ésta no la hará JBoss Seam, sino JSF, por lo que se ignorará toda la configuración indicada en el fichero *.page.xml y podremos perder el contenido de lo almacenado en memoria u otra configuración cuando navegemos. El objetivo de empezar los Strings que desencadenan navegaciones por "_" es garantizar que ese String nunca coincidirá con un nombre de un fichero *.xhtml