Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Модель навигации

Модель навигации JavaServer Faces позволяет легко задать навигацию по страницам и выполнить любую дополнительную обработку, необходимую для определения последовательности загрузки страниц.

В JavaServer Faces навигация — это набор правил для выбора следующей страницы или представления, которое будет отображаться после выполнения обработчика действия, например, клика кнопки или ссылки.

Навигация может быть неявной или задана пользователем. Неявная навигация вступает в игру, когда правила навигации не заданы пользователем в файлах конфигурации приложения.

Когда вы добавляете такой компонент, как commandButton на страницу Facelets, и назначаете другую страницу в качестве значения для свойства action, обработчик навигации по умолчанию будет пытаться неявно установить ей в соответствие подходящую страница приложения. В следующем примере обработчик навигации по умолчанию попытается найти страницу с именем response.xhtml в приложении и перейти к ней:

<h:commandButton value="submit" action="response">

Определяемые пользователем правила навигации объявляются в таких файлах конфигурации приложения, как faces-config.xml. Структура правила навигации по умолчанию выглядит следующим образом:

<navigation-rule>
    <description></description
    <from-view-id></from-view-id>
    <navigation-case>
        <from-action></from-action>
        <from-outcome></from-outcome>
        <if></if>
        <to-view-id></to-view-id>
    </navigation-case>
</navigation-rule>

Пользовательская навигация обрабатывается следующим образом.

  • Задайте правила в файле конфигурации приложения.

  • Обратитесь к строковому результату из атрибута action кнопки или компонента ссылки. Этот результат String используется JavaServer Faces для выбора правила навигации.

Вот пример правила навигации:

<navigation-rule>
    <from-view-id>/greeting.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/response.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

Это правило гласит, что когда компонент command (такой как h:commandButton или h:commandLink) в greeting.xhtml активирован, приложение перейдёт со страницы greeting.xhtml на страницу response.xhtml, если результатом вычисления обработчика компонента кнопки будет success. Вот тег h:commandButton из greeting.xhtml, который будет указывать логический результат success:

<h:commandButton id="submit" value="Submit" action="success"/>

Как показано в примере, каждый элемент navigation-rule определяет, как добраться с одной страницы (указанной в элементе from-view-id) на другие страницы приложения. Элементы navigation-rule могут содержать любое количество элементов navigation-case, каждый из которых определяет следующую страницу, которую нужно открыть (определяется to-view-id) на основе логического результата (определяется как from-outcome).

В более сложных приложениях логический результат также может быть получен из возвращаемого методом-обработчиком значения в Managed-бине. Этот метод выполняет некоторую обработку для определения результата. Например, метод может проверить, совпадает ли пароль, введённый пользователем на странице, с паролем в файле. Если это так, метод может вернуть success. В противном случае он может вернуть failure. В результате failure может произойти перезагрузка страницы входа. В результате success может открыться страница, отображающая активность по кредитной карте пользователя. Если вы хотите, чтобы результат был возвращён методом в компоненте, вы должны обратиться к методу, используя выражение метода в атрибуте action, как показано в этом примере:

<h:commandButton id="submit" value="Submit"
                 action="#{cashierBean.submit}" />

Когда пользователь кликает кнопку, представленную этим тегом, соответствующий компонент генерирует событие действия. Это событие по умолчанию обрабатывается объектом javax.faces.event.ActionListener, который вызывает метод-обработчик, на который ссылается компонент, вызвавший событие. Метод-обработчик возвращает логический результат слушателю.

Слушатель передаёт логический результат и ссылку на метод-обработчик, который создал результат, по умолчанию javax.faces.application.NavigationHandler. NavigationHandler выбирает следующую страницу для отображения, сопоставляя результат или ссылку на метод-обработчик с правилами навигации в файле конфигурации приложения с помощью следующего процесса.

  1. NavigationHandler выбирает правило навигации, соответствующее отображаемой странице.

  2. Он сопоставляет результат или ссылку на метод-обработчик, полученный из javax.faces.event.ActionListener по умолчанию, с теми, которые определены в правилах навигации.

  3. Он пытается сопоставить и ссылку на метод, и результат с одним и тем же правилом навигации.

  4. Если предыдущий шаг завершается неудачно, обработчик навигации пытается сопоставить результат.

  5. Наконец, обработчик навигации пытается сопоставить ссылку на метод-обработчик, если предыдущие две попытки потерпели неудачу.

  6. Если ни один из вариантов навигации не совпадает, он снова отображает тот же вид.

Когда NavigationHandler устанавливает соответствия, начинается фаза отрисовки ответа. В этой фазе будет отображена страница, выбранная NavigationHandler.

Приложение-пример Duke’s Tutoring использует правила навигации в бизнес-методах, которые обрабатывают создание, редактирование и удаление пользователей приложения. Например, форма для создания студента имеет тег h:commandButton:

<h:commandButton id="submit"
        action="#{adminBean.createStudent(studentManager.newStudent)}"
        value="#{bundle['action.submit']}"/>

Событие действия вызывает метод dukestutoring.ejb.AdminBean.createStudent:

public String createStudent(Student student) {
    em.persist(student);
    return "createdStudent";
}

Возвращаемое значение creationStudent имеет соответствующее правило навигации в файле конфигурации faces-config.xml:

<navigation-rule>
    <from-view-id>/admin/student/createStudent.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>createdStudent</from-outcome>
        <to-view-id>/admin/index.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

После создания студента пользователь возвращается на начальную страницу администрирования.

Для получения дополнительной информации о том, как задать правила навигации, см. Настройка правил навигации.

Для получения дополнительной информации о том, как реализовать методы-обработчики для обработки навигации, смотрите Пишем метод-обработчик действия.

Для получения дополнительной информации о том, как ссылаться на результаты или методы действий из тегов компонента, см. Ссылка на метод, который выполняет навигацию.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)