Сообщения приложений могут содержать любые строки, отображаемые пользователю, а также настраиваемые сообщения об ошибках (которые отображаются тегами message
и messages
) для ваших кастомных конвертеров или валидаторов. Чтобы сделать сообщения доступными во время запуска приложения, выполните одно из следующих действий:
-
Программно поставьте отдельное сообщение в очередь объекта javax.faces.context.FacesContext
, как описано в Использование FacesMessage для создания сообщения
-
Зарегистрируйте все сообщения в вашем приложении, используя файл конфигурации приложения.
Вот раздел файла faces-config.xml
, в котором регистрируются сообщения для программы Duke's Bookstore:
<application>
<resource-bundle>
<base-name>
javaeetutorial.dukesbookstore.web.messages.Messages
</base-name>
<var>bundle</var>
</resource-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>es</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
</application>
Этот набор элементов вызывает заполнение приложения сообщениями, содержащимися в указанном bundle-ресурсе.
Элемент resource-bundle
представляет набор локализованных сообщений. Он должен содержать полный путь к bundle-ресурсу, содержащему локализованные сообщения (в этом случае dukesbookstore.web.messages.Messages
). Элемент var
определяет имя EL, под которым авторы страниц ссылаются на bundle-ресурс.
Элемент locale-config
перечисляет локаль по умолчанию и другие поддерживаемые локали. Элемент locale-config
позволяет системе найти правильную локаль на основе языковых настроек браузера.
Теги supported-locale
и default-locale
принимают двухсимвольные коды в нижнем регистре, определённые ISO 639-1 (см. http://www.loc.gov/standards/iso639-2/php/English_list.php
). Убедитесь, что bundle-ресурс действительно содержит сообщения для локалей, указанных с помощью этих тегов.
Чтобы получить доступ к локализованному сообщению, разработчик приложения просто ссылается на ключ сообщения из bundle-ресурса.
Можно извлечь локализованный текст в тег alt
для графического изображения, как в следующем примере:
<h:graphicImage id="mapImage"
name="book_all.jpg"
library="images"
alt="#{bundle.ChooseBook}"
usemap="#bookMap" />
Атрибут alt
может принимать выражения значений. В этом случае атрибут alt
относится к локализованному тексту, который будет включён в альтернативный текст изображения, представленного этим тегом.
Использование FacesMessage для создания сообщения
Вместо регистрации сообщений в файле конфигурации приложения вы можете получить доступ к java.util.ResourceBundle
напрямую из кода Managed-бина. Фрагмент кода ниже находит сообщение об ошибке электронной почты:
String message = "";
...
message = ExampleBean.loadErrorMessage(context,
ExampleBean.EX_RESOURCE_BUNDLE_NAME,
"EMailError");
context.addMessage(toValidate.getClientId(context),
new FacesMessage(message));
Эти строки вызывают метод loadErrorMessage
бина для получения сообщения из ResoureBundle
. Вот метод loadErrorMessage
:
public static String loadErrorMessage(FacesContext context,
String basename, String key) {
if ( bundle == null ) {
try {
bundle = ResourceBundle.getBundle(basename,
context.getViewRoot().getLocale());
} catch (Exception e) {
return null;
}
}
return bundle.getString(key);
}
Ссылки на сообщения об ошибках
Сообщения об ошибках, к которым имеют доступ эти теги, включают
-
Стандартные сообщения об ошибках, которые сопровождают стандартные конвертеры и валидаторы, которые поставляются с API. (см. раздел 2.5.2.4 спецификации JavaServer Faces для получения полного списка стандартных сообщений об ошибках)
-
Кастомные сообщения об ошибках, содержащиеся в bundle-ресурсах, зарегистрированных в приложении архитектором приложения с помощью элемента resource-bundle
в файле конфигурации
Когда конвертер или валидатор зарегистрирован в компоненте ввода, соответствующее сообщение об ошибке автоматически ставится в очередь на компоненте.
Автор страницы может переопределить сообщения об ошибках, поставленные в очередь в компоненте, используя следующие атрибуты тега компонента:
-
converterMessage
: ссылается на сообщение об ошибке, которое отображается, когда данные на содержащем его компоненте не могут быть преобразованы конвертером, зарегистрированным в этом компоненте.
-
requiredMessage
: ссылается на сообщение об ошибке, которое будет отображаться, если в содержащий его компонент не было введено никакого значения.
-
validatorMessage
: ссылается на сообщение об ошибке, которое отображается, когда данные содержащего его компонента выдают ошибку при проверке валидатором, зарегистрированным в этом компоненте.
Все три атрибута могут принимать реальные значения и выражения значений. Если атрибут использует выражение значения, это выражение ссылается на сообщение об ошибке в bundle-ресурсе. Этот bundle-ресурс можно сделать доступным для приложения одним из следующих способов:
-
Разработчиком приложения, использующим элемент resource-bundle
в файле конфигурации
-
Автором страницы с помощью тега f:loadBundle
И наоборот, элемент resource-bundle
должен использоваться для предоставления приложению тех bundle-ресурсов, содержащих кастомные сообщения об ошибках, которые ставятся в очередь в компоненте в результате регистрации в компоненте кастомного конвертера или валидатора.
Следующие теги показывают, как указать атрибут requiredMessage
, используя выражение значения для ссылки на сообщение об ошибке:
<h:inputText id="ccno" size="19"
required="true"
requiredMessage="#{customMessages.ReqMessage}">
...
</h:inputText>
<h:message styleClass="error-message" for="ccno"/>
Выражение значения, используемое requiredMessage
в этом примере, ссылается на сообщение об ошибке с ключом ReqMessage
в bundle-ресурсе customMessages
.
Это сообщение заменяет соответствующее сообщение, поставленное в очередь в компоненте, и будет отображаться везде, где на странице размещены теги message
или messages
.