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 的“标题”属性使用上述资源包条目:

    <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 中的悬停组件),也有其他字段可能需要参数化消息。

有谁知道使用 MessageFormat 的方法,该方法在 JSF 组件的非值字段中接受参数?

4

1 回答 1

9

您可以为此创建一个自定义 EL 函数,最终可以像这样结束:

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

您可以使用MessageFormatAPI 来执行这项工作,就像在<h:outputFormat>幕后所做的那样。

另一种方法是创建一个自定义组件,该组件与 JSTL 的 good 'ol 一样<fmt:message>,它支持var将格式化消息导出到 EL 范围的属性。

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

更新:JSF 实用程序库OmniFaces具有用于此目的的#{of:formatX()}功能和<o:outputFormat>组件。

于 2012-08-17T17:13:26.313 回答