JSF <h:outputformat>:使用数组值作为参数</h:outputformat>

时间:2010-07-16 12:05:32

标签: jsf facelets jsf-2

在我的JSF2页面上,我正在使用国际化的错误消息。

在我的支持bean中,我将消息放入闪存范围:

flash.put("error", exception.getType());

在页面上,此字符串以这种方式翻译:

<h:outputText value="#{bundle[flash.error]}"/>

工作正常。

现在我想能够将(任意数量的)参数放入消息文本中,这些参数将被插入到message.properties中i18n属性的占位符中。因此,我将参数作为String数组放入Flash Scope中,如下所示:

//exception.getParameters returns String[]
flash.put("errorParams", exception.getParameters())

现在我还希望能够将此String数组用作outputFormat元素的参数,以将它们插入到Welcome, {0} {1}之类的属性中。 所以我尝试使用 ui:repeat

来实现这一目标
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid">
  <ui:repeat value="#{flash.errorParams}" var="_param">
    <f:param value="#{bundle[_param]}"/>
    <!-- also doesn't work: <f:param value="#{_param}"/>-->
  </ui:repeat>
</h:outputFormat>

不幸的是,param值被忽略,i18n-property的占位符没有被替换,因此渲染的输出为Welcome, {0} {1}。当使用“常规”转发器时,将数组元素显示为输出文本,它可以工作。所以outputFormat标签似乎不支持使用repeat作为子元素。 该死的,如此接近;)任何人都知道一个很好的方法来做我想要的,或者是否有任何组件库支持这样的东西?

1 个答案:

答案 0 :(得分:8)

这里的问题是ui:repeath:outputFormat的渲染时子,它确实根本不支持。您希望在构建期间直接将多个f:param元素作为h:outputFormat的子元素。

c:forEach适用于此任务。 JSTL核心标记(已经包含在Facelets中,因此您不需要安装任何额外的JAR)在构建视图树期间完成它们的工作,就在JSF转向进程之前/ render 视图树。

<html xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid">
  <c:forEach items="#{flash.errorParams}" var="_param">
    <f:param value="#{bundle[_param]}"/>
  </c:forEach>
</h:outputFormat>