Перейти к основному содержимому

Преобразователи, слушатели и валидаторы в Java EE 7

· 4 мин. чтения

1. Обзор

Java Enterprise Edition (JEE) 7 предоставляет некоторые полезные функции, например, для проверки пользовательского ввода, преобразования значений в соответствующие типы данных Java.

В этом руководстве мы сосредоточимся на функциях, предоставляемых конвертерами, слушателями и валидаторами.

2. Преобразователи

Преобразователь позволяет нам преобразовывать строковые входные значения в типы данных Java. Предопределенные преобразователи находятся в пакете javax.faces.convert и совместимы с любым типом данных Java или даже со стандартными классами, такими как Date.

Чтобы определить целочисленный преобразователь, сначала мы создаем наше свойство в управляемом компоненте, используемом в качестве серверной части нашей формы 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" />

Аналогичным образом мы создаем другие числовые преобразователи, такие как двойной преобразователь:

private Double average;

Затем мы создаем соответствующий компонент JSF в нашем представлении. Обратите внимание, что мы используем среднюю переменную, которая затем сопоставляется с полем с помощью геттера и сеттера по соглашению об именах:

<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.foreach.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. Валидаторы

Мы используем валидатор для проверки данных компонента 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.

Вы можете найти код из статьи на Github .