«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:

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

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