这个例子来自于一本关于JSF的书。本文的摘录是在消除<c:if>和fn:toUpperCase()的同时重构以下Facelets代码。允许使用<c:forEach>。
#{myBean.numbers}返回String["one","two","three"]
因为这本书是关于JSF的,而不是关于Java的,我想现有的Java代码是不会被触及的。但我想不出有什么别的方法能做到这一点。
<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> one仍然可以使用例如<h:outputPanel>,它是rendered-attribute,但是仍然没有Java替代fn:toUpperCase()。
我只要求学习的目的。我认为带有转换器的<ui:repeat>-solution是最干净的,并且代表了如何使用JSF。你也这么认为吗?
发布于 2013-08-01 12:53:40
对于<c:if>,JSF替代JSTL <c:if>是任何组件上的rendered属性。例如,<h:panelGroup>或<h:outputText>。如果没有指定的attribtues,则这些组件不会生成额外的标记,这些标记应该以id或styleClass这样的HTML结尾,否则它们会生成<span>。
以下是两者的一个例子:
<h:panelGroup rendered="#{not fn:endsWith(item,'o')}">
#{item}
</h:panelGroup>
<h:outputText value="#{fn:toUpperCase(item)}" rendered="#{fn:endsWith(item,'o')}" />至于fn:toUpperCase(),JSF别无选择。我不知道为什么需要JSF替代,因为它本质上不是一个标记,而是一个简单的EL函数,它在JSTL和JSF标记中都非常有用。在任何情况下,您都可以在必要时加入CSS text-transform: uppercase。由于这完全发生在客户端,您唯一的问题可能是浏览器支持。
<h:outputText value="#{item}" style="text-transform: uppercase" />(注意:这只是一个例子,通常的做法是将样式放在自己的.css文件中,由<h:outputStylesheet>__加载)
<h:outputText value="#{item}" styleClass="uppercased" />我认为带有转换器的-solution是最干净的,并且代表了如何使用JSF。你也这么认为吗?
我非常喜欢“使用合适的工具来完成这项工作”。使用JSTL标记有条件地构建JSF组件树。使用JSF组件生成HTML。就这样。另见JSF2中的JSTL .合乎道理?
https://stackoverflow.com/questions/17993253
复制相似问题