Метод JSF для f: event preRenderView, вызываемый после c: forEach - PullRequest
7 голосов
/ 16 ноября 2011

Я делаю страницу с jsf 2.0, и я хочу сделать что-то вроде этого:

<f:metadata>
    <f:viewParam name="id" value="${id}" />
    <f:event type="preRenderView" listener="#{controller.initPage(id)}"/>
</f:metadata>
....(Some code)....
<c:forEach items="#{bean.listLoadedByInitPage}" var="var">
    #{var.something}
</c:forEach>

Метод initPage (id) должен загрузить список в bean-компоненте.Но кажется, что метод вызывается после, чем c: forEach загружает элементы не раньше.Есть идеи?

1 Ответ

12 голосов
/ 16 ноября 2011

JSTL-теги выполняются во время просмотра сборки времени. <f:event type="preRenderView"> запускается непосредственно перед просмотром рендеринга времени. Другими словами, <c:forEach> запускается до <f:event>. Итак, такое поведение вполне ожидаемо.

У вас есть 2 варианта:

  1. Используйте @ManagedProperty вместо <f:viewParam>, или когда бин находится в области видимости или шире, захватите его вручную из ExternalContext#getRequestParameterMap() внутри @PostConstruct. И используйте @PostConstruct вместо <f:event type="preRenderView">. Да, это делает весь <f:metadata> устаревшим. Вы можете безопасно удалить его.

  2. Используйте компонент JSF вместо тега <c:forEach>, например <ui:repeat>.

Смотри также:

...