不幸的是,JSF 没有提供内置功能来获得你想要的东西,所以基本上你有三种方法可以去:
- 创建自定义 EL 函数以获取替换值,如将参数传递给消息从资源包到h:outputFormat以外的组件中所述,
- 创建一个自定义组件,将替换值导出为 EL 上下文中可见的请求范围变量,如如何使用带有 JSF 组件的非值属性的参数化消息格式或
- 使用由 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>