JSF2验证器和转换器

JSF定义了一系列标准的转换器(Converter),支持8种基本类型数据转换
DateTime、Number可以使用<f:convertDateTime>、<f:convertNumber>标签进行转换

自定义转换器
自定义转换器要实现javax.faces.convert.Converter接口,这个接口有两个要实现的方法:
public Object getAsObject(FacesContext context,UIComponent component,String str);<br>
public String getAsString(FacesContext context,UIComponent component,Object obj);

实现自定义转换器后,需要在faces-config.xml中注册转换器
例如:
<converter> 
    <converter-id>onlyfun.caterpillar.User</converter-id> 
    <converter-class> 
        onlyfun.caterpillar.UserConverter 
    </converter-class> 
</converter> 
注册转换器时,需提供转换器标识(Converter  ID)与转换器类,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器标识.
例如:
<h:inputText id=”userField” value=”#{guest.user}” converter=”onlyfun.caterpillar.User”/>
也可以<f:converter>标签并使用converterId属性来指定转换器
<h:inputText id=”userField” value=”#{guest.user}”> 
    <f:converter converterId=”onlyfun.caterpillar.User”/> 
</h:inputText> 

除了向JSF注册转换器之外,还有一个方式可以不用注册,就是直接在Bean上提供一个取得转换器的方法

<h:inputText id=”userField” value=”#{guest.user}” converter=”#{guest.converter}”/>
标准验证器
JSF提供了三种标准验证器:<f:validateDoubleRange>、<f:validateLongRange>、<f:validateLength>
<h:inputText>、</h:inputSecret>中required属性为true,这表示这个栏目一定要输入值

自定义验证器,所需要的是实现javax.faces.validator.Validator接口
如果验证错误,则丢出一个ValidatorException,它接受一个FacesMessage对象,这个对象接受三个参数,分别表示信息的严重程度(INFO、WARN、ERROR、FATAL)信息概述与详细信息内容
这些信息可以使用<h:messages>或<h:message>标签显示在页面上
例如:
public void validate(FacesContext context,UIComponent component,Object obj)throws ValidatorException {
    if(obj!=null){
        String password = (String) obj; 
        if(password.length() < 6) { 
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                ”字符长度小于 6”,”字符长度不得小于 6”); 
            throw new ValidatorException(message); 
        }
         if(!password.matches(“.+[0-9]+”)) { 
            FacesMessage message = new FacesMessage(acesMessage.SEVERITY_ERROR,  
                ”密码必须包括字符与数字”,”密码必须是字符加数字所组成”); 
            throw new ValidatorException(message); 
        } 
    }    
}
接下来要在faces-config.xml中注册验证器的标识(Validater  ID)
<validator> 
    <validator-id> 
        onlyfun.caterpillar.Password 
    </validator-id> 
    <validator-class> 
        onlyfun.caterpillar.PasswordValidator 
    </validator-class> 
</validator> 
要使用自定义的验证器,我们可以使用<f:validator>标签并设定validatorId属性
<h:inputSecret value=”#{user.password}” required=”true”>  
    <f:validator validatorId=”onlyfun.caterpillar.Password”/> 
</h:inputSecret>
在自定义验证器中,使用<f:attribute>标签来设置属性
<h:inputSecret value=”#{user.password}” required=”true”>  
    <f:validator validatorId=”onlyfun.caterpillar.Password”/> 
    <f:attribute name=”pattern” value=”.+[0-9]+”/> <!–添加属性–>
</h:inputSecret><p>
程序中可以通过component来获取所设定的属性
public void validate(FacesContext context,UIComponent component,Object obj) throws ValidatorException { 
    String pattern = (String)component.getAttributes().get(“pattern”); 
} 

采用JSF注解方式进行验证

@FacesValidator(value=”com.bond.validator.EmailValidator”)
public class EmailValidator implements Validator {
    private String pattern=”^[_a-z0-9]+@([_a-z0-9]+\\.)+[a-z0-9]{2,3}$”;
    @Override
    public void validate(FacesContext context, UIComponent arg1, Object arg2)
            throws ValidatorException {
        ……
    }
    public String getPattern() {
        return pattern;
    }
    public void setPattern(String pattern) {
        this.pattern = pattern;
    }
}

页面引用

<h:inputText value=”#{userBean.email}”>
    <f:validator validatorId=”com.bond.validator.EmailValidator”/>
</h:inputText>
其中validatorId的值为@ FacesValidator注解中value中的字符串。这样就完成了,不需要另外的xml等配置,非常方便


您也可以让Bean自行负责验证的工作,可以在Bean上提供一个验证方法,这个方法没有传回值,并可以接收FacesContext、UIComponent、Object三个参数,
public void validate(FacesContext context,UIComponent component,Object obj)throws ValidatorException {}
接着可以在页面下如下使用验证器
<h:inputSecret value=”#{user.password}” required=”true” validator=”#{user.validate}”/>  

错误信息处理

使用<h:messages>标签,当有验证错误发生时,相关的错误信息会收集起来
使用<h:messages>标签可以一次将所有的错误信息显示出来

在使用标准转换器或验证器时,当发生错误时,会有一些预定义的错误信息,预定义的错误信息也是可以修改的.
提供一个信息资源文件.
在您提供自定义信息的时候,也可以提供{0}或{1}来设定显示相对的属性值,以提供详细正确的错误提示信息。

信息的显示有概述信息与详述信息,如果是详述信息,则在标识上加上”_detail”

例如:

javax.faces.component.UIInput.CONVERSION=Error. 
javax.faces.component.UIInput.CONVERSION_detail= Detail Error. 

除了在信息资源文件中提供信息, 您也可以在程序中使用FacesMessage来提供信息
最好的方法是在信息资源文件中提供信息,这么一来如果我们要修改信息,就只要修改信息资源文件的内容,而不用修改程序
onlyfun.caterpillar.message1=This is message1
onlyfun.caterpillar.message2=This is message2 with \{0} and \{1}
// 取得应用程序代表对象 
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后再丢出
//如果需要在信息资源文件中设定{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”所取代
自定义转换, 验证标签
要开发自定义验证器标签,您可以直接继承javax.faces.webapp.ValidatorTag,覆写createValidator()方法

编写标签处理类(继承ValidatorTag,覆写createValidator()方法)
protected Validator createValidator() { 
        Application application = FacesContext.getCurrentInstance().getApplication();
        PasswordValidator validator = 
        (PasswordValidator) application.createValidator(“onlyfun.caterpillar.Password”);
        validator.setPattern(pattern); 
        return validator; 
}
application.createValidator()方法建立验证器对象时,是根据在faces-config.xml中注册的标识(Validater ID):
<validator> 
    <validator-id> 
        onlyfun.caterpillar.Password 
    </validator-id> 
    <validator-class> 
        onlyfun.caterpillar.PasswordValidator 
    </validator-class> 
</validator>
布署tld描述文件
<taglib xmlns=”http://java.sun.com/xml/ns/j2eexmlns:xsi=”http://www.w3.org/2001/XMLSchema-instancexsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee  
                        web-jsptaglibrary_2_0.xsdversion=”2.0”>
    <tlib-version>1.0</tlib-version>  
    <jsp-version>2.0</jsp-version>  
    <short-name>co</short-name>  
    <uri>http://caterpillar.onlyfun.net</uri>  

    <tag>  
        <name>passwordValidator</name>  
        <tag-class> 
            onlyfun.caterpillar.PasswordValidatorTag 
        </tag-class>  
        <body-content>empty</body-content>  
        <attribute>  
            <name>pattern</name>  
            <required>true</required>  
            <rtexprvalue>false</rtexprvalue>  
        </attribute>  
    </tag>  
</taglib>  
页面导入
<%@ taglib uri=”/WEB-INF/taglib.tld” prefix=”co” %>
<co:passwordValidator pattern=”.+[0-9]+”/><!– 使用自定义标签–>
自定义转换器标签方法也是类似(继承javax.faces.webapp.ConverterTag,并重新定义其createConverter()方法)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值