ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-12-08 09:13:29  阅读:313  来源: 互联网

标签:jsf java-ee-6 facelets java


我有一个对象(票证),其中有其他对象(消息)的列表.消息是抽象的,并且具有几个子类-例如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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有