Когда 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
лучше подходит для такого вмешательства
Связанные с: