gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:21 24 4
gpt4 key购买 nike

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

现在我想在 Facelets 页面中显示所有这些消息,我需要输出特定于该消息类型的字段值:即 EditMessage 中的 editedField,CreationMessage 中的 userName,...

最明显的方法似乎是使用 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标签,所以渲染生命周期 略有不同。取而代之的是,我现在使用 及其“渲染”属性。

部分代码:

<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>

而且永远不需要强制转换。

最佳答案

而不是instanceof,比较对象类的名称。
说: <c:if test="${xxx.class.name == 'CreationMessage'}">或者 c:选择
而且您不需要对 EL 进行任何转换。如果该对象没有您指定的某些属性,它将给出一个异常,如果它有它也没关系。

关于java - 如何在单个数据表中显示来自不同对象类型的不同值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6318551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com