Где я могу найти объяснение/документацию о том, как каждый компонент JSF взаимодействует с жизненным циклом страницы

Часто при использовании компонента пользовательского интерфейса JSF или одной из сторонних библиотек компонентов мне трудно найти документацию, объясняющую, где в жизненном цикле будут задействованы атрибуты этих тегов.

Допустим, я хочу использовать

<h:selectOneMenu valueChangeListener="#{myBean.myMethod1}" ... />

or

<h:commandButton action="#{myBean.myMethod2}" actionListener="#{myBean.myMethod3}" ... />

Где я могу найти информацию о том, где в жизненном цикле JSF вызывается valueChangeListener, action или actionListener соответственно?

Пожалуйста, поймите, что это только примеры. Я стараюсь не заходить в StackOverflow для каждого атрибута каждого компонента, когда не понимаю, когда именно будет вызываться его метод.

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


person Chris    schedule 25.03.2013    source источник
comment
Ваш вопрос немного двусмыслен, но лучше всего начать с JSF PhaseListeners, которые существенно помогают вам отслеживать жизненный цикл запроса JSF по отношению к компонентам.   -  person kolossus    schedule 26.03.2013
comment
Я отредактировал это и надеюсь, что это яснее. Если нет, пожалуйста, дайте мне знать, что вы найдете неясным. Может быть, я могу улучшить его.   -  person Chris    schedule 26.03.2013


Ответы (1)


Что касается стандартных атрибутов JSF, вы можете найти информацию, среди прочего, в спецификации JSF. В документации в главе 2.5.1.3 о валидации говорится следующее:

Преобразованное значение помещается в метод setValue() компонента, и если значение изменилось, запускается ValueChangeEvent.

(таким образом, он срабатывает по окончании преобразования/проверки и установке локального значения)

И следующее в главе 7.3 о действиях приложений:

Действие приложения — это предоставляемый приложением метод в некотором классе Java, который выполняет определенную обработку, указанную приложением, когда происходит ActionEvent либо на этапе Apply Request Values, либо на этапе Invoke Application жизненного цикла обработки запроса (в зависимости от непосредственного свойства ActionSource). экземпляр, инициирующий событие).

Следующие связанные вопросы также могут быть полезны для лучшего понимания:

Что касается сторонних библиотек компонентов, смотрите их документацию по тегам или руководство пользователя. Но, как правило, они не используют пользовательские события, а только стандартные события JSF или абстракции стандартных событий ajax/HTML DOM (что, таким образом, требует базовых знаний ajax/HTML для начала).

Что касается отладки, то проще всего поставить точку останова в вызываемом методе и посмотреть в стеке вызовов и/или порядке попадания. Mojarra использует для каждой фазы довольно самодокументирующийся класс, такой как ProcessValidationsPhase, который должен четко отображаться в стеке вызовов где-то после FacesServlet#service(). Вы также можете регистрировать/распечатывать FacesContext#getCurrentPhaseId() или даже вызывать Thread#dumpStack() и читать трассировку стека в журнале и вручную просматривать связанные классы.

person BalusC    schedule 26.03.2013
comment
Спасибо. Именно такую ​​информацию я и искал. Однако, учитывая ваш ответ, я также предполагаю, что нет более простого способа получить эту информацию, даже если вы думаете, что это будет первое, что нужно задокументировать. Ответы не всегда интуитивно понятны. Я, вероятно, начну с ваших предложений по отладке, которые действительно кажутся очень полезными! Как и встроенные и ссылочные объяснения! - person Chris; 26.03.2013
comment
Когда вы собираетесь опубликовать книгу о JSF, BalusC? Кажется, с вашим мастерством API + реализации и вашим опытом разработчика JSF вы могли бы легко написать книгу на эту тему, не так ли? - person Chris; 26.03.2013
comment
Пожалуйста. Что касается книги, может быть, позже. Вы далеко не первый, кто спрашивает об этом. - person BalusC; 26.03.2013
comment
Вы также найдете ссылку на valueChangeEvent в docs .oracle.com/javaee/6/api/javax/faces/component/UIInput.html. - person Chris; 28.03.2013