编程语言
首页 > 编程语言> > java-如何在单个dataTable中显示来自不同对象类型的不同值?

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

作者:互联网

我有一个对象(票证),其中有其他对象(消息)的列表.消息是抽象的,并且具有几个子类-例如EditMessage,CreationMessage等.因此,票证对象包含这些消息的混合,并且按其创建时间对其进行排序.

现在我想在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中消息的类型,返回所需类型的消息等来解决.

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

我的主要问题是< c:if>标签.原来,这是一个JSTL标签,因此它的渲染生命周期略有不同.取而代之的是,我现在使用< h:panelGroup>及其“已渲染”属性.

一些代码:

<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进行任何转换.如果对象没有您指定的属性,它将给出一个异常,如果它具有确定的话.

标签:jsf,java-ee-6,facelets,java
来源: https://codeday.me/bug/20191208/2090408.html