f:事件preRenderView的JSF方法在c:forEach之后调用

use*_*204 7 jstl jsf-2

我正在用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>
Run Code Online (Sandbox Code Playgroud)

initPage(id)方法必须在bean中加载列表.但似乎该方法是在c:forEach之后调用而不是之前调用的.有任何想法吗?

Bal*_*usC 12

JSTL标记在视图构建期间运行.在<f:event type="preRenderView">运行前右视图渲染时间.换句话说,<c:forEach>之前运行<f:event>.所以,这种行为是完全可以预期的.

你有2个选择:

  1. 使用@ManagedProperty而不是<f:viewParam>,或当bean在视图范围内或更广泛时,从ExternalContext#getRequestParameterMap()内部手动抓取它@PostConstruct.并且,使用@PostConstruct而不是<f:event type="preRenderView">.是的,这使整个<f:metadata>过时了.你可以安全地删除它.

  2. 使用JSF组件而不是<c:forEach>标记,例如<ui:repeat>.

也可以看看: