代码之家  ›  专栏  ›  技术社区  ›  Wolkenarchitekt

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

  •  6
  • Wolkenarchitekt  · 技术社区  · 14 年前

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

    在我的backingbean中,我将消息放入flash范围:

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

    在页面上,此字符串的翻译方式如下:

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

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

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

    现在我还希望能够使用这个字符串数组作为outputFormat元素的参数,将它们插入到类似 Welcome, {0} {1} . 所以我试着用 ui:重复 :

    <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属性的占位符没有被替换,因此呈现的输出被忽略 . 当使用“常规”中继器时,将数组元素显示为outputtext,就可以了。因此outputFormat标记似乎不支持将repeat用作子级。 该死,差一点;)有人知道一个好的方法来做我想做的事情,或者有任何组件库支持这样的东西吗?

    1 回复  |  直到 14 年前
        1
  •  8
  •   BalusC    14 年前

    问题是 ui:repeat 是的渲染时间子级 h:outputFormat 它确实完全不支持。你想把多个 f:param 元素直接作为 h:输出格式 在构建期间。

    c:forEach 适合这项任务。JSTL核心标记(已经包含在Facelets中,因此您不需要安装任何额外的jar)在 建筑 视图树,就在JSF转向 视图树。

    <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>