JSF下Email验证器完全实例

来源:互联网 发布:淘宝女装退货率在30% 编辑:程序博客网 时间:2024/06/06 14:18
  • 利用<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/>。
原创粉丝点击