The Java EE 7 Tutorial
16.5 Registering Application Messages
Application messages can include any strings displayed to the user as well as custom error messages (which are displayed by the message
and messages
tags) for your custom converters or validators. To make messages available at application startup time, do one of the following:
-
Queue an individual message onto the
javax.faces.context.FacesContext
instance programmatically, as described in Using FacesMessage to Create a Message -
Register all the messages with your application using the application configuration resource file
Here is the section of the faces-config.xml
file that registers the messages for the Duke's Bookstore case study application:
<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>
This set of elements causes the application to be populated with the messages that are contained in the specified resource bundle.
The resource-bundle
element represents a set of localized messages. It must contain the fully qualified path to the resource bundle containing the localized messages (in this case, dukesbookstore.web.messages.Messages
). The var
element defines the EL name by which page authors refer to the resource bundle.
The locale-config
element lists the default locale and the other supported locales. The locale-config
element enables the system to find the correct locale based on the browser's language settings.
The supported-locale
and default-locale
tags accept the lowercase, two-character codes defined by ISO 639-1 (see http://www.loc.gov/standards/iso639-2/php/English_list.php
). Make sure that your resource bundle actually contains the messages for the locales you specify with these tags.
To access the localized message, the application developer merely references the key of the message from the resource bundle.
You can pull localized text into an alt
tag for a graphic image, as in the following example:
<h:graphicImage id="mapImage" name="book_all.jpg" library="images" alt="#{bundle.ChooseBook}" usemap="#bookMap" />
The alt
attribute can accept value expressions. In this case, the alt
attribute refers to localized text that will be included in the alternative text of the image rendered by this tag.
16.5.1 Using FacesMessage to Create a Message
Instead of registering messages in the application configuration resource file, you can access the java.util.ResourceBundle
directly from managed bean code. The code snippet below locates an email error message:
String message = ""; ... message = ExampleBean.loadErrorMessage(context, ExampleBean.EX_RESOURCE_BUNDLE_NAME, "EMailError"); context.addMessage(toValidate.getClientId(context), new FacesMessage(message));
These lines call the bean's loadErrorMessage
method to get the message from the ResourceBundle
. Here is the loadErrorMessage
method:
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); }
16.5.2 Referencing Error Messages
A JavaServer Faces page uses the message
or messages
tags to access error messages, as explained in Displaying Error Messages with the h:message and h:messages Tags.
The error messages these tags access include
-
The standard error messages that accompany the standard converters and validators that ship with the API. (see Section 2.5.2.4 of the JavaServer Faces specification for a complete list of standard error messages)
-
Custom error messages contained in resource bundles registered with the application by the application architect using the
resource-bundle
element in the configuration file
When a converter or validator is registered on an input component, the appropriate error message is automatically queued on the component.
A page author can override the error messages queued on a component by using the following attributes of the component's tag:
-
converterMessage
: References the error message to display when the data on the enclosing component cannot be converted by the converter registered on this component. -
requiredMessage
: References the error message to display when no value has been entered into the enclosing component. -
validatorMessage
: References the error message to display when the data on the enclosing component cannot be validated by the validator registered on this component.
All three attributes are enabled to take literal values and value expressions. If an attribute uses a value expression, this expression references the error message in a resource bundle. This resource bundle must be made available to the application in one of the following ways:
-
By the application architect using the
resource-bundle
element in the configuration file -
By the page author using the
f:loadBundle
tag
Conversely, the resource-bundle
element must be used to make available to the application those resource bundles containing custom error messages that are queued on the component as a result of a custom converter or validator being registered on the component.
The following tags show how to specify the requiredMessage
attribute using a value expression to reference an error message:
<h:inputText id="ccno" size="19" required="true" requiredMessage="#{customMessages.ReqMessage}"> ... </h:inputText> <h:message styleClass="error-message" for="ccno"/>
The value expression used by requiredMessage
in this example references the error message with the ReqMessage
key in the resource bundle customMessages
.
This message replaces the corresponding message queued on the component and will display wherever the message
or messages
tag is placed on the page.