這兩天有個朋友在做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; @Override protected 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的功能沒有實現。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
