【问题标题】:Replace <c:if> and fn:toUpperCase() with JSF-tags用 JSF 标记替换 <c:if> 和 fn:toUpperCase()
【发布时间】:2013-08-01 11:49:39
【问题描述】:

这个例子来自一本关于 JSF 的书。练习是重构以下 Facelets 代码,同时消除 &lt;c:if&gt;fn:toUpperCase()。允许使用&lt;c:forEach&gt;

#{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() 的转换器,然后我仍然不明白为什么仍然应该允许使用&lt;c:forEach&gt;

<ui:repeat var="item" value="#{myBean.numbers}">
     <h:outputText value="#{item}" converter="conditionalConverter"/>
</ui:repeat>

是否有更多的“Facelets 方式”来做到这一点(仍然需要使用&lt;c:forEach&gt;)?

更新: 而不是&lt;c:if&gt;,仍然可以使用例如&lt;h:outputPanel&gt;rendered-attribute,但仍然没有 Java-less 替代 fn:toUpperCase()

我要求仅用于学习目的。我想带有转换器的&lt;ui:repeat&gt;-解决方案是最干净的,并且最能代表应该如何使用 JSF。你也这么认为吗?

【问题讨论】:

    标签: jsf-2 jstl facelets


    【解决方案1】:

    对于&lt;c:if&gt;,JSTL &lt;c:if&gt; 的JSF 替代方案是任何组件上的rendered 属性。例如,&lt;h:panelGroup&gt;&lt;h:outputText&gt;。如果没有指定应以 HTML 结尾的属性(如 idstyleClass),则这些组件不会生成额外的标记,否则它们会生成 &lt;span&gt;

    以下是两者的示例:

    <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。由于这完全发生在客户端,您唯一的问题可能是browser support

    <h:outputText value="#{item}" style="text-transform: uppercase" />
    

    (注意:这只是一个例子,通常的做法是将样式放在它自己的.css 文件中,您可以通过&lt;h:outputStylesheet&gt; 加载该文件)

    <h:outputText value="#{item}" styleClass="uppercased" />
    

    我认为带有转换器的解决方案是最干净的,并且最能代表 JSF 应该如何使用。你也这么认为吗?

    我非常喜欢“为工作使用正确的工具”。使用 JSTL 标记有条件地构建 JSF 组件树。使用 JSF 组件生成 HTML。而已。另见JSTL in JSF2 Facelets... makes sense?

    【讨论】:

    • h:panelGroup 不能替代 c:if。 h:panelGroup 在您的 html 代码中添加一个 标签,将标签分组在里面。在最好的情况下,这在您的 html 代码中是无用的废话,在其他情况下可能会出现问题
    • @Rober2D2:也许你忘了看答案的第一段?
    • 抱歉,没看过。无论如何,如果你想“更新”那个精确的部分,你必须使用一个 id。另外,您没有像 中那样的 else 条件。我将使用渲染,因为别无选择,但我仍然认为它是 JSTL 的糟糕替代品。
    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2011-07-04
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多