【发布时间】:2011-09-13 04:43:38
【问题描述】:
我有一个对象(票证),它有一个其他对象的列表(消息)。 Message 是抽象的,并且有几个子类——如 EditMessage、CreationMessage 等。因此,Ticket 对象包含这些消息的混合,并且它们按创建时间排序。
现在我想在 Facelets 页面中显示所有这些消息,并且需要输出特定于该消息类型的字段值:即 EditMessage 中的已编辑字段,CreationMessage 中的用户名,...
最明显的方式似乎是使用 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>
而且永远不需要演员表。
【问题讨论】:
-
这正是我现在正在做的事情。所以我也对答案感兴趣。
-
JSTL 在 JSF 视图构建期间运行。基本上,JSTL 产生 JSF。这不仅仅是“略有不同”。在渲染响应期间,它是一个生成 HTML 的 JSF。顺便提一下类似的问题:stackoverflow.com/questions/4166247/…
-
你可以把渲染直接放在outputText上
-
@Cosmin Vacaroiu - 是的。但是 h:panelGroup 更好,因为它允许我在其中放置任意数量的组件并一次控制它们的渲染。
-
是的,但我认为它会在 html 中为您呈现一个额外的 div,这可能会搞砸您的样式。
标签: java jsf facelets java-ee-6