在使用标准转换器或验证器时,当发生错误时,会有一些预设的错误讯息显示,这些讯息可以使用
javax.faces.component.UIInput.CONVERSION=Format Error.
javax.faces.component.UIInput.REQUIRED=Please input your data.
....
javax.faces.component.UIInput.CONVERSION是用来设定当转换器发现错误时显示的讯息,而 javax.faces.component.UIInput.REQUIRED是在标签设定了required为true,而使用者没有在栏位输入时显 示的错误讯息。
您要在faces-config.xml中告诉JSF您使用的讯息档案名称,例如:
- <?xml version="1.0"?>
- <!DOCTYPE faces-config PUBLIC
- "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
- "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
-
- <faces-config>
- <application>
- <local-config>
- <default-locale>en</default-locale>
- <supported-locale>zh_TW</supported-locale>
- </local-config>
- <message-bundle>messages</message-bundle>
- </application>
- .....
-
- </faces-config>
在这边我们设定了讯息档案的名称为messages_xx_YY.properties,其中xx_YY是根据您的Locale来决定,转换器或验证器的错误讯息如果有设定的话,就使用设定值,如果没有设定的话,就使用预设值。
验证器错误讯息,除了上面的javax.faces.component.UIInput.REQUIRED之外,还有以下的几个:
讯息识别 |
预设讯息 |
用于 |
javax.faces.validator.NOT_IN_RANGE |
Validation Error: Specified attribute is not between the expected values of {0} and {1}. |
DoubleRangeValidator与 LongRangeValidator,{0}与{1}分别代表minimum与maximum所设定的属性 |
javax.faces.validator.DoubleRangeValidator.MAXIMUM、 javax.faces.validator.LongRangeValidator.MAXIMUM |
Validation Error: Value is greater than allowable maximum of '{0}'. |
DoubleRangeValidator或 LongRangeValidator,{0}表示maximum属性 |
javax.faces.validator.DoubleRangeValidator.MINIMUM、 javax.faces.validator.LongRangeValidator.MINIMUM |
Validation Error: Value is less than allowable minimum of '{0}'. |
DoubleRangeValidator或 LongRangeValidator,{0}代表minimum属性 |
javax.faces.validator.DoubleRangeValidator.TYPE、 javax.faces.validator.LongRangeValidator.TYPE |
Validation Error: Value is not of the correct type. |
DoubleRangeValidator或 LongRangeValidator |
javax.faces.validator.LengthValidator.MAXIMUM |
Validation Error: Value is greater than allowable maximum of ''{0}''. |
LengthValidator,{0}代表maximum |
javax.faces.validator.LengthValidator.MINIMUM |
Validation Error: Value is less than allowable minimum of ''{0}''. |
LengthValidator,{0}代表minimum属性 |
在您提供自订讯息的时候,也可以提供{0}或{1}来设定显示相对的属性值,以提供详细正确的错误提示讯息。
讯息的显示有概述讯息与详述讯息,如果是详述讯息,则在识别上加上 "_detail",例如:
javax.faces.component.UIInput.CONVERSION=Error.
javax.faces.component.UIInput.CONVERSION_detail= Detail Error.
....
除了在讯息资源档中提供讯息,您也可以在程式中使用FacesMessage来提供讯息,例如在 自订验证器 中我们就这么用过:
- ....
- if(password.length() < 6) {
- FacesMessage message = new FacesMessage(
- FacesMessage.SEVERITY_ERROR,
- "字元长度小于6",
- "字元长度不得小于6");
- throw new ValidatorException(message);
- }
- ....
最好的方法是在讯息资源档中提供讯息,这么一来如果我们要修改讯息,就只要修改讯息资源档的内容,而不用修改程式,来看一个简单的例子,假设我们的讯息资源档中有以下的内容:
onlyfun.caterpillar.message1=This is message1.
onlyfun.caterpillar.message2=This is message2 with {0} and {1}.
则我们可以在程式中取得讯息资源档的内容,例如:
- package onlyfun.caterpillar;
-
- import java.util.Locale;
- import java.util.ResourceBundle;
- import javax.faces.context.FacesContext;
- improt javax.faces.component.UIComponent;
- import javax.faces.application.Application;
- import javax.faces.application.FacesMessage;
-
- ....
- public void xxxMethod(FacesContext context,
- UIComponent component,
- Object obj) {
-
- Application application = context.getApplication();
-
- String messageFileName =
- application.getMessageBundle();
-
- Locale locale = context.getViewRoot().getLocale();
-
- ResourceBundle rsBundle =
- ResourceBundle.getBundle(messageFileName, locale);
-
- String message = rsBundle.getString(
- "onlyfun.caterpillar.message1");
- FacesMessage facesMessage = new FacesMessage(
- FacesMessage.SEVERITY_FATAL, message, message);
- ....
- }
- ....
- ....
-
-
接下来您可以将FacesMessage物件填入ValidatorException或 ConverterException后再丢出,FacesMessage建构时所使用的三个参数是严重程度、概述讯息与详述讯息,严重程度有 SEVERITY_FATAL、SEVERITY_ERROR、SEVERITY_WARN与SEVERITY_INFO四种。
如果需要在讯息资源档中设定{0}、{1}等参数,则可以如下:
- ....
- String message = rsBundle.getString(
- "onlyfun.caterpillar.message2");
- Object[] params = {"param1", "param2"};
- message = java.text.MessageFormat.format(message, params);
-
- FacesMessage facesMessage = new FacesMessage(
- FacesMessage.SEVERITY_FATAL, message, message);
- ...
如此一来,在显示讯息时,onlyfun.caterpillar.message2的{0}与{1}的位置就会被"param1"与"param2"所取代。