【问题标题】:JSF method of f:event preRenderView called after c:forEach在 c:forEach 之后调用 f:event preRenderView 的 JSF 方法
【发布时间】:2011-12-30 16:16:38
【问题描述】:

我正在使用 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 加载项目之前调用的。有什么想法吗?

【问题讨论】:

    标签: jsf-2 jstl


    【解决方案1】:

    JSTL 标签在 view build 期间运行。 &lt;f:event type="preRenderView"&gt;view render 时间之前运行。换句话说,&lt;c:forEach&gt;&lt;f:event&gt; 之前运行。因此,这种行为是完全可以预料的。

    你有两个选择:

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

    2. 使用JSF组件代替&lt;c:forEach&gt;标签,如&lt;ui:repeat&gt;

    另见:

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 2015-06-22
      • 2012-06-19
      • 2012-02-09
      • 2014-05-13
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多