Навигация и перенаправление

JSF включает в себя механизм навигации, аналогичный Struts. За переход на определенную страницу отвечает обработчик навигации (navigation handler). Фреймворк JSF в сочетании с Facelets позволяет использовать как статическую навигацию, так и динамическую навигацию.

Для простых (безусловных) переходов используется статическая навигация. Это означает, что при нажатии на кнопку или ссылку всегда приводит к отображению конкретной, заранее заданной, JSF страницы. В качестве примера можно рассмотреть следующий код :

<h:commandButton label="Login" action="welcome"/>

Значение атрибута action, согласно принятому соглашению при использовании фреймворка Facelets, является наименование страницы без указания расширения '.xhtml'. Если результат не начинается с символа обратного слеша '/' , то префикс определяется в виде пути текущего представления. Т.е. в нашем коде по нажатию на кнопку должен быть выполнен переход на страницу wellcome.xhtml. Соглашения, принятые в фреймворке Facelets, представлены на странице описания фреймворка JSF.

Динамическая навигация

В большинстве случаев навигация не является статической. Переход зависит не только от того, на какой кнопке выполнен щелчок, но и от того, какие определены входные данные. Например, отправка на сервер параметров авторизации в системе может иметь два результата: успешный и неудачный. Алгоритм обработки данных определен на сервере. Для обеспечения динамической навигации кнопка отправки должна иметь выражение метода (method expression). Пример динамической навигации :

<h:commandButton label="Авторизация" action="# {userController.verifyUser}"/>

В данном примере вызывается метод verifyUser managed bean класса userController. Выражение метода в атрибуте action не имеет параметров и возвращаемый им тип может быть любым. Возвращаемое методом значение преобразуется в строку путем вызова метода toString.

Упрощенный пример класса userController.

public class userController
{
    public String verifyUser()
    {
        if (...)
            return "success";
        else
            return "failure";
    }
}
Примечание :
1. В версии JSF 1.1 в качестве возвращаемого типа можно использовать только String. Начиная с версии 1.2 разрешается использовать любой тип данных.
2. В качестве возвращаемого значения можно использовать 'null', указывающее, что перехода не будет, т.е. остается то же самое представление.

Бизнес-логика динамической навигации определяется в файле конфигурации faces-config.xml. Ниже приведен типичный пример :

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <description>Успешная авторизация</description>
        <from-outcome>success</from-outcome>
        <to-view-id>/welcome.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

Условия динамической навигации определяются тегом <navigation-rule>. Согласно правилу, определенному в примере, результат "success" должен приводить к переходу на страницу welcome.xhtml, если он возникает во время работы со страницей index.xhtml.

Правило навигации, navigation-rule

Правило навигации определяются тегом navigation-rule.

ТегОписание
<navigation-rule>Правило навигации
<from-view-id> Источник навигации, т.е. страница. Если правило действует на все страницы, то необходимо использовать символ '*'. Перед наименованием страницы необходимо вставить символ '/'.
<navigation-case> Определение одного из вариантов правила навигации. Вариантов может быть и несколько для различных условий.
<description> Комментарий к варианту перехода
<from-action> Выполнение определенного метода. Пример "# {userController.checkCaptcha}"
<from-outcome> Описание условия согласно которому выбирается данный вариант навигации. Т.е. здесь указывается одно из значений «success», «failure» и т.д.
<to-view-id> Страница перехода, на которую должен быть выполнен переход.
<redirect/> Перенаправление с изменением URL страницы.

Перенаправление, redirect и faces-redirect

Использование навигации в JSF обеспечивает условный или безусловный переход, но при этом адрес страницы url не изменяется. По умолчанию JSF при переходе с одной XHTML-страницы на другую использует переадресацию (forward). Т.е. в нашем примере при переходе со страницы index.xhtml на страницу wellcome.xhtml содержание изменилось, а url остался прежним. Для изменения url страницы при переходе необходимо выполнить перенаправление с помощью тега <redirect> в файле конфигурации faces-config.xml.

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/welcome.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

Перенаправление в JSF происходит медленнее. Однако при перенаправлении обновляется адрес страницы.

При определении статической навигации в интерфейсе для выполнения перенаправления необходимо использовать параметр faces-redirect в параметре определения страницы :

<h:commandButton label="Login" action="welcome?faces-redirect=true"/>
  Рейтинг@Mail.ru