这个例子来自一本关于 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 应该如何使用。你也这么认为吗?