JSF下Email验证器完全实例

  • 利用<f:validator>标签的验证器
    • jsf页面通过validatorId调用验证器(该id在faces-config.xml中配置)
    <h:inputText id="inputTxt">

            <h:outputLabel value="#{CusMes.inputTxtLabel}"/>

            <f:validateLength minimum="5" maximum="20" />

            <f:validator validatorId="emailValidator"></f:validator>

    </h:inputText>
    • faces-config.xml中配置(配置调用的自定义验证器类)
    <validator>

        <validator-id>emailValidator</validator-id>

        <validator-class>com.xgtimes.Validator.emailValidator</validator-class>

    </validator>
    • com.xgtimes.Validator.emailValidator类的实现:该类必须实现Validator 接口及接口抽象方法validate(),且validate()方法要求抛出ValidatorException异常,该异常以FacesMessage为参数抛出,旨在验证失败时,确定向视图发送的消息,如果验证成功则什么也不做,当然如果验证成功也要求发送消息的话,同样抛出ValidatorException异常即可。该类其实很简单,唯一要做的就是,确定在什么情况下应该抛出异常。另外,为了支持国际化,在抛出消息时,采用从资源文件com.xgtimes.CustomMessages.properties获取EMAIL_ERROR_MESSAGE键值,通过fc.getViewRoot().getLocale(),使该消息符合当前语言环境。(注:这里Email验证逻辑不完全规范)
package com.xgtimes.Validator;

import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.validator.Validator;

import javax.faces.validator.ValidatorException;



public class emailValidator implements Validator {



    public void validate(FacesContext arg0, UIComponent arg1, Object arg2) throws ValidatorException {

        String Value=(String)arg2;

        if(!isValid(Value)){

            FacesMessage message=new FacesMessage(FacesMessage.SEVERITY_ERROR,this.getMes(arg0),null);

            throw new ValidatorException(message); 

        }        

    }
    

    private boolean isValid(String value) {

        boolean isvalid=true;

        int index=value.indexOf("@");

        if(index<=0||index>value.length()-6) {

            isvalid=false;

        }        

        return isvalid;

    }
    

    private String getMes(FacesContext fc) {

        String str=null;

        ResourceBundle  rb=ResourceBundle.getBundle("com.xgtimes.CustomMessages", fc.getViewRoot().getLocale());

        str=rb.getString("EMAIL_ERROR_MESSAGE");

        return str;

    }

}
  • 自定义标签的验证器:这里将提供自定义的验证器标签<xg:emailValidator/>实现验证,而不是利用<f:validator>标准标签,这样有利于重用和扩展,就象利用普通的第三方标签一样方便,只需引入标签库,然后使用即可。
    • JSF页面中引入标签库并使用email验证器标签:

<%@ taglib prefix="xg" uri="/WEB-INF/tld/xgtags.tld" %>

引入/WEB-INF/tld下的xgtags.tld库,其中对email验证器标签emailValidator进行了定义。以至于我们能在JSF页面中能够使用email验证器标签。

<xg:emailValidator/>

这里会碰到两种问题:

PWC6180:Unable to initialize TldLocationsCache:可能是由于你将xgtags.tld置于tags下面,把它放到其他目录下,比如tld下,为什么不能放在tags下面呢?这是因为Java EE 5中有个特性,就是tags下专门用于放*.tag的文件,该文件是一种不用打包的标记文件,并且不要任何的标记描述文件(TLD)。

Unable to load tag hander class:可能是由于你引入标记库错误,检查uri,也可能是你的标记处理器类没找到,检查你的标记处理器类是否在你的类目录下。

    • 标签描述文件(TLD)的配置:关键就是<tag>标记中的<name>和<tag-class>的设置。name的值决定了<xg:emailValidator/>中冒号后的字符串,也就是标记名称。然后用<tag-class>来查找emailValidatorTag类,该类是个标记处理程序。
<?xml version="1.0" encoding="UTF-8"?>

<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

  <tlib-version>1.0</tlib-version>

  <short-name>xg</short-name>

  <uri>xgtimes-taglib</uri>

  <tag>

      <display-name>Email验证器</display-name>

      <description>用于验证email格式的合法性</description>

      <name>emailValidator</name>

      <tag-class>com.xgtimes.Validator.emailValidatorTag</tag-class>

  </tag>  

</taglib>
    • emailValidatorTag标记处理程序的实现:该类仅仅就是实现了createValidator方法,该方法唯一做的就是返回一个emailValidator 验证器类。
package com.xgtimes.Validator;



import javax.faces.validator.Validator;

import javax.faces.webapp.ValidatorELTag;

import javax.servlet.jsp.JspException;



public class emailValidatorTag extends ValidatorELTag {



    protected Validator createValidator() throws JspException{

        emailValidator validator=new emailValidator();

        return validator;

    }
}
    • com.xgtimes.Validator.emailValidator类的实现:同上
至此,使用自定义标签的验证器就完成了,这里与使用<f:Validator>操作上不同的地方就是不再需要在faces-config.xml中进行Validator的声明,而是就象普通的标记一样引入标记库,然后直接用就是了。当然要做的还有几步,现在来归纳下使用自定义标记的流程:
  1. 添加源包:com.xgtimes.Validator中的emailValidator类(注意:还需保证com.xgtimes包中存在CustomMessages.properties,类emailValidator用到它);
  2. 将xgtags.tld文件拷入/WEB-INF下(注意不能是/WEB-INF/tags),这里我们假设是/WEB-INF/tld下;
  3. 导入标记库到页:<%@ taglib prefix="xg" uri="/WEB-INF/tld/xgtags.tld" %>;
  4. 调用标签<xg:emailValidator/>。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值