From PmWiki@caterpillar

JavaServerFaces: ErrorMessages

在使用標準轉換器或驗證器時,當發生錯誤時,會有一些預設的錯誤訊息顯示,這些訊息可以使用<h: messages>或<h:message>標籤來顯示出來,而這些預設的錯誤訊息也是可以修改的,您所要作的是提供一個訊息資源檔 案,例如:
 
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 locale = context.getViewRoot().getLocale();
// 取得訊息綁定 ResourceBundle 物件
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"所 取代。

Retrieved from http://caterpillar.onlyfun.net/PmWiki/pmwiki.php/JavaServerFaces/ErrorMessages
頁面最後更新於 2005 年 03 月 07 日,09:02 下午