这个例子来自一本关于 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>
仍应允许使用 of:
<ui:repeat var="item" value="#{myBean.numbers}">
<h:outputText value="#{item}" converter="conditionalConverter"/>
</ui:repeat>
有没有更多的“Facelets 方式”来做到这一点(并且仍然需要使用<c:forEach>
)?
更新:
而不是<c:if>
仍然可以使用 eg<h:outputPanel>
和它的rendered
-attribute,但仍然没有 Java-less 替代fn:toUpperCase()
.
我要求仅用于学习目的。我认为<ui:repeat>
带有转换器的解决方案是最干净的,并且最能代表 JSF 应该如何使用。你也这么认为吗?