410013796724260
• Webmoney
R335386147728
Z369087728698
Валидаторы и конвертерыГлавной целью конвертации и валидации является проверка и подготовка данных для обновления значений managed bean компонента. То есть, перед вызовом методов обновления значений, можно сделать определенные выводы о состоянии данных. Это позволяют сконцентрироваться на бизнес-логике приложения, а не на проверках введенных значений типа проверки размера строки, соответствия текстового значения заданному типу и т.д. Для применения конвертеров и валидаторов необходимо подключить соответствующий namespace. В следующем коде показано подключение к странице namespace типа core с алиасом 'f' : <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" > Валидатор ValidatorДля проверки значений полей формы на валидность можно использовать либо стандартные валидаторы, встроенные в JSF, либо создать собственный, наследующий свойства Validator. Порядок подключения валидатора описан на странице стандартных JSF компонентов. Стандартные валидаторы : DoubleRangeValidator, LongRangeValidator, LengthValidatorJSF включает в себя три стандартных компонента для валидации:
Валидатор кода проверки размера строки<h:form> <h:message for="username" style="color:red" /> <h:inputText id="username" value="#{user.username}" size="20" required="true" label="Пользователь"> <f:validateLength minimum="5" maximum="10" /> </h:inputText> </h:form> В примере если размер строки не будет находиться в пределах от 5 до 10 символов, то в интерфейсе страницы в позиции с тегом <h:message> будет выведено соответствующее сообщение. Локализация сообщения фреймворка JSF описана здесь. Проверка на валидность в компонентах, реализующих интерфейс ValidatorКод класса валидатора EmailValidator, реализующего интерфейс Validator : import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.faces.component.UIComponent; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.validator.Validator; import javax.faces.validator.FacesValidator; import javax.faces.validator.ValidatorException; @FacesValidator("emailValidator") public class EmailValidator implements Validator { private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\." + "[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*" + "(\\.[A-Za-z]{2,})$"; private Pattern pattern; public EmailValidator() { pattern = Pattern.compile(EMAIL_PATTERN); } @Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { Matcher matcher = pattern.matcher(value.toString()); if (!matcher.matches()) { FacesMessage msg = new FacesMessage("E-mail validation failed.", "Invalid E-mail format."); msg.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(msg); } } } Пример подключения валидатора : EmailValidator <h:inputText id="email" value="#{user.email}" size="20" required="true" label="Email"> <f:validator validatorId="emailValidator" /> </h:inputText> Конвертер данных, ConverterJSF предоставляет набор конвертеров для преобразования значений компонентов UIComponent с присвоением значения свойству managed bean объекта. Конвертер данных может преобразовать текстовое значение поля в значение определенного типа с проверкой формата. При возникновении ошибки вызывается исключение. JSF позволяет использовать как встроенные, так и специально созданные конвертеры данных, которые представляют собой java-классы, наследующие свойства javax.faces.convert.Converter. Порядок подключения конвертера представлен на странице стандартных JSF компонентов В JSF 2.0 можно использовать следующие конвертеры :
Рассмотрим пример создания собственного конвертера URL. В класса managed bean, наследующего свойства Converter, необходимо переопределить два метода getAsObject(), getAsString(). Листинг managed bean компонента URLConverter : import javax.faces.context.FacesContext; import javax.faces.component.UIComponent; import javax.faces.application.FacesMessage; import javax.faces.convert.Converter; import javax.faces.convert.FacesConverter; import javax.faces.convert.ConverterException; import org.apache.commons.validator.UrlValidator; @FacesConverter("URLConverter") public class URLConverter implements Converter { private final String HTTP = "http://"; @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { StringBuilder url = new StringBuilder(); // Если строка не начинается с http://, то добавляем if (!value.startsWith(HTTP, 0)) url.append(HTTP); url.append(value); // Используем Apache URL validator для проверки UrlValidator urlValidator = new UrlValidator(); // Если формат URL нарушен, то создаем сообщение об ошибке if (!urlValidator.isValid(url.toString())){ FacesMessage msg = new FacesMessage ("Ошибка конвертации URL.", "Неправильный формат URL."); msg.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ConverterException(msg); } URLBookmark urlBookmark = new URLBookmark(url.toString()); return urlBookmark; } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { return value.toString(); } } Листинг managed bean компонента "user", содержащего поле url. Для простоты остальные поля не рассматриваем. import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean(name="user") @SessionScoped public class BeanUser implements Serializable { String url; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } Фрагмент кода страницы с подключением пользовательского конвертера данных URLConverter : <h:body> <h1>Конвертор JSF 2.0</h1> <h:form> <h:panelGrid columns="2"> <h:outputLabel id="lblURL" for="url" value="Введите URL :" /> <h:inputText id="url" value="#{user.url}" required="true" > <f:converter converterId="URLConverter" /> </h:inputText> <h:message for="url" style="color:magenta" /> </h:panelGrid> <h:commandButton value="Сохранить" action="save" /> </h:form> </h:body> Примеры использования конвертеров данных convertDateTime, convertNumberПример кода подключения стандартного конвертера даты convertDateTime. Форматирование значения поля дня рождения birthDate выполняется по шаблону, как определено в классе java.text.SimpleDateFormat <h:message for="birthDate" errorClass="errorMessage" /> <h:outputLabel value="День рождения" for="birthDate" /> <h:inputText id="birthDate" value="#{contactBean.birthDate}"> <f:convertDateTime dateStyle="short" pattern="dd.mm.yyyy"/> </h:inputText> Пример использования стандартного конвертера числового значения convertNumber: <h:message for="total" errorClass="errorMessage" /> <h:outputText value="123.45678" > <f:convertNumber pattern="#000.000" /> </h:outputText> <h:outputText id="total" value="orderBean.total" required="true" > <f:convertNumber minFractionDigits="4" /> </h:outputText> |