1. JSF验证器
说完转换器就该说说验证器了,就拿上面的日期类型来说吧,如果输入的值是非法的,那么它就不能走完组件生命周期,在第三个阶段处理检验阶段发现了错误~得,直接进入第六个阶段,错误的输入,您哪,玩儿去……验证器还能验证数值的大小,像那个经典的JSF入门例子,猜数字,就是用的大小验证器来判断的。
<h:inputText value="#{UserNumberBean.userNumber}"> <f:validateLongRange minimum="#{UserNumberBean.mininum}" maximum="#{UserNumberBean.maxinum}" /> </h:inputText>
如果业务复杂,就需要我们自己定义验证器了,想想我们在Swing程序是怎么来验证输入的数据的合法性的。一般是添加一个监听器,发现该数值发生了改变、鼠标焦点离开此空间等等事件,就进行监听事件的一些列方法。,JSF在页面上加入自定义的验证器标签即可。
先看托管Bean类
package validator; public class Email { private String mailStr; public String getMailStr() { return mailStr; } public void setMailStr(String mailStr) { this.mailStr = mailStr; } public String checkEmail() { System.out.println(mailStr); return "checkEmail"; } }
验证器如下
package validator; import java.util.regex.Pattern; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; public class EmailValidator implements Validator { public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { Pattern p = Pattern.compile("[_\\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\\.)+[a-z]{2,3}"); boolean falg = p.matcher((String)value).matches(); if(!falg){ ((UIInput)component).setValid(false); FacesMessage facesMessage = new FacesMessage(); facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR); facesMessage.setSummary("邮件格式不正确"); facesMessage.setDetail("详细:如:[email protected]"); throw new ValidatorException(facesMessage); } } }
上面是实现了Validator接口,并实现了验证其方法,验证输入的Email信息是否是合法的Email信息。抛出验证异常ValidatorException就代表没通过验证,如果验证器通过了,才能走到托管Bean的方法。在JSF配置文件中加入如下配置告诉JSF有自定义验证器
<!--验证器--> <validator> <validator-id>validator.EmailValidator</validator-id> <validator-class>validator.EmailValidator</validator-class> </validator>
页面如下:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <f:view> <h:form id="guessForm"> <h2> 输入email: </h2> <h:inputText id="email" value="#{Email.mailStr}"> <f:validator validatorId="validator.EmailValidator" /> </h:inputText> <h:commandButton id="sumbit1" action="#{Email.checkEmail}" value="提交" /> <h:message for="email" style="color:red" /> <br /> </h:form> </f:view> </body> </html>
效果如下,输入一个不合法的Email信息
错误的信息,生命周期到了第3个阶段就进入第6个呈现阶段了,输入正确的信息后,6个生命周期可以顺利走完。