当前位置: 代码迷 >> 综合 >> JSF1.2自定义验证器的实现
  详细解决方案

JSF1.2自定义验证器的实现

热度:90   发布时间:2024-01-09 14:37:50.0

这两天有个朋友在做jsf自定义验证器时遇到了一些问题,问了我。我整了好久也没能搞明白,后来发现可能是他实现自定义验证器时使用的类太老(项目用的是jsf1.2,自定义验证器时却用的jsf1.1的类-ValidatorTag,这个类在jsf1.2中已经被建议不使用,这位朋友在实现时用的tld标签也是2.0之上的,我也不确定问题是否出在这里)。

 

下班后没事就在jsf1.2的库上,在参考网上一些资料的情况下,自己写了一个自定义验证器的demo。该例子用途是验证email格式。现贴出代码:)

 

package test.managebean下的class:

package test.managebean;/**** @author SailingLee*/
public class TestManageBean {private String postCode;public void doSomeThing(){System.out.println("============doSomeThing============");}/*** @return the postCode*/public String getPostCode() {return postCode;}/*** @param postCode the postCode to set*/public void setPostCode(String postCode) {this.postCode = postCode;}
}

 

package test.validator下的class:

package test.validator;import java.io.Serializable;
//import java.text.MessageFormat;
import java.util.regex.Pattern;
//import java.util.Locale;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.faces.application.FacesMessage;/**** @author SailingLee*/
public class CustomValidator implements Validator, Serializable {private String length;private String regex;private String errorSummary;private String errorDetail;public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {FacesMessage message = null;if (value == null || value.toString().trim().length() == 0) {message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "输入不能为空!", "您的输入为空,请输入!");//return;}else if (value.toString().length() > Integer.parseInt(getLength())) {message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "输入长度超过" + getLength() + "位!", "输入长度超过" + getLength() + "位!请重新输入!");//return;}else if (regex != null && !regex.equals("")) {boolean b = Pattern.matches(regex, value.toString());if (!b) {message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "输入的邮编格式错误!", "输入的邮编格式错误!请确认!");//return;}}throw new ValidatorException(message);}/*** @return the errorSummary*/public String getErrorSummary() {return errorSummary;}/*** @param errorSummary the errorSummary to set*/public void setErrorSummary(String errorSummary) {this.errorSummary = errorSummary;}/*** @return the errorDetail*/public String getErrorDetail() {return errorDetail;}/*** @param errorDetail the errorDetail to set*/public void setErrorDetail(String errorDetail) {this.errorDetail = errorDetail;}/*** @return the regex*/public String getRegex() {return regex;}/*** @param regex the regex to set*/public void setRegex(String regex) {this.regex = regex;}/*** @return the length*/public String getLength() {return length;}/*** @param length the length to set*/public void setLength(String length) {this.length = length;}}

 

package test.tag下的class:

package test.tag;import test.validator.CustomValidator;
import javax.faces.validator.Validator;
import javax.faces.webapp.ValidatorELTag;
import javax.faces.context.FacesContext;
import javax.servlet.jsp.JspException;
import javax.el.ValueExpression;
import javax.el.ELContext;/**** @author SailingLee*/
public class CustomValidatorTag extends ValidatorELTag {private ValueExpression length;private ValueExpression regex;private ValueExpression errorSummary;private ValueExpression errorDetail;@Overrideprotected Validator createValidator() throws JspException {CustomValidator validator = new CustomValidator();ELContext elContext = FacesContext.getCurrentInstance().getELContext();validator.setLength((String) length.getValue(elContext));validator.setRegex((String) regex.getValue(elContext));if (errorSummary != null)validator.setErrorSummary((String) errorSummary.getValue (elContext));if (errorDetail != null)validator.setErrorDetail((String) errorDetail.getValue (elContext));return validator;}/*** @param length the length to set*/public void setLength(ValueExpression length) {this.length = length;}/*** @param regex the regex to set*/public void setRegex(ValueExpression regex) {this.regex = regex;}/*** @param errorSummary the errorSummary to set*/public void setErrorSummary(ValueExpression errorSummary) {this.errorSummary = errorSummary;}/*** @param errorDetail the errorDetail to set*/public void setErrorDetail(ValueExpression errorDetail) {this.errorDetail = errorDetail;}public void release() {length = null;regex = null;errorSummary = null;errorDetail = null;}
}

 

<?xml version='1.0' encoding='UTF-8'?><!-- =========== FULL CONFIGURATION FILE ================================== --><faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"><managed-bean><managed-bean-name>testManageBean</managed-bean-name><managed-bean-class>test.managebean.TestManageBean</managed-bean-class><managed-bean-scope>request</managed-bean-scope>
</managed-bean><validator><!--看见网上很多例子都在这里加上下面两行,但经过测试,没有这两行也完全没影响。(看了下,发现这里的配置只在jsf1.1中需要) --><validator-id>test.validator.CustomValidator</validator-id><validator-class>test.validator.CustomValidator</validator-class>
</validator>
</faces-config>

 

<?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>customvalidator</short-name><uri>/WEB-INF/CustomValidator</uri><tag><name>email</name><tag-class>test.tag.CustomValidatorTag</tag-class><body-content>empty</body-content><attribute><name>length</name><required>true</required><deferred-value><type>java.lang.String</type></deferred-value></attribute><attribute><name>regex</name><required>true</required><deferred-value><type>java.lang.String</type></deferred-value></attribute><attribute><name>errorSummary</name><deferred-value><type>java.lang.String</type></deferred-value></attribute><attribute><name>errorDetail</name><deferred-value><type>java.lang.String</type></deferred-value></attribute></tag>
</taglib>

 

    <jsp-config><taglib><taglib-uri>http://email.com</taglib-uri><taglib-location>/WEB-INF/CustomValidator.tld</taglib-location></taglib></jsp-config>

 

页面代码:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%><%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="custom" uri="http://email.com"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Custom Validate Email</title></head><body><f:view><h:form id="myform">Email:<h:inputText id="postCode" value="#{testManageBean.postCode}"><custom:email length="10" regex="[a-z]*@[a-z]*.[a-z]*"/></h:inputText><h:commandButton action="#{testManageBean.doSomeThing}" value="validate email"/></h:form><h:messages/></f:view></body></html>

 

使用类库是jsf1.2版本的。

效果图如下:

:该例子中关于自定义errorSummary和errorDetail的功能没有实现。