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