0

使用 JSF2 标记,是否可以将属性参数传递给按钮值?我知道<h:outputFormat>标签,但我需要它是一个按钮。我对以下内容更感兴趣。

我的 XHTML 代码:

<h:button value="#{webCommonMessages['notifications']}" outcome="...">
    <f:param value="1"/>
</h:button>

我的 webCommonMessages 包:

notifications=Notifications available: ({0})

这当然行不通,但是有什么解决方案/解决方法吗?

4

1 回答 1

2

不幸的是,JSF 没有提供内置功能来获得你想要的东西,所以基本上你有三种方法可以去:

  1. 创建自定义 EL 函数以获取替换值,如将参数传递给消息从资源包到h:outputFormat以外的组件中所述,
  2. 创建一个自定义组件,将替换值导出为 EL 上下文中可见的请求范围变量,如如何使用带有 JSF 组件的非值属性的参数化消息格式
  3. 使用由 BalusC 维护的实用程序库OmniFaces<o:outputFormat>中提出的解决方案,按照有效结合自身的组件以第二种方式。

所以,如果你达到我个人强烈推荐的第三种方式,解决方案基本上如下:

<o:outputFormat value="#{webCommonMessages['notifications']}" var="t">
    <f:param value="1" />
</o:outputFormat>
<h:button value="#{t}" outcome="..." />

在 JSF 项目中使用 OmniFaces 非常简单,并且在其主页上进行了描述,但重复一遍:只需将其 jar 添加到 Web 应用程序的 /WEB-INF/lib 文件夹(或将其作为 maven 依赖项包含)并添加适当的命名空间在您的 facelet 视图中,例如xmlns:o="http://omnifaces.org/ui".

还值得补充的是,我最初的答案是错误的。它错误地认为嵌套 JSF<h:outputFormat>将呈现必要的 HTML 元素。尽管如此,对于一个普通的导航链接来说也是如此,例如在 JSF 中由 , 提供的<h:link>,并且可以像这样使用:

<h:link outcome="...">
    <h:outputFormat value="#{webCommonMessages['notifications']}">
        <f:param value="1" />
    </h:outputFormat>
</h:link>

您错误地认为<f:param>嵌套在<h:button>将被合并到来自资源包的消息中。它用于将查询参数附加到生成的 URL。相反,您需要将<h:outputFormat>标签用于嵌套在按钮中的目的,因此无需指定其value属性:

<h:button outcome="...">
    <h:outputFormat value="#{webCommonMessages['notifications']}">
        <f:param value="1" />
    </h:outputFormat>
</h:button>
于 2013-07-30T12:31:16.147 回答