JSF <h:outputFormat>: используйте значения массива в качестве параметров

На моей странице JSF2 я использую интернационализировавшие сообщения об ошибках.

В моем бобе поддержки я помещаю сообщения в Объем флэш-памяти:

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

На странице эта строка переводится этот путь:

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

Хорошо работает.

ТЕПЕРЬ я хочу также смочь поместить (произвольное число) параметры в текст сообщения, который вставляется в заполнителей в i18n-свойстве в моем message.properties. Поэтому я помещаю параметры как Массив строк в Объем Flash, как это:

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

Теперь я также хочу смочь использовать этот Массив строк в качестве параметров для 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>

К сожалению, значение параметрического усилителя проигнорировано, и заполнители i18n-свойства не заменяются, таким образом, представленный вывод Welcome, {0} {1}. При использовании "обычного" повторителя, отображении элементов массива так же, как outputtext, это работает. Таким образом, тег outputFormat, кажется, не поддерживает использование повторения как ребенок. Чертовски, так близко ;) Кто-либо знает хороший способ сделать то, что я хочу, или есть ли какая-либо библиотека компонентов, поддерживающая что-то как этот?

6
задан Ingo Fischer 16 July 2010 в 12:38
поделиться

1 ответ

Проблема в том, что ui: repeat - это дочерний элемент времени рендеринга h: outputFormat , который он действительно вообще не поддерживает. Вы хотите поместить несколько элементов f: param непосредственно в качестве дочерних элементов h: outputFormat во время сборки.

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>
8
ответ дан 16 December 2019 в 21:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: