Проблема жизненного цикла JSF: дерево компонентов строится до применения атрибутов запроса - PullRequest
1 голос
/ 25 июля 2011

У меня есть вид лица JSF 2.0, содержащий форму поиска, пользовательский интерфейс: повтор для отображения результатов и пейджер.Он поддерживается бином запроса.Форма сообщения состоит из текущей страницы и критериев поиска.Пейджер показывает ссылки на следующую и предыдущую страницы в зависимости от позиции в наборе данных и количества результатов запроса с критериями поиска из формы.Таким образом, дерево компонентов зависит от атрибутов запроса.Например, я использую атрибут рендеринга на следующей странице, например,

<h:commandLink action="#{listBean.nextPage}" rendered="#{listBean.hasNextPage}" >...

Когда пользователь нажимает эту ссылку, запрос POST содержит текущую страницу и критерии поиска.Проблема в том, что дерево компонентов уже встроено в RESTORE_VIEW.В настоящий момент, поскольку атрибуты запроса еще не применены, я не могу сказать, на какой странице находится пользователь в данный момент или сколько записей в наборе данных, потому что у меня нет критериев поиска.Таким образом, listBean.hasNextPage оценивается как ложный на этом этапе.Это кажется причиной того, что CommandLink исчезает из дерева компонентов.После APPLY_REQUEST_VALUES я могу составить запрос на подсчет.С этой информацией и текущей страницей я мог бы вычислить listBean.hasNextPage.Тем не менее, кажется, что он не будет оценен снова, пока RENDER_RESPONSE.Действие не вызывается в INVOKE_APPLICATION вообще.Также нет ошибки, что раздражает.

Работает при замене отрисовки на c: if.c: if оценивается только в RENDER_RESPONSE один раз, а компонент находится в дереве на первых этапах по умолчанию.Мне это не очень нравится, потому что в (редком, допустимом) количестве наборов данных меняется, так что на самом деле следующей страницы нет, она все равно будет вызывать действие, и пользователь окажется на недопустимой странице.Также я понимаю, что использование JSTL-тегов в Facelets не рекомендуется.Я не знаю, почему.

Есть ли какая-нибудь хитрость, чтобы сделать задержку оценки отложенной до APPLY_REQUEST_VALUES?Должен быть способ использовать этот атрибут в свойствах, которые зависят от текущего запроса.К вашему сведению, это приложение с портлетами 2.0 на Liferay с мостом портлетов JBoss, но я думаю, что это общая проблема JSF.

Заранее спасибо за любые ответы.Надеюсь, я просто что-то упускаю из виду, я все еще изучаю JSF - не сложно написать пейджер, верно: -)

1 Ответ

2 голосов
/ 25 июля 2011

Из вашего описания кажется, что вам нужен новый набор данных в начале нового запроса (обратной передачи), но это не так.

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

Самый простой способ добиться этого - сделать бэк @ViewScoped и сохранить ссылку на набор данных через переменную экземпляра.После обратной передачи JSF автоматически сохранит «старый» набор данных и будет использовать его для первой части жизненного цикла.Затем в INVOKE_APPLICATION у вас есть все данные для загрузки вашей следующей страницы и, таким образом, установите «новый» набор данных и логическое значение для hasNextPage.

RENDER_RESPONSE произойдет с новыми значениями и отобразитновая страница.

...