10

UIにさまざまなテキストを表示するためにリソースバンドルを使用する必要があるユースケースがあります。これらのリソースバンドルエントリの一部はパラメータを取ります(例:{0})。これらにはh:outputFormatを使用しますが、それだけでは不十分な場合があります。

例えば

someMessage=Display this message with param {0}

リソースバンドル内。

xhtmlに表示するには、通常、次のようにします。

<h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat>

これは単純なケースではうまく機能しますが、より複雑なユースケースでは十分ではありません。たとえば、commandLinkの「title」属性で上記のリソースバンドルエントリを使用する場合は、次のようになります。

    <h:commandLink action="logout" title="#{msg['someMessage']}">
        <f:param value="#{someBean.value}" />
        <h:graphicImage library="images" name="image.png" />
    </h:commandLink>

これは機能しません。私も試しました:

    <h:commandLink action="logout">
        <f:attribute name="title">
            <h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat>
        </f:attribute>
        <h:graphicImage library="images" name="image.png" />
    </h:commandLink>

f:attibuteは子を許可しないため、これも機能しません。

これを回避するためのハックがある場合でも(たとえば、primefacesからホバーコンポーネントを使用する場合)、パラメーター化されたメッセージを必要とする可能性のある他のフィールドがあります。

JSFコンポーネントの非値フィールドで引数を取るMessageFormatを使用する方法を知っている人はいますか?

4

1 に答える 1

9

このためのカスタム EL 関数を作成して、最終的に次のようにすることができます。

<h:commandLink ... title="#{my:format(msg['someMessage'], someBean.value)}" />

MessageFormatAPI を使用して、裏<h:outputFormat>で行っているのとまったく同じようにジョブを実行できます。

別の方法は、フォーマットされたメッセージを EL スコープにエクスポートする属性を<fmt:message>サポートするJSTL の優れたコンポーネントと同じことを行うカスタム コンポーネントを作成することです。var

<my:outputFormat ... var="linkTitle">
    ...
</my:outputFormat>
<h:commandLink ... title="#{linkTitle}" />

更新: JSF ユーティリティ ライブラリOmniFacesには、まさにその目的のための#{of:formatX()}関数とコンポーネントがあります。<o:outputFormat>

于 2012-08-17T17:13:26.313 に答える