首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JSF入门十三(异常信息处理)

2012-09-02 
JSF入门十三(错误信息处理)本文参考http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageI

JSF入门十三(错误信息处理)

本文参考http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630

?

在使用标准转换器或验证器时,当发生错误时,会有一些预定义的错误信息显示,这些信息可以使用<h:messages>或<h:message>标签来显示出来,而这些预定义的错误信息也是可以修改的,您所要作的是提供一个信息资源文件,例如:messages.properties

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_CN</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包找到一些错误信息。

在您提供自定义信息的时候,也可以提供{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);}....

?最好的方法是在信息资源文件中提供信息,这么一来如果我们要修改信息,就只要修改信息资源文件的内容,而不用修改程序,来看一个简单的例子,假设我们的信息资源文件中有以下的内容:

bruce.zhao.message1=This is message1.bruce.zhao.message2=This is message2 with \{0} and \{1}.

?则我们可以在程序中取得信息资源文件的内容,例如:

package bruce.zhao;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("bruce.zhao.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("bruce.zhao.message2");Object[] params = {"param1", "param2"};message = java.text.MessageFormat.format(message, params);FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_FATAL, message, message);

?如此一来,在显示信息时,bruce.zhao.message2的{0}与{1}的位置就会被"param1"与"param2"所取代。

热点排行