這兩天有個(gè)朋友在做jsf自定義驗(yàn)證器時(shí)遇到了一些問題,問了我。我整了好久也沒能搞明白,后來發(fā)現(xiàn)可能是他實(shí)現(xiàn)自定義驗(yàn)證器時(shí)使用的類太老(項(xiàng)目用的是jsf1.2,自定義驗(yàn)證器時(shí)卻用的jsf1.1的類-ValidatorTag,這個(gè)類在jsf1.2中已經(jīng)被建議不使用,這位朋友在實(shí)現(xiàn)時(shí)用的tld標(biāo)簽也是2.0之上的,我也不確定問題是否出在這里)。
?
下班后沒事就在jsf1.2的庫上,在參考網(wǎng)上一些資料的情況下,自己寫了一個(gè)自定義驗(yàn)證器的demo。該例子用途是驗(yàn)證email格式。現(xiàn)貼出代碼:)
?
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, "輸入的郵編格式錯(cuò)誤!", "輸入的郵編格式錯(cuò)誤!請確認(rèn)!");
//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><!--看見網(wǎng)上很多例子都在這里加上下面兩行,但經(jīng)過測試,沒有這兩行也完全沒影響。(看了下,發(fā)現(xiàn)這里的配置只在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版本的。
效果圖如下:
注 :該例子中關(guān)于自定義errorSummary和errorDetail的功能沒有實(shí)現(xiàn)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

