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

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

Жизненный цикл приложения JavaServer Faces

Жизненный цикл приложения описывает различные этапы обработки этого приложения, от его инициирования до завершения. Жизненный цикл имеют все приложения. В течение жизненного цикла веб-приложения выполняются общие задачи, включая следующие.

  • Обработка входящих запросов

  • Декодирование параметров

  • Изменение и сохранение состояния

  • Отображение веб-страниц в браузере

Фреймворк JavaServer Faces автоматически управляет фазами жизненного цикла для простых приложений или позволяет вам управлять ими вручную (при необходимости) для более сложных приложений.

Приложения JavaServer Faces, использующие расширенные функции, могут требовать взаимодействия с жизненным циклом в определённых фазах. Например, приложения Ajax используют функции частичной обработки жизненного цикла (см. Частичная обработка и частичная отрисовка). Более чёткое понимание фаз жизненного цикла является ключом к созданию хорошо спроектированных компонентов.

Упрощённое представление жизненного цикла JavaServer Faces, состоящего из двух основных этапов веб-приложения JavaServer Faces, представлено в Простом приложении JavaServer Faces. В этом разделе более подробно рассматривается жизненный цикл JavaServer Faces.

Обзор жизненного цикла JavaServer Faces

Жизненный цикл приложения JavaServer Faces начинается, когда клиент делает HTTP-запрос на страницу, и заканчивается, когда сервер отвечает HTML-страницей.

Жизненный цикл можно разделить на две основные фазы: выполнение и отрисовку. Фаза выполнения дополнительно разделена на подфазы для поддержки дерева компонентов. Эта структура требует, чтобы данные компонента были конвертированы и провалидированы, события компонента были обработаны, а данные компонента были переданы в объекты бинов определённым образом.

Страница JavaServer Faces представлена ​​деревом компонентов, которое называется представлением. В течение жизненного цикла JavaServer Faces должна создавать представление с учётом состояния, сохранённого во время предыдущей отправки страницы. Когда клиент запрашивает страницу, JavaServer Faces выполняет несколько задач, таких как валидация ввода данных компонентов в представлении и конвертацию входных данных в типы, указанные на стороне сервера.

JavaServer Faces выполняет все эти задачи по шагам в жизненном цикле запрос-ответ. Рисунок 7-3 иллюстрирует эти шаги.

Рисунок 7-3. Стандартный жизненный цикл запроса-ответа JavaServer Faces

Блок-схема запроса и ответа, включающая обработку события и валидации, обработку ошибок, обновление модели, вызов приложения.

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

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

Обычно первый запрос на страницу JavaServer Faces поступает от клиента в результате клика ссылки или кнопки на странице JavaServer Faces. Чтобы отобразить в ответ другую страницу JavaServer Faces, приложение создаёт новое представление и сохраняет его в объекте javax.faces.context.FacesContext, который представляет всю информацию, связанную с обработкой входящего запроса и создание ответа. Затем приложение получает ссылки на объекты, необходимые представлению, и вызывает метод FacesContext.renderResponse, который вызывает немедленную отрисовку представления путём перехода к фазе отрисовки ответа, как показано стрелками с надписью Render Response на рис. 7-3.

Иногда приложению может потребоваться перенаправить на другой ресурс веб-приложения, например веб-сервис, или сгенерировать ответ, который не содержит компонентов JavaServer Faces. В этих ситуациях разработчик должен пропустить фазу отрисовки ответа, вызвав метод FacesContext.responseComplete. Эта ситуация также показана — стрелками, помеченными как Response Complete.

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

Существует одно исключение из жизненного цикла, описанного в этом разделе. Когда для атрибута immediate компонента установлено значение true, валидация, конвертация и события, связанные с этими компонентами, обрабатываются в фазе применения значений запроса, а не в более поздней фазе.

Детали жизненного цикла, описанные в следующих разделах, в первую очередь предназначены для разработчиков, которым необходимо знать информацию, например, когда обычно обрабатываются валидации, конвертации и события, а также способы изменения того, как и когда они обрабатываются. Для получения дополнительной информации о каждой из фаз жизненного цикла загрузите последнюю документацию по спецификации JavaServer Faces со страницы https://jcp.org/en/jsr/detail?id=372.

Фаза выполнения жизненного цикла приложения JavaServer Faces содержит следующие подфазы:

Фаза восстановления представления

Когда выполняется запрос на страницу JavaServer Faces, обычно с помощью какого-либо действия, например, при клике по ссылке или кнопке, JavaServer Faces начинает фазу восстановления представления.

На этом этапе JavaServer Faces создаёт представление страницы, связывает обработчики событий и средства валидации с компонентами в представлении и сохраняет представление в объекте FacesContext, который содержит всю информацию, необходимую для обработки одиночного запроса. Все компоненты приложения, обработчики событий, конвертеры и валидаторы имеют доступ к объекту FacesContext.

Если запрос к странице является начальным запросом, JavaServer Faces создаёт пустое представление на этом этапе, и жизненный цикл переходит к фазе отрисовки ответа, во время которого пустое представление заполняется компонентами, на которые ссылаются теги на странице.

Если запрос на страницу — повторный запрос, представление, соответствующее этой странице, уже существует в объекте FacesContext. В этой фазе JavaServer Faces восстанавливает представление, используя информацию о состоянии, сохранённую на клиенте или сервере.

Фаза применения значений запроса

После восстановления дерева компонентов во время повторного запроса каждый компонент в дереве извлекает своё новое значение из параметров запроса, используя метод decode (processDecodes()). Затем значение сохраняется локально для каждого компонента.

Если какие-либо методы decode или слушатели событий вызвали метод renderResponse у текущего объекта FacesContext, JavaServer Faces перейдёт к фазе отрисовки ответа.

Если какие-либо события в этой фазе были поставлены в очередь, JavaServer Faces передаёт события заинтересованным слушателям.

Если некоторые компоненты на странице имеют атрибуты immediate (см. Атрибут immediate), для которых установлено значение true, тогда валидации, конвертации и события, связанные с этими компонентами будут обрабатываться в этой фазе. Если какая-либо конвертация завершается неудачно, сообщение об ошибке, связанное с компонентом, генерируется и ставится в очередь в FacesContext. Это сообщение будет отображаться в фазе отрисовки ответа вместе с любыми ошибками валидации, возникшими в фазе валидации процесса.

На этом этапе, если приложению необходимо перенаправить на другой ресурс или сгенерировать ответ, который не содержит компонентов JavaServer Faces, оно может вызвать метод FacesContext.responseComplete.

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

Если текущий запрос идентифицирован как частичный запрос, частичный контекст извлекается из FacesContext и применяется метод частичной обработки.

Фаза валидации процесса

На этом этапе JavaServer Faces обрабатывает все валидаторы, зарегистрированные в компонентах дерева, используя метод validate (processValidators). Он проверяет атрибуты компонента, которые определяют правила валидации, и сравнивает эти правила с локальным значением, сохранённым для компонента. JavaServer Faces также завершает конвертацию для компонентов ввода, для которых атрибут immediate не установлен в значение true.

Если локальное значение не прошло валидацию или какая-либо конвертация завершается неудачно, JavaServer Faces добавляет сообщение об ошибке в объект FacesContext, и жизненный цикл переходит непосредственно к фазе отрисовки ответа, чтобы отобразить страница повторно с сообщениями об ошибках. Если в фазе применения значений запроса произошли ошибки конвертации, также отображаются сообщения и об этих ошибках.

Если какие-либо методы validate или слушатели событий вызвали метод renderResponse в текущем FacesContext, JavaServer Faces перейдёт к фазе отрисовки ответа.

На этом этапе, если приложению необходимо перенаправить на другой ресурс или сгенерировать ответ, который не содержит компонентов JavaServer Faces, оно может вызвать метод FacesContext.responseComplete.

Если события в этой фазе были поставлены в очередь, JavaServer Faces передаёт их заинтересованным слушателям.

Если текущий запрос идентифицирован как частичный запрос, частичный контекст извлекается из FacesContext и применяется метод частичной обработки.

Фаза обновления значений модели

После того, как JavaServer Faces определит, что данные валидны, он обходит дерево компонентов и устанавливает соответствующие свойства серверного объекта в локальные значения компонентов. JavaServer Faces обновляет только свойства компонента, на которые указывает атрибут value входного компонента. Если локальные данные не могут быть конвертированы в типы, указанные в свойствах бина, жизненный цикл переходит непосредственно к фазе отрисовки ответа и страница повторно отображается с ошибками. Это похоже на то, что происходит с ошибками валидации.

Если какие-либо методы updateModels или какие-либо слушатели вызвали метод renderResponse в текущем объекте FacesContext, JavaServer Faces перейдёт к фазе отрисовки ответа.

На этом этапе, если приложению необходимо перенаправить на другой ресурс или сгенерировать ответ, который не содержит компонентов JavaServer Faces, оно может вызвать метод FacesContext.responseComplete.

Если какие-либо события в этой фазе были поставлены в очередь, JavaServer Faces передаёт их заинтересованным слушателям.

Если текущий запрос идентифицирован как частичный запрос, частичный контекст извлекается из FacesContext и применяется метод частичной обработки.

Фаза вызова приложения

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

На этом этапе, если приложению необходимо перенаправить на другой ресурс или сгенерировать ответ, который не содержит компонентов JavaServer Faces, оно может вызвать метод FacesContext.responseComplete.

Если обрабатываемое представление было восстановлено из информации о состоянии из предыдущего запроса и если компонент вызвал событие, эти события передаются заинтересованным слушателям.

Наконец, JavaServer Faces передаёт управление фазе отрисовка ответа.

Фаза отрисовки ответа

На этом этапе JavaServer Faces создаёт представление и делегирует полномочия соответствующему ресурсу для отображения страниц.

Если это начальный запрос, компоненты, представленные на странице, будут добавлены в дерево компонентов. Если это не начальный запрос, компоненты уже добавлены в дерево и не нуждаются в повторном добавлении.

Если запрос является повторным и в фазе применения значений запроса, валидаций процесса или в фазе обновления значений модели возникли ошибки, исходная страница будет отображена снова. Если страницы содержат теги h:message или h:messages, любые сообщения об ошибках в очереди отображаются на странице.

После отрисовки содержимого представления состояние ответа сохраняется, чтобы последующие запросы могли получить к нему доступ. Сохранённое состояние доступно для фазы восстановления представления.


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