Частичный рендеринг избыточного вызова метода

Я знаю, что JSF может вызывать метод управляемого компонента пару раз, даже если он вызывается только один раз в .xhtml. Я понимаю, что это связано с методами encode*.

Я хотел бы попросить Вас объяснить мне следующий случай. У меня есть файл JSF, который выглядит так:

<h:form id="form1">
    <h:panelGroup id="output">
        ...
        <h:commandLink...>
            <f:ajax render=":form1:output"/>
        </h:commandLink>
    </h:panelGroup>
</h:form>

Пока все ясно; нажатие командной ссылки перерисовывает часть страницы в форме panelGroup. Код следующий:

<ui:repeat value="#{movieBean.categories}" var="category">
    <li>
        <h:outputLink value="index.xhtml">
            <f:param name="categoryId" value="#{category.categoryId}"/>
            <h:outputText value="#{category.description}"/>
        </h:outputLink>
    </li>
</ui:repeat>

#{movieBean.categories} //this is just a 'test line'

movieBean ограничен запросом.

Теперь, когда я захожу на страницу в первый раз, я получаю два вызова movieBean.categories. Это понятно, потому что он вызывается дважды в коде. Однако, когда я нажимаю ссылку AJAX, отображающую только часть страницы (вывод), я снова вызываю movieBean.categories из <ui:repeat>, даже если он находится за пределами частично отображаемой области страницы. «Тестовая линия» на этот раз не вызывается.

Я провел еще один тест. Я удалил тег <ui:repeat>, оставив только «тестовую строку». Частичный рендеринг AJAX не вызывает его, как раньше.

Что делает вызов movieBean.categories внутри тега <ui:repeat> отличным от вызова в «тестовой строке»? И почему вызов внутри <ui:repeat> выполняется при нажатии на ссылку AJAX, хотя она находится за пределами частично отображаемого тега <h:panelGroup id="output"/>?


person Dzik    schedule 16.12.2011    source источник
comment
Пожалуйста, ознакомьтесь с правилами форматирования сообщений в справке (?) редактора сообщений. Экранирование тегов HTML неуклюже и абсолютно не нужно :)   -  person BalusC    schedule 16.12.2011
comment
Я не уверен, почему вы беспокоитесь об этом, поскольку вызовы геттера чрезвычайно дешевы, но если это происходит потому, что ваш геттер не просто геттер, а делает гораздо больше, чем просто возвращает данные, тогда, пожалуйста, прочитайте это: stackoverflow.com/questions/2090033/   -  person BalusC    schedule 16.12.2011
comment
getCategories извлекает данные из базы данных. Размещение в @PostConstruct сильно изменит, поскольку мой bean-компонент находится в области запроса, и AJAX создаст его снова. Я думал, что этот частичный рендеринг не вызовет getCategories, поскольку он не находится в области рендеринга. Впрочем, это не проблема. Я просто хотел знать, почему это происходит, и получил ответ ниже.   -  person Dzik    schedule 16.12.2011
comment
Спасибо за ссылку. Я тщательно проверю.   -  person Dzik    schedule 16.12.2011


Ответы (1)


Я почти уверен, что «избыточный» вызов выполняется на этапе, когда JSF перестраивает дерево элементов для хранения данных POST в соответствующих элементах.

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

person DRCB    schedule 16.12.2011
comment
Спасибо за ответ. Думаю, мне придется более внимательно изучить все этапы JSF. - person Dzik; 16.12.2011
comment
Я видел аналогичную ситуацию, когда ui:repeat, казалось, обрабатывался, несмотря на то, что он не был частью частичной обработки или частичного рендеринга. Если это перестроение дерева элементов для хранения потенциальных данных, то это объясняет некоторые вещи. - person brantgurga; 18.02.2013