我正在用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 之前加载项目。有什么想法吗?
答案 0 :(得分:12)
JSTL标记在查看构建期间运行。 <f:event type="preRenderView">
在查看呈现时间之前运行。换句话说,<c:forEach>
在<f:event>
之前运行。所以,这种行为是完全可以预期的。
您有两个选择:
使用@ManagedProperty
代替<f:viewParam>
,或者当bean位于视图范围内或更广泛时,请从ExternalContext#getRequestParameterMap()
内的@PostConstruct
手动获取。并且,使用@PostConstruct
代替<f:event type="preRenderView">
。是的,这会使整个<f:metadata>
过时。您可以安全地将其删除。
使用JSF组件而不是<c:forEach>
标记,例如<ui:repeat>
。