如何将参数化消息格式与 JSF 组件的非值属性一起使用



>我有一些用例,我必须使用资源包在UI上显示各种文本。其中一些资源包条目需要参数(例如{0}),对于这些,我使用 h:outputFormat,但有时这还不够。

例如

someMessage=Display this message with param {0}

在资源包中。

要在 xhtml 上显示它,我通常会这样做:

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

当它是一个简单的案例时,这很有效,但对于更复杂的用例来说,这还不够。例如,如果我希望命令链接的"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 不允许孩子。

即使有一个技巧可以绕过这一点(例如,使用来自素数的悬停组件),还有其他字段可能需要参数化消息。

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

您可以为此创建自定义 EL 函数,最终可以像:

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

您可以使用MessageFormat API 来执行作业,就像<h:outputFormat>幕后所做的那样。

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

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

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

最新更新