`

jsf中使用Locale,显示本地化错误信息

    博客分类:
  • JSF
阅读更多

JSF 在转换和验证时都有可能会产生错误信息:
在使用标准转换器或验证器时,当发生错误时,会有一些预定义的错误信息显示,这些信息可以使用<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 您使用的信息文件名称,例如:
• faces-config.xml

<?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来提供信息,例如在 JSF -自定义验证器 中我们就这么用过:

   ....  
    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);  
  .... 
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics