【发布时间】:2013-08-01 11:49:39
【问题描述】:
这个例子来自一本关于 JSF 的书。练习是重构以下 Facelets 代码,同时消除 <c:if> 和 fn:toUpperCase()。允许使用<c:forEach>。
#{myBean.numbers} 返回String["one","two","three"]
由于这本书是关于 JSF 而不是 Java,所以我想现有的 Java 代码不会被触及。但我想不出另一种方法来仅在 Facelets 中做到这一点。
<c:forEach var="item" items="#{myBean.numbers}">
<c:if test="#{not fn:endsWith(item,'o')}">
#{item}
</c:if>
<c:if test="#{fn:endsWith(item,'o')}">
#{fn:toUpperCase(item)}
</c:if>
</c:forEach>
我唯一能想到的是使用有条件地使用String#toUpperCase() 的转换器,然后我仍然不明白为什么仍然应该允许使用<c:forEach>:
<ui:repeat var="item" value="#{myBean.numbers}">
<h:outputText value="#{item}" converter="conditionalConverter"/>
</ui:repeat>
是否有更多的“Facelets 方式”来做到这一点(仍然需要使用<c:forEach>)?
更新:
而不是<c:if>,仍然可以使用例如<h:outputPanel> 是 rendered-attribute,但仍然没有 Java-less 替代 fn:toUpperCase()。
我要求仅用于学习目的。我想带有转换器的<ui:repeat>-解决方案是最干净的,并且最能代表应该如何使用 JSF。你也这么认为吗?
【问题讨论】: