Navegación en JSF

La navegación en JSF es una característica poderosa que permite a los desarrolladores crear aplicaciones web fáciles de usar. Con JSF, los desarrolladores pueden crear fácilmente páginas navegables y usar diferentes reglas de navegación para lograr la experiencia de usuario deseada. En este artículo, exploraremos los aspectos básicos de la navegación en JSF, incluido cómo crear páginas navegables y cómo configurar reglas de navegación.

En JSF se entiende por navegación a un conjunto de reglas para la elección de la próxima vista a ser visualizada después de una acción por parte del usuario.

La navegación puede ser implícita o definida por el usuario con Reglas de Navegación.

Navegación Implícita

Cuando no se han definido reglas de navegación en la configuración de la aplicación JSF hará uso de la navegación implícita que para la elección de la página a mostrar se basará en el valor retornado por un método del Managed Bean, o en el valor del atributo action del control utilizado por el usuario (CommandButton, Link, etc). En el primer caso, el control, en su atributo action, contiene una expresión que hace referencia a un método del Managed Bean.

<h:commandButton value = "Go A" action="#{navigationBean.goToOptionA}" />

El método, además de ejecutar la lógica necesaria retornará el nombre de la vista a visualizar una vez finalizada la acción.

public String goToOptionA() {
    return "option-a";
}

En este caso, una vez finalizada la ejecución JSF buscará una página llamada option-a.xhtml.

También es posible hacer referencia a la vista directamente desde el atributo action.

<h:commandButton value = "Go C" action="option-c" />

Reglas de Navegación

La navegación definida por el usuario se basa en Reglas de Navegación de JSF que son declaradas en el archivo faces-config.xml.

Cada regla especifica la navegación de una una o más páginas a otras páginas. La regla de navegación se selecciona de acuerdo a la página que está visualizando al momento de iniciarse la acción que dispara la navegación. Para hacer esto, JSF busca la regla de navegación cuyo tag from-view-id contenga el nombre de la página actual.

El tag from-view-id no es requerido, y en caso de no existir significa que la regla aplica para todas las páginas. También se admiten wildcards en el nombre de la página en caso de que la regla aplique a más de una página.

A continuación JSF procede a buscar el caso de navegación que corresponda dentro de la regla de navegación seleccionada. Para hacer esto, buscará en cada tag navigation-case de la regla seleccionada la que corresponda al action configurado en el control de la vista (ej: Command Button) y el outcome o salida del método de acción ejecutado.

En el ejemplo que se muestra a continuación, tenemos un solo control en la vista (Command Button) cuyo action es #{navigationBean.value}, por lo que de acuerdo a este criterio los dos casos de navegación configurados son elegibles porque ambos contienen el criterio:

<from-action>#{navigationBean.verificarValor}</from-action>

Una vez ejecutado el método del Bean se compara el retorno contra el outcome configurado en cada caso de navegación.
La navegación se hará a la página configurada en el elemento to-view-id del caso de navegación seleccionado.

A continuación un ejemplo de configuración y utilización de las reglas de navegación en JSF:

faces-config.xml
<navigation-rule>
    <from-view-id>/home.xhtml</from-view-id>
    <navigation-case>
        <from-action>#{navigationBean.verificarValor}</from-action>
        <from-outcome>exito</from-outcome>
        <to-view-id>/page-success.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-action>#{navigationBean.verificarValor}</from-action>
        <from-outcome>error</from-outcome>
        <to-view-id>/page-error.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
NavigationBean.java
@Named(value = "navigationBean")
@ViewScoped
public class NavigationBean implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer value;
    
    public String verificarValor() {
        System.out.println("NavigationBean.verificarValor() : ENTRADA");
        
        if (this.value > 100) {
            return "error";
        }
        
        return "exito";
    }
    //getters & setters
}
home.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://xmlns.jcp.org/jsf/html"
        xmlns:jsf="http://xmlns.jcp.org/jsf">
    <head>
        <title>Ejemplo Navegaci&oacute;n Impl&iacute;cita</title>
    </head>
    <body>
        <h:form>
            <h:inputText value="#{navigationBean.value}" /><p></p>
            <h:commandButton value = "Verificar" action="#{navigationBean.verificarValor}" />
        </h:form>
    </body>
</html>

Conclusión

La navegación es un aspecto importante de cualquier aplicación JSF, y en este artículo hemos cubierto dos formas de lograrlo: navegación implícita y reglas de navegación. Con la navegación implícita, JSF decide cómo navegar entre páginas según el resultado de un método de acción. Esto puede simplificar la configuración, pero puede que no siempre sea apropiado para aplicaciones complejas.

Por el contrario, las reglas de navegación brindan a los desarrolladores más control sobre cómo se navega por las páginas. Ya sea que elija navegación implícita, reglas de navegación o una combinación de ambas, es importante considerar cuidadosamente las necesidades y objetivos de su aplicación al implementar la navegación en JSF. Con el enfoque correcto, puede crear una experiencia de usuario fluida e intuitiva que satisfaga las necesidades de sus usuarios.


Te puede interesar:

Facelets y uso de templates en JSF

Facelets es un lenguaje de declaración de vistas para JavaServer Faces, que permite crear vistas usando templates HTML.

Seguir leyendo →

Arquitectura y Ciclo de Vida JSF

Cómo funciona el ciclo de vida de una aplicación JSF. En el artículo relacionado se cubre el manejo de eventos.

Seguir leyendo →