。但是,可以进一步改进定制检验器的实现:创建 一个使用这个检验器的定制标记,使它看起来像内置的检验。对于需要经常检验的数据,比如电子邮件地 址,这种方法可以简化代码,尽可能增加代码重用和提高应用程序行为的一致性。
JSF 1.2入门,第2部分 JSF生命周期、转换、检验和阶段监听器(17)
时间:2011-08-09 IBM Richard Hightower
再论检验和转换
在到达检验阶段之前,转换已经执行过了。例如,如果有一个 int 属性绑定到 inputText 字段,那 么先对这个字段进行转换,然后再进行检验。
假设您有一个 PhoneNumber 值对象,并使用它(而不是使用 String)在 Contact 中存储电话号码。 那么 清单 33 中电话号码的检验规则就没什么意义了。实际上,这个检验规则只证明 String 采用了电 话号码的格式。这个逻辑实际上应该放在转换器中,见清单 40:
清单 40. 再论检验和转换:PhoneConverter
package com.arcmind.contact.converter;
import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import com.arcmind.contact.model.PhoneNumber;
/**
* @author Richard Hightower
*
*/
public class PhoneConverter implements Converter {
private static Pattern phoneMask;
static {
String countryCode = "^[0-9]{1,2}";
String areaCode = "( |-|\\(){1,2}[0-9]{3}( |-|\\)){1,2}";
String prefix = "( |-)?[0-9]{3}";
String number = "( |-)[0-9]{4}contentquot;;
phoneMask = Pattern.compile(countryCode + areaCode + prefix + number);
}
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
System.out.println("PhoneConverter.getAsObject()");
if (value.isEmpty()) {
return null;
}
/* Before we parse, let''s see if it really is a phone number. */
if (!phoneMask.matcher(value).matches()) {
FacesMessage message = new FacesMessage();
message.setDetail("Phone number not valid");
message.setSummary("Phone number not valid");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ConverterException(message);
}
/* Now let''s parse the string and populate a phone number object. */
PhoneNumber phone = new PhoneNumber();
phone.setOriginal(value);
String[] phoneComps = value.split("[ ,()-]");
String countryCode = phoneComps[0];
phone.setCountryCode(countryCode);
if ("1".equals(countryCode) && phoneComps.length == 4) {
phone.setAreaCode(phoneComps[1]);
phone.setPrefix(phoneComps[2]);
phone.setNumber(phoneComps[3]);
} else if ("1".equals(countryCode) && phoneComps.length != 4) {
throw new ConverterException(new FacesMessage(
"No Soup for you butter fingers!"));
|