1

この例は、JSF に関する本からのものです。演習は、次の Facelets コードをリファクタリングして、<c:if>とを削除することfn:toUpperCase()です。の使用<c:forEach>が許可されます。

#{myBean.numbers}戻り値String["one","two","three"]

この本は Java ではなく JSF に関するものなので、既存の 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>eg を使用できますが<h:outputPanel>、それrenderedは -attribute ですが、Java を使用しないfn:toUpperCase().

学習目的でのみお願いしています。<ui:repeat>コンバーターを使用したソリューションが最もクリーンであり、JSF の使用方法を最もよく表していると思います。あなたもそう思いますか?

4

1 に答える 1

3

に関しては<c:if>、JSTL に代わる JSF<c:if>は、rendered任意のコンポーネントの属性です。たとえば、<h:panelGroup>または<h:outputText>. これらのコンポーネントは、idまたはのように最終的に HTML になる属性が指定されていない場合、追加のマークアップを生成しません。styleClass<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には代替手段がありません。本質的にタグではなく、JSTLタグとJSFタグの両方で完全に使用できる単純なEL関数であるため、JSFの代替が必要な理由はわかりません。いずれにせよ、必要に応じて CSS を投入できますtext-transform: uppercase。これは完全にクライアント側で行われるため、唯一の問題はブラウザのサポートかもしれません。

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

(注: これは単なる例です。通常は、スタイルを でロードする独自の.cssファイルに配置します<h:outputStylesheet>)

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

コンバーターを使用したソリューションが最もクリーンであり、JSF の使用方法を最もよく表していると思います。あなたもそう思いますか?

私は「仕事に適したツールを使用する」の大ファンです。JSTL タグを使用して、JSF コンポーネント ツリーを条件付きで構築します。JSF コンポーネントを使用して HTML を生成します。それでおしまい。JSF2 FaceletsのJSTLも参照してください...理にかなっていますか?

于 2013-08-01T12:53:40.317 に答える