Когда ViewRoot создается в JSF?

В JSF вид корня создается для каждой страницы JSF. Когда это будет построено?

Он создается каждый раз, когда представление рендерится, или зависит от инициализации бина?

2 ответа

Решение

В JSF вид корня создается для каждой страницы JSF. Когда это будет построено?

В основном, когда жизненный цикл JSF вызывает ViewHandler#createView() который в свою очередь назовет ViewDeclarationLanguage#createView(), Это может произойти во время фазы просмотра восстановления. Но это также может произойти во время фазы ответа рендеринга, когда произошла навигация. Или когда JSF нужно извлечь метаданные из данного представления. Это также может произойти в любое время, когда пользовательский код явно вызывает ViewHandler#createView(), Ничто в спецификации JSF не ограничивает это конкретным моментом.


Он создается каждый раз, когда представление рендерится, или зависит от инициализации бина?

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

Когда это будет построено?

Он построен во время RESTORE_VIEW фаза жизненного цикла, т. е. когда страница запрашивается впервые и представляется как экземпляр UIViewRoot

Он создается каждый раз, когда представление рендерится, или зависит от инициализации бина?

Он создается как раз перед тем, как страница отображается. В то время как вы обычно получаете новый UIViewRoot для каждого запроса страницы возможно повторное использование одного и того же объекта из предыдущего рендеринга представления, и спецификация JSF поддерживает это. Из спецификации:

[В течение RESTORE_VIEW ] Изучите FacesContext экземпляр для текущего запроса. Если он уже содержит UIViewRoot:

Установите локаль на этом UIViewRoot на значение, возвращаемое getRequestLocale() метод на ExternalContext по этому запросу. Не предпринимайте никаких дальнейших действий на этом этапе и вернитесь. Наличие UIViewRoot уже установленный в FacesContext перед реализацией фазы восстановления представления, указывает, что фаза должна предполагать, что представление уже было восстановлено другими средствами.

На самом деле вы не можете ничего сделать изнутри бина, чтобы изменить UIViewRoot скорее PhaseListener или ViewHandler лучше подходит для такого вмешательства

Связанные с:

Другие вопросы по тегам