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

标签 java jsf facelets java-ee-6

我有一个对象(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/

相关文章:

jsf - 如何根据从托管 bean 接收到的值获取资源包值?

java - 同时保留两个实体

java - 如何更改TabLayout的滑动选项卡条动画持续时间?

java - 使用 webServiceTemplate.marshalSendAndReceive 时返回 int

java - 无法使按钮对其他 Activity 不可见

java - jsf <h :dataTable> How to refresh or update dataTable with new values which are added to database

jsf - 何时对 Java JEE 项目使用客户端 Web 框架 [angularjs/bootstrap/backbone] 服务器端框架 [JSF/Struts/SpringMVC]

jsf - 在 JSF 中迭代,使用 for 每个循环渲染纯 HTML <div> 元素

jsf - 排序在 PrimeFaces 的数据表中不起作用?

java - H2数据库db文件导入