JSF - еще один вопрос по жизненному циклу
Сегодня я хотел бы узнать некоторые особенности жизненного цикла JSF. Позвольте мне начать:
1 - Этап 2: Применить значения запроса - На этом этапе каждый компонент в представлении будет искать свои значения в запросе и устанавливать для них новые значения
Хм, хорошо, хорошо. Таким образом, представление будет построено из-за предыдущих параметров Beans. После этого есть частичное представление, сгенерированное со значениями запроса. (Верно? Позже, в фазе 3° они будут сравниваться) . Но, например, если значения в списке запросов отсутствуют при создании этого последнего представления? Значения будут нулевыми?
2 - Фаза 5: Вызов приложения - После того, как все значения запроса были успешно установлены для компонента поддержки, будут обработаны события действия, поставленные в очередь на этапе применения значений запроса. В нашем случае метод действия кнопки отправки.
Это не совсем понятно. На данный момент у меня есть (на бобах) значения, обновленные с предыдущего этапа (если проверка и запрос на применение не провалились) . Хорошо, теперь что происходит? Что означает, что события действия, поставленные в очередь на этапе применения значений запроса, будут обрабатываться? Это означает, что, например, если действие Отправить, процесс завершен? Вот почему вызов ajax, если он не будет обработан в фазе 2°, потерпит неудачу? Или где это не получается?
3 - Этап 6. Ответ на визуализацию - На этом этапе дерево компонентов будет отображаться клиенту.
Это означает, что представление на сервере обновляется с использованием обновленных значений компонента? И, после этого, HTML-код создается из этого представления? Или просто сделал HTML код и сохрани статус просмотра?
Надеюсь, вы можете помочь мне:)
3 ответа
Этап 2. Применить значения запроса. На этом этапе каждый компонент в представлении будет искать свои значения в запросе и устанавливать для них новые значения.
Хм, хорошо, хорошо. Таким образом, представление будет построено из-за предыдущих параметров Beans. После этого есть частичное представление, сгенерированное со значениями запроса. (Верно? Позже, в фазе 3° они будут сравниваться) . Но, например, если значения в списке запросов отсутствуют при создании этого последнего представления? Значения будут нулевыми?
В основном следующее происходит под одеялом (здесь input
является UIInput
а также request
является HttpServletRequest
):
if (input.isRendered()) {
String value = request.getParameter(input.getClientId());
if (value != null) {
input.setSubmittedValue(value);
}
}
Таким образом, они не будут затронуты, если нет параметра запроса. Они не будут установлены с null
и просто сохранил дефолт.
Этап 5. Вызов приложения. После того, как все значения запроса успешно заданы для компонента поддержки, будут обработаны события действия, поставленные в очередь на этапе применения значений запроса. В нашем случае метод действия кнопки отправки.
Это не совсем понятно. На данный момент у меня есть (на бобах) значения, обновленные с предыдущего этапа (если проверка и запрос на применение не провалились) . Хорошо, теперь что происходит? Что означает, что события действия, поставленные в очередь на этапе применения значений запроса, будут обрабатываться? Это означает, что, например, если действие Отправить, процесс завершен? Вот почему вызов ajax, если он не будет обработан в фазе 2°, потерпит неудачу? Или где это не получается?
Во время 2-го этапа в основном также произойдет следующее (здесь command
является UICommand
, request
является HttpServletRequest
а также ActionEvent
является ActionEvent
):
if (command.isRendered()) {
String value = request.getParameter(command.getClientId());
if (value != null) {
command.queueEvent(new ActionEvent(command)); // Queue for INVOKE_ACTION.
}
}
Затем на этапе вызова приложения будут вызваны все события, которые поставлены в очередь для конкретной фазы.
Этап 6: ответ на визуализацию. На этом этапе дерево компонентов будет отображаться для клиента.
Это означает, что представление на сервере обновляется с использованием обновленных значений компонента? И, после этого, HTML-код создается из этого представления? Или просто сделал HTML код и сохрани статус просмотра?
На этом этапе JSF проходит по дереву компонентов, и все компоненты будут закодированы (вызовет Renderer
из всех компонентов, по умолчанию HTML рендерер) . Во время кодирования значения будут просто получены из модели. Сам вид не будет обновлен. В основном:
facesContext.getViewRoot().encodeAll();
1 - Этап 2. Применить значения запроса
Эта фаза не имеет ничего общего с поддерживающим компонентом. Здесь мы просто обрабатываем параметры запроса и пытаемся "связать их" с компонентом в представлении. На этапе Apply Request эти параметры HTTP-запроса должны быть преобразованы и проверены, прежде чем они будут внедрены в реальный компонент.
2 - Этап 5: вызов приложения
В JSF ActionEvents обрабатываются ActionListeners. При нажатии на кнопку ActionEvent поднимается и ставится в очередь для обработки на более позднем этапе. JSF предоставляет Actionlistener по умолчанию, который выбирает этот ActionEvent и обрабатывает его на этапе обработки приложения.
Стандартный ActionListener реализован таким образом, что он оценивает выражение EL и использует результат, чтобы передать его в навигационный прослушиватель. Таким образом, то, что вы принимаете как должное (нажатие кнопки выполняет выражение EL в атрибуте действия и пересылает на другую страницу), фактически обрабатывается внутренне с помощью ActionListener.
3 - Этап 6: Отобразить ответ -
Представление JSF является внутренним представлением дерева компонентов и всех привязок значений. Фактическое представление HTML обрабатывается ViewHandler.
Еще одну замечательную статью о жизненном цикле JSF можно найти по адресу: http://palkonyves.blogspot.com.br/2013/08/demistifying-jsf-21-lifecycle-mojarra.html