Пакет сообщений периодически не отображается правильно - PullRequest
0 голосов
/ 09 марта 2012

В моем приложении я пытаюсь получить ярлыки из пакета сообщений. Однако вместо того, чтобы использовать значения ключей констант, я использую переменные

<c:forEach var="emailAddress" items="${emailAddresses}">
...
<c:set var="labelKey" value="Contact_Label_${emailAddress.type}"/>
...
<h:outputText value="#{faces_translations[labelKey]}"/>
...
</c:forEach>

В большинстве случаев это работает правильно, но очень часто, когда страница загружены некоторые метки не обрабатываются правильно и следующие сообщение отображается:

???Contact_Label_???

Похоже, что email.type не возвращает значение, однако я добавил несколько код отладки для распечатки значения email.type, включая

${emailAddress.type}

и увидел, что возвращено значение.

Еще одна вещь, которую я пытался, это удалять значение каждый раз перед установкой снова внутри цикла, используя. Это привело к следующему исключение. Я подтвердил, что у меня есть библиотека тегов, включенная в файл WAR (jstl-api-1.2.jar и jstl-impl-1.2.jar, а также javax.faces-2.1.7).

<c:remove> Tag Library supports namespace: http://java.sun.com/jsp/jstl/core,
but no tag was defined for name: remove

Обе эти проблемы действительно сбивают с толку. Этикетка работает большую часть времени, но не последовательно. Тег определен во включенной библиотеке, но не может быть найден.

Заранее спасибо за любые указатели.

1 Ответ

1 голос
/ 11 марта 2012

Компоненты пользовательского интерфейса JSF и обработчики тегов, такие как JSTL, не работают синхронно.JSTL запускается, когда должно быть построено представление JSF.В результате получается дерево компонентов JSF без любых обработчиков тегов, таких как <c:xxx> и <f:xxx>.Компоненты пользовательского интерфейса JSF запускаются, когда представлению JSF необходимо сгенерировать HTML-код для ответа HTTP.Одно и то же представление JSF может многократно использоваться в последующих HTTP-запросах, если вы взаимодействуете с одним и тем же представлением, возвращая null или void для действий POST (например, как вы должны использовать компонент @ViewScoped).Неверно, что теги JSTL выполняются при каждом HTTP-запросе.Скорее всего, в вашем случае все пошло не так.

Скорее используйте компоненты пользовательского интерфейса JSF, если вы хотите иметь согласованное поведение во время рендеринга при повторном использовании одного представления.Вашу конструкцию можно заменить следующим образом:

<ui:repeat var="emailAddress" value="#{emailAddresses}">
    ...
    <ui:param name="labelKey" value="Contact_Label_#{emailAddress.type}" />
    ...
    <h:outputText value="#{faces_translations[labelKey]}" />
    ...
</ui:repeat>

См. Также:

...