En este post vamos a ver los conceptos básicos sobre la navegación de una aplicación JSF.
La navegación más sencilla en JSF consiste en asociar un String al action de un botón o link:
En este ejemplo, pinchar en el botón o el link nos llevará a la página JSF asociada al String "login".
Si queremos poder elegir la página a mostrar en tiempo de ejecución, asociamos el action a un método que nos devuelva el String correspondiente:
En este ejemplo, al pinchar el botón se ejecuta el método login() del bean userBean, devolviendo éste un String que indicará la siguiente página a mostrar. Estos métodos tienen que ser públicos, sin argumentos y devolver un String.
Creando reglas de navegación en el fichero faces-config.xml:
En este ejemplo podemos ver que desde la página index.xhtml podemos ir a login.xhtml o a register.xhtml dependiendo si el action devuelve "login" o "register" respectivamente.
Omitir <from-view-id> o ponerlo como <from-view-id>*</from-view-id> es equivalente. El wildcard '*' se puede utilizar una sola vez y siempre al final (ej. <from-view-id>/pages/*</from-view-id>).
También podemos utilizar el mismo <from-outcome> y diferenciarlos según la acción que se realice:
En este ejemplo no se llama al método que está entre #{}, ya que esto se realiza dinámicamente desde una página, simplemente se asocia al action correspondiente.
¿Tenemos que utilizar obligatoriamente faces-config.xml?
No. Desde JSF 2.0 podemos utilizar navegación implícita, es decir, nos basta con poner en el action el nombre de nuestra página JSF sin la extensión correspondiente.
<h:commandButton action="login"/> nos llevaría a la página login.xhtml
¿Se puede navegar a una página dependiendo de si se cumple una condición?
Desde JSF 2.0 sí.
En el siguiente post veremos conceptos más avanzados sobre la navegación en JSF.
La navegación más sencilla en JSF consiste en asociar un String al action de un botón o link:
<h:commandButton label="Aceptar" action="login"/> <h:commandLink action="login"> <h:outputText value="Aceptar"/> </h:commandLink>
En este ejemplo, pinchar en el botón o el link nos llevará a la página JSF asociada al String "login".
Si queremos poder elegir la página a mostrar en tiempo de ejecución, asociamos el action a un método que nos devuelva el String correspondiente:
<h:commandButton label="Aceptar" action"#{userBean.login}"/>
En este ejemplo, al pinchar el botón se ejecuta el método login() del bean userBean, devolviendo éste un String que indicará la siguiente página a mostrar. Estos métodos tienen que ser públicos, sin argumentos y devolver un String.
public String login() { return "login"; }¿Cómo asociamos el String del action con una página JSF?
Creando reglas de navegación en el fichero faces-config.xml:
<navigation-rule> <from-view-id>/index.xhtml</from-view-id> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/login.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>register</from-outcome> <to-view-id>/register.xhtml</to-view-id> </navigation-case> </navigation-rule>
En este ejemplo podemos ver que desde la página index.xhtml podemos ir a login.xhtml o a register.xhtml dependiendo si el action devuelve "login" o "register" respectivamente.
Omitir <from-view-id> o ponerlo como <from-view-id>*</from-view-id> es equivalente. El wildcard '*' se puede utilizar una sola vez y siempre al final (ej. <from-view-id>/pages/*</from-view-id>).
También podemos utilizar el mismo <from-outcome> y diferenciarlos según la acción que se realice:
<navigation-case> <from-action>#{userBean.login}</from-action> <from-outcome>success</from-outcome> <to-view-id>/login.xhtml</to-view-id> </navigation-case> <navigation-case> <from-action>#{userBean.registerUser}</from-action> <from-outcome>success</from-outcome> <to-view-id>/register.xhtml</to-view-id> </navigation-case>
En este ejemplo no se llama al método que está entre #{}, ya que esto se realiza dinámicamente desde una página, simplemente se asocia al action correspondiente.
¿Tenemos que utilizar obligatoriamente faces-config.xml?
No. Desde JSF 2.0 podemos utilizar navegación implícita, es decir, nos basta con poner en el action el nombre de nuestra página JSF sin la extensión correspondiente.
<h:commandButton action="login"/> nos llevaría a la página login.xhtml
¿Se puede navegar a una página dependiendo de si se cumple una condición?
Desde JSF 2.0 sí.
<navigation-case> <from-outcome>login</from-outcome> <if>#{userBean.profile != 1}</if> <to-view-id>/login.xhtml</to-view-id> </navigation-case>
En el siguiente post veremos conceptos más avanzados sobre la navegación en JSF.
Comentarios
Publicar un comentario