【问题标题】:<c:foreach> tag not evaluating an object<c:foreach> 标签不评估对象
【发布时间】:2023-03-09 07:40:02
【问题描述】:

我有以下代码:

<h:outputText value="#{lecture.lectureName}" />

<c:forEach items="#{criterionController.getCriteriaForLecture(lecture)}" var="criterion">

     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>

</c:forEach>

输出文本部分工作正常并显示它应该显示的内容,因此这证明lecture 对象已设置。然而 for each 标签给出了一个空指针异常。调试代码时,看到调用getCriteriaForLecture()方法时,lecture对象被取为null。

如何解释这种行为?

【问题讨论】:

  • 尝试将c:forEach更改为ui:repeat
  • 还是一样,我又得到一个空指针异常
  • 您的托管 bean 请求或视图是否有作用域?另外,为什么要发送整个托管 bean 而不是属性?
  • 它是会话范围的。不,该方法返回一个对象列表,我计划在视图中显示一些属性。这不是应该做的吗? @LuiggiMendoza
  • @BillJames 在 JSF 1.x 中。在 JSF 2 中,您可以在 EL 中调用托管 bean 方法时传递参数。

标签: jsf foreach jstl


【解决方案1】:

如果 lecturer 变量又由 JSF 迭代组件设置,例如 &lt;h:dataTable&gt;&lt;ui:repeat&gt; 等,或者可能是 &lt;p:tabView&gt;,则可能会发生这种情况,基于您的 previous question

可以在此处找到有关此行为的更详细说明:JSTL in JSF2 Facelets... makes sense? 重要的是,JSTL 标记在构建视图期间运行,而不是在渲染视图期间运行。 lecturer 变量在您的特定情况下仅在呈现视图期间可用,因此在构建视图期间,当 JSTL 运行时始终为 null

要解决这个问题,请改用 &lt;ui:repeat&gt; 之类的普通 JSF 组件。

<ui:repeat value="#{criterionController.getCriteriaForLecture(lecture)}" var="criterion">
     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>
</ui:repeat>

在 getter 中执行业务操作会更好。只需将 List&lt;Criterion&gt; 设为 Lecture 的属性即可。

<ui:repeat value="#{lecture.criterions}" var="criterion">
     <h:outputText value="#{criterion.criterionName}"  />
     <h:commandLink value="Edit"/>
     <h:commandLink value="Delete"/>
</ui:repeat>

另见Why JSF calls getters multiple times

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2021-01-13
    • 2022-01-05
    • 2021-10-20
    相关资源
    最近更新 更多