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