我有一个对象(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 中的消息类型、返回所需类型的消息等来解决。
是否有更好、更易理解和简洁的方法来做到这一点?
解决方案
我的主要问题是
部分代码:
<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/