如何在单个数据表中显示来自不同对象类型的不同值?

Posted

技术标签:

【中文标题】如何在单个数据表中显示来自不同对象类型的不同值?【英文标题】: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。顺便提一下类似的问题:***.com/questions/4166247/… 你可以把渲染直接放在outputText上 @Cosmin Vacaroiu - 是的。但是 h:panelGroup 更好,因为它允许我在其中放置任意数量的组件并一次控制它们的渲染。 是的,但我认为它会在 html 中为您呈现一个额外的 div,这可能会搞砸您的样式。 【参考方案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 属性”。

以上是关于如何在单个数据表中显示来自不同对象类型的不同值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 数据库存储不同类型的值(在单个字段中或模拟为单个字段)

如何让单个接口返回不同的数据类型?

如何针对单个应用程序对来自不同领域的用户进行身份验证?

单个 fetchedResultsController 中的不同实体类型?

如何在单个 python 数组中连接不同类型的特征?

在STM32的单个CAN消息中发送不同的数据类型数据