1. Обзор
Java Enterprise Edition (JEE) 7 предоставляет некоторые полезные функции, например, для проверки пользовательского ввода, преобразования значений в соответствующие типы данных Java.
В этом руководстве мы сосредоточимся на тех возможностях, которые предоставляют конвертеры, слушатели и валидаторы.
2. Преобразователи
Конвертер позволяет нам преобразовывать строковые входные значения в типы данных Java. Предопределенные конвертеры находятся в пакете javax.faces.convert и совместимы с любым типом данных Java или даже стандартными классами, такими как Date.
Чтобы определить конвертер Integer , сначала мы создаем наше свойство в управляемом компоненте, используемом в качестве серверной части нашей формы JSF :
private Integer age;
//getters and setters
Затем мы создаем компонент в нашей форме, используя тег f: converter :
<h:outputLabel value="Age:"/>
<h:inputText id="Age" value="#{convListVal.age}">
<f:converter converterId="javax.faces.Integer"/>
</h:inputText>
<h:message for="Age"/>
Аналогичным образом мы создаем другие числовые преобразователи, такие как Double converter:
private Double average;
Затем мы создаем соответствующий JSF-компонент на наш взгляд. Обратите внимание, что мы используем переменную average, , которая затем сопоставляется с полем с использованием метода получения и установки по имени:
<h:outputLabel value="Average:"/>
<h:inputText id="Average" value="#{convListVal.average}">
<f:converter converterId="javax.faces.Double"/>
</h:inputText>
<h:message for="Average"/>
-
Если мы хотим предоставить отзыв пользователю, нам нужно включить тег h: message , который будет использоваться элементом управления в качестве заполнителя для сообщений об ошибках. **
Полезным конвертером является конвертер DateTime , поскольку он позволяет нам проверять даты, время и форматировать эти значения.
Во-первых, как и в предыдущих конвертерах, мы объявляем наше поле с помощью геттеров и сеттеров:
private Date myDate;//getters and setters
Затем мы создаем компонент в нашем представлении. Здесь нам нужно ввести дату с использованием шаблона, если шаблон не используется, то мы получаем ошибку с примером правильного шаблона ввода:
<h:outputLabel value="Date:"/>
<h:inputText id="MyDate" value="#{convListVal.myDate}">
<f:convertDateTime pattern="dd/MM/yyyy"/>
</h:inputText>
<h:message for="MyDate"/>
<h:outputText value="#{convListVal.myDate}">
<f:convertDateTime dateStyle="full" locale="en"/>
</h:outputText>
В нашем случае мы можем преобразовать нашу введенную дату и отправить данные поста, отформатированные как полная дата в нашем h: outputText.
** 3. Слушатели
**
Слушатель позволяет нам отслеживать изменения в наших компонентах; мы следим за изменением значения текстового поля.
Как и прежде, мы определяем свойства нашего управляемого компонента:
private String name;
Затем мы определяем нашего слушателя в представлении:
<h:outputLabel value="Name:"/>
<h:inputText id="name" size="30" value="#{convListVal.name}">
<f:valueChangeListener type="com.baeldung.convListVal.MyListener"/>
</h:inputText>
Мы устанавливаем наш тег h: inputText , добавляя f: valueChangeListener , а также внутри тега слушателя нам нужно указать класс, который будет использоваться для выполнения задач при запуске слушателя.
public class MyListener implements ValueChangeListener {
private static final Logger LOG = Logger.getLogger(MyListener.class.getName());
@Override
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException {
if (event.getNewValue() != null) {
LOG.log(Level.INFO, "\tNew Value:{0}", event.getNewValue());
}
}
}
Класс слушателя должен реализовывать интерфейс ValueChangeListener и переопределять метод processValueChange () для выполнения задач слушателя, чтобы написать сообщение журнала.
4. Validators
Мы используем валидатор для проверки данных компонента JSF с набором стандартных классов для проверки ввода пользователя.
Здесь мы определили стандартный валидатор, чтобы мы могли проверить длину пользовательского ввода в текстовом поле.
Сначала мы создаем наше поле в управляемом компоненте:
private String surname;
Затем мы создаем наш компонент в виде:
<h:outputLabel value="surname" for="surname"/>
<h:panelGroup>
<h:inputText id="surname" value="#{convListVal.surname}">
<f:validateLength minimum="5" maximum="10"/>
</h:inputText>
<h:message for="surname" errorStyle="color:red" />
</h:panelGroup>
Внутри тега h: inputText мы помещаем наш валидатор, чтобы проверить длину ввода. Помните, что в JSF предопределены различные стандартные валидаторы, и мы можем использовать их так же, как и здесь
5. тесты
Чтобы протестировать это приложение JSF, мы будем использовать Arquillian для функционального тестирования с использованием Drone, Graphene и Selenium Web Driver.
Сначала мы развернем ваше приложение с помощью ShrinkWrap:
@Deployment(testable = false)
public static WebArchive createDeployment() {
return (ShrinkWrap.create(
WebArchive.class, "jee7.war").
addClasses(ConvListVal.class, MyListener.class)).
addAsWebResource(new File(WEBAPP__SRC, "ConvListVal.xhtml")).
addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}
Затем мы проверяем сообщения об ошибках каждого компонента, чтобы убедиться, что наше приложение работает правильно:
@Test
@RunAsClient
public void givenAge__whenAgeInvalid__thenErrorMessage() throws Exception {
browser.get(deploymentUrl.toExternalForm() + "ConvListVal.jsf");
ageInput.sendKeys("stringage");
guardHttp(sendButton).click();
assertTrue("Show Age error message",
browser.findElements(By.id("myForm:ageError")).size() > 0);
}
Аналогичные тесты проводятся для каждого компонента.
6. Резюме
В этом руководстве мы создали реализации конвертеров, слушателей и валидаторов, предоставляемых JEE7.
Вы можете найти код из статьи over на Github .