【问题标题】:How to display different values from different object types in a single dataTable?如何在单个数据表中显示来自不同对象类型的不同值?
【发布时间】:2011-09-13 04:43:38
【问题描述】:

我有一个对象(票证),它有一个其他对象的列表(消息)。 Message 是抽象的,并且有几个子类——如 EditMessage、CreationMessage 等。因此,Ticket 对象包含这些消息的混合,并且它们按创建时间排序。

现在我想在 Facelets 页面中显示所有这些消息,并且需要输出特定于该消息类型的字段值:即 EditMessage 中的已编辑字段,CreationMessage 中的用户名,...

最明显的方式似乎是使用 h:dataTable:

<h:dataTable value="#{ticketController.ticket.messages}" var="msg" >
    // determine type of message, cast, and use <c:if> to output needed values
</h:dataTable>

问题在于 Facelets 表达式语言没有“instanceof”和强制转换。据我所知,这可以通过一些丑陋的往返托管 bean、确定标准 Java 中的消息类型、返回所需类型的消息等来解决。

有没有更好、更易理解、更简洁的方法?


解决方案

我的主要问题是 标签。原来它是一个JSTL标签,所以它有略有不同的渲染生命周期。而不是它,我现在使用 及其“rendered”属性。

一些代码:

<h:dataTable value="#{ticketController.ticket.messages}" var="msg" >
    <h:column>
        <h:panelGroup rendered="#{msg.class.name == 'org.rogach.tsnt.TextMessage'}" >
            <h:outputText value="msg.text" />
        </h:panelGroup>
        <h:outputText value="#{msg.creationTime}" />
    </h:column>
</h:dataTable>

而且永远不需要演员表。

【问题讨论】:

  • 这正是我现在正在做的事情。所以我也对答案感兴趣。
  • JSTL 在 JSF 视图构建期间运行。基本上,JSTL 产生 JSF。这不仅仅是“略有不同”。在渲染响应期间,它是一个生成 HTML 的 JSF。顺便提一下类似的问题:stackoverflow.com/questions/4166247/…
  • 你可以把渲染直接放在outputText上
  • @Cosmin Vacaroiu - 是的。但是 h:panelGroup 更好,因为它允许我在其中放置任意数量的组件并一次控制它们的渲染。
  • 是的,但我认为它会在 html 中为您呈现一个额外的 div,这可能会搞砸您的样式。

标签: java jsf facelets java-ee-6


【解决方案1】:

比较对象类的名称,而不是 instanceof
说: &lt;c:if test="${xxx.class.name == 'CreationMessage'}"&gt; 或 c:选择
而且你不需要任何 EL 演员表。如果对象没有您指定的某些属性,它将给出异常,如果确实有,则可以。

【讨论】:

  • 谢谢!但是类名有问题——它拒绝同意,就是那个类。有趣的是,我在前一行输出了类的名称,三次检查它,但 #{msg.class.name == 'org.rogach.tsnt.CreationMessage'} 仍然返回 false。
  • eq ?而不是 == 尝试输出 #{msg.class.name} 以查看它到底是什么。
  • 等等,这很有趣! #{msg.class.name == 'org.rogach.tsnt.CreationMessage'} 单独打印,但 未打印。
  • 可能是混合 jstl - jsf 的问题。见onjava.com/pub/a/onjava/2004/06/09/jsf.html
  • 是的,看起来像那样。文章说“ 可能包含 JSF 组件自定义操作,但前提是为嵌套的 JSF 组件操作设置了 id 属性”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多