У меня есть представление Facelets JSF 2.0, содержащее форму поиска, ui:repeat для отображения результатов и пейджер. Он поддерживается bean-компонентом запроса. Сообщение формы состоит из текущей страницы и критериев поиска. Пейджер показывает ссылки на следующую и предыдущую страницы в зависимости от позиции в наборе данных и количества результатов запроса с критериями поиска из формы. Таким образом, дерево компонентов зависит от атрибутов запроса. Например, я использую атрибут rendered для ссылки на следующую страницу, как это
<h:commandLink action="#{listBean.nextPage}" rendered="#{listBean.hasNextPage}" >...
Когда пользователь щелкает эту ссылку, запрос POST содержит текущую страницу и критерии поиска. Проблема в том, что дерево компонентов уже построено в RESTORE_VIEW. В данный момент, поскольку атрибуты запроса еще не применены, я не могу ни сказать, на какой странице в данный момент находится пользователь, ни сколько записей находится в наборе данных, потому что у меня нет критериев поиска. Итак, на этом этапе listBean.hasNextPage оценивается как false. Кажется, это приводит к тому, что CommandLink исчезает из дерева компонентов. После APPLY_REQUEST_VALUES я могу построить свой запрос на подсчет. Имея эту информацию и текущую страницу, я мог вычислить listBean.hasNextPage. Однако, похоже, он не будет снова оцениваться до RENDER_RESPONSE. Действие вообще не вызывается в INVOKE_APPLICATION. Также нет ошибки, что раздражает.
Это работает при замене rendered на c:if. c:if оценивается в RENDER_RESPONSE только один раз, и по умолчанию компонент находится в дереве на первых этапах. Мне это не очень нравится, потому что в (редком, допустимом) случае, когда количество наборов данных изменяется так, что следующей страницы фактически нет, это все равно вызовет действие, и пользователь окажется на нелегальной странице. Также я понимаю, что использование тегов JSTL в Facelets обычно не рекомендуется. Я не знаю почему.
Есть ли какой-нибудь трюк, чтобы отложить оценку до APPLY_REQUEST_VALUES? Должен быть способ использовать этот атрибут для свойств, зависящих от текущего запроса. Просто к вашему сведению, это приложение с портлетом 2.0 на Liferay с мостом портлета JBoss, но я думаю, что это общая проблема JSF.
Заранее спасибо за любые ответы. Надеюсь, я просто что-то упускаю из виду, я все еще изучаю JSF - мне не так сложно написать пейджер, верно :-)