Конвертеры, слушатели и валидаторы в Java EE 7

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 .