JSF - Еще один вопрос о жизненном цикле

Сегодня я хотел бы узнать о некоторых функциях жизненного цикла JSF. Позвольте мне начать:

1 - Этап 2: Применение значений запроса - на этом этапе каждый компонент в представлении будет искать свои значения в запросе и устанавливать для них новые значения

Хм, хорошо, хорошо. Итак, View будет построен на основе предыдущих параметров Beans. После этого идет частичный просмотр, созданный со значениями запроса. (Верно? Позже, в фазе 3 °, они будут сравнены). Но, например, если значения в списке запросов отсутствуют во время создания этого последнего представления? Значения будут нулевыми?

2 - Этап 5: Вызов приложения - после того, как все значения запроса были успешно установлены для резервного bean-компонента, события действия, поставленные в очередь на этапе применения значений запроса, будут обработаны. В нашем случае это метод действия кнопок отправки.

Это совсем не понятно. В этот момент у меня есть (на beans) значения, обновленные с предыдущей фазы (если проверка и запрос на применение не завершились ошибкой). Хорошо, что теперь происходит? Что означает, что события действия, поставленные в очередь на этапе применения значений запроса, будут обработаны? Это означает, что, например, если задано действие Отправить, процесс завершен? Вот почему вызов ajax, если он не отображается в фазе 2 °, завершится ошибкой? Или где не получается?

3 - Этап 6: Отображение ответа - на этом этапе дерево компонентов будет отображаться клиенту.

Это означает, что View на сервере обновляется с использованием обновленных значений bean-компонентов? И после этого HTML-код создается из этого View? Или просто сделал HTML-код и сохранил статус просмотра?

Надеюсь, ты сможешь мне помочь :)


person markzzz    schedule 01.12.2010    source источник


Ответы (3)


Этап 2. Применение значений запроса - на этом этапе каждый компонент в представлении будет искать свои значения в запросе и устанавливать для них новые значения

Хм, хорошо, хорошо. Итак, View будет построен на основе предыдущих параметров Beans. После этого идет частичное представление, созданное с использованием значений запроса. (Верно? Позже, в фазе 3 °, они будут сравнены). Но, например, если значения в списке запросов отсутствуют во время создания этого последнего представления? Значения будут нулевыми?

Обычно под прикрытием происходит следующее (здесь input это _ 2_ и request это HttpServletRequest):

if (input.isRendered()) {
    String value = request.getParameter(input.getClientId());
    if (value != null) {
        input.setSubmittedValue(value);
    }
}

Таким образом, они останутся нетронутыми, если нет параметра запроса. Они не будут установлены с null и будут просто сохранены по умолчанию.


Этап 5: вызов приложения - после того, как все значения запроса были успешно установлены для резервного bean-компонента, события действия, поставленные в очередь на этапе применения значений запроса, будут обработаны. В нашем случае это метод действия кнопок отправки.

Это совсем не понятно. В этот момент у меня есть (на beans) значения, обновленные с предыдущей фазы (если проверка и запрос на применение не завершились ошибкой). Хорошо, что теперь происходит? Что означает, что события действия, поставленные в очередь на этапе применения значений запроса, будут обработаны? Это означает, что, например, если действие «Отправить», процесс завершен? Вот почему вызов ajax, если он не отображается в фазе 2 °, завершится ошибкой? Или где не получается?

Во время 2-го этапа в основном также произойдет следующее (здесь command - это _ 8_, request - это HttpServletRequest, а ActionEvent - это _ 12_):

if (command.isRendered()) {
    String value = request.getParameter(command.getClientId());
    if (value != null) {
        command.queueEvent(new ActionEvent(command)); // Queue for INVOKE_ACTION.
    }
}

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


Этап 6. Обработка ответа - на этом этапе дерево компонентов отображается для клиента.

Это означает, что View на сервере обновляется с использованием обновленных значений bean-компонентов? И после этого HTML-код создается из этого View? Или просто сделал HTML-код и сохранил статус просмотра?

На этом этапе JSF проходит через дерево компонентов, и все компоненты будут закодированы (вызовет _ 14_ всех компонентов, по умолчанию средство визуализации HTML). Во время кодирования значения будут просто получены из модели. Само представление обновляться не будет. В основном:

facesContext.getViewRoot().encodeAll();
person BalusC    schedule 01.12.2010
comment
Second Point: до сих пор не понимаю (Фаза 5). Что означают действия? В основном я только что это сделал, получив значения из запроса и поместив в контекст пользовательского интерфейса (если, например, действие Submit - person markzzz; 01.12.2010
comment
Выполните метод bean-компонента, который объявлен в атрибуте action компонента UICommand, если есть. Например. <h:commandButton action="#{bean.submit}" /> вызовет submit() метод bean во время фазы действия вызова. См. Также эту статью. - person BalusC; 01.12.2010
comment
Ах ... хорошо, ясно :) И поскольку модель обновляется в фазе 4 °, она использует обновленные значения, верно? - person markzzz; 01.12.2010
comment
Если метод action находится в той же модели или имеет доступ к желаемой модели (управляемое свойство и т. Д.), Тогда, очевидно, да! - person BalusC; 01.12.2010
comment
Отлично. Спасибо. Last Point Вы сказали На этом этапе JSF проходит через дерево компонентов, и все компоненты будут закодированы. Это означает, что начать с вершины дерева компонентов и получить текущее значение из обновленной модели, верно? - person markzzz; 01.12.2010
comment
Если возможно, да. Если какой-либо из атрибутов компонента содержит выражение значения #{bean.something}, то оно будет оценено, и его результат будет включен в визуализированный вывод. - person BalusC; 01.12.2010
comment
Хороший. Теперь понятнее! Для многих это могло быть банальным. Но я считаю необходимым их очень хорошо понимать! Еще раз спасибо, хозяин :) - person markzzz; 01.12.2010
comment
Пожалуйста. Если вы понимаете базовый API сервлетов (который, по ИМХО, является обязательным перед погружением в JSF), вы можете найти этот ответ также полезен для понимания того, как средний фреймворк MVC работает поверх Servlet API. Таким образом, вы лучше поймете черт побери, происходящее под прикрытием такого MVC-фреймворка;) - person BalusC; 01.12.2010
comment
Некоторое время назад (для университета) я выполнил проект, используя servlet + jsp. Я понимаю эту логику. Но это, на мой взгляд, ПОЛНОСТЬЮ РАЗНОЕ. Жизненный цикл JSF более сложен! - person markzzz; 01.12.2010
comment
Да, вы должны понимать это в целом, но в итоге вы получаете более простой код. Просто файл XHTML как представление и javabean как модель. Нет проблем с ручным сбором параметров запроса, преобразованием, проверкой, распределением и вызовом действий и т. Д. - person BalusC; 01.12.2010
comment
@BalusC, если ты напишешь книгу, я куплю ее первым. - person arthur; 15.08.2012

1 - Этап 2. Применение значений запроса

Этот этап не имеет ничего общего с компонентом поддержки. Здесь мы просто обрабатываем параметры запроса и пытаемся «связать их» с компонентом в представлении. На этапе применения запроса эти параметры HTTP-запроса должны быть преобразованы и проверены, прежде чем они будут введены в фактический компонент.

2 - Этап 5. Вызов приложения

В JSF события ActionEvents обрабатываются ActionListeners. При нажатии кнопки возникает событие ActionEvent, которое ставится в очередь для обработки на более позднем этапе. JSF предоставляет Actionlistener по умолчанию, который принимает это событие ActionEvent и обрабатывает его на этапе обработки приложения.

ActionListener по умолчанию реализован таким образом, что он оценивает выражение EL и использует результат для передачи его прослушивателю навигации. Итак, то, что вы считаете само собой разумеющимся (нажатие кнопки выполняет выражение EL в атрибуте действия и перенаправляет на другую страницу), фактически обрабатывается внутри с помощью ActionListener.

3 - Этап 6. Обработка ответа -

Представление JSF - это внутреннее представление дерева компонентов и всех привязок значений. Фактическое представление HTML обрабатывается ViewHandler.

person ddewaele    schedule 01.12.2010

Еще одну замечательную статью о жизненном цикле JSF можно найти по адресу: http://palkonyves.blogspot.com.br/2013/08/demistifying-jsf-21-lifecycle-mojarra.html

person Cláudio    schedule 27.01.2015