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

时间:2011-11-16 17:56:33

标签: jsf-2 jstl

我正在用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 个答案:

答案 0 :(得分:12)

JSTL标记在查看构建期间运行。 <f:event type="preRenderView">查看呈现时间之前运行。换句话说,<c:forEach><f:event>之前运行。所以,这种行为是完全可以预期的。

您有两个选择:

  1. 使用@ManagedProperty代替<f:viewParam>,或者当bean位于视图范围内或更广泛时,请从ExternalContext#getRequestParameterMap()内的@PostConstruct手动获取。并且,使用@PostConstruct代替<f:event type="preRenderView">。是的,这会使整个<f:metadata>过时。您可以安全地将其删除。

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

  3. 另见: