Convertisseurs, auditeurs et validateurs dans Java EE 7

1. Vue d’ensemble

Java Enterprise Edition (JEE) 7 fournit certaines fonctionnalités utiles, par exemple. pour valider les entrées utilisateur, convertir les valeurs en types de données Java appropriés.

Dans ce didacticiel, nous allons nous concentrer sur les fonctionnalités fournies par les convertisseurs, les écouteurs et les validateurs.

2. Convertisseurs

Un convertisseur nous permet de transformer des valeurs d’entrée de chaîne en un type de données Java. Les convertisseurs prédéfinis se trouvent dans le package javax.faces.convert et sont compatibles avec tout type de données Java ou même avec des classes standard telles que Date.

Pour définir un convertisseur Integer , nous créons d’abord notre propriété dans le bean géré utilisé comme back-end de notre formulaire JSF :

private Integer age;
     //getters and setters

Ensuite, nous créons le composant dans notre formulaire à l’aide de la balise 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"/>

De manière similaire, nous créons les autres convertisseurs numériques comme le convertisseur Double :

private Double average;

Ensuite, nous créons le composant JSF approprié dans notre vue. Veuillez noter que nous utilisons la variable average, qui est ensuite mappée au champ à l’aide de la convention getter et setter by name:

<h:outputLabel value="Average:"/>
<h:inputText id="Average" value="#{convListVal.average}">
    <f:converter converterId="javax.faces.Double"/>
</h:inputText>
<h:message for="Average"/>
  • Si nous voulons donner le retour à l’utilisateur, nous devons inclure une balise h: message à utiliser par le contrôle en tant qu’espace réservé pour les messages d’erreur. **

Le convertisseur DateTime est un convertisseur utile car il nous permet de valider les dates, les heures et de formater ces valeurs.

Tout d’abord, comme dans les convertisseurs précédents, nous déclarons notre champ avec les getters et les setters:

private Date myDate;//getters and setters

Ensuite, nous créons le composant dans notre vue. Ici, nous devons entrer la date en utilisant le modèle, si le modèle n’est pas utilisé, nous obtenons une erreur avec un exemple de modèle correct de l’entrée:

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

Dans notre cas, nous pouvons convertir notre date d’entrée et envoyer les données de publication, formatées comme date complète dans notre h: outputText.

** 3. Les auditeurs

**

Un auditeur nous permet de surveiller les modifications de nos composants; nous surveillons le moment où la valeur d’un champ de texte change.

Comme auparavant, nous définissons les propriétés dans notre bean géré:

private String name;

Ensuite, nous définissons notre auditeur dans la vue:

<h:outputLabel value="Name:"/>
<h:inputText id="name" size="30" value="#{convListVal.name}">
    <f:valueChangeListener type="com.baeldung.convListVal.MyListener"/>
</h:inputText>

Nous définissons notre balise h: inputText en ajoutant un f: valueChangeListener et, à l’intérieur de la balise du programme d’écoute, nous devons spécifier une classe qui sera utilisée pour effectuer les tâches lorsque le programme d’écoute est déclenché.

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());
        }
    }
}

La classe d’écoute doit implémenter l’interface ValueChangeListener et remplacer la méthode processValueChange () pour effectuer les tâches d’écoute, afin d’écrire un message de journal.

4. Validateurs

Nous utilisons un validateur pour valider une donnée de composant JSF, avec un ensemble de classes standard fournies, pour valider la saisie de l’utilisateur.

Ici, nous avons défini un validateur standard pour nous permettre de vérifier la longueur d’une entrée utilisateur dans un champ de texte.

Tout d’abord, nous créons notre champ dans le bean géré:

private String surname;

Ensuite, nous créons notre composant dans la vue:

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

A l’intérieur de la balise h: inputText , nous avons placé notre validateur pour valider la longueur de l’entrée. Rappelez-vous qu’il existe différents validateurs standard prédéfinis dans JSF et que nous pouvons les utiliser de la même manière que celle présentée ici.

5. Tests

Pour tester cette application JSF, nous allons utiliser Arquillian pour effectuer des tests fonctionnels avec Drone, Graphene et Selenium Web Driver.

Tout d’abord, nous déployons notre application à l’aide de 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");
}

Ensuite, nous testons les messages d’erreur de chaque composant pour vérifier que notre application fonctionne correctement:

@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);
}

Des tests similaires sont effectués sur chaque composant.

6. Résumé

Dans ce didacticiel, nous avons créé les implémentations des convertisseurs, des écouteurs et des validateurs fournis par JEE7.

Vous pouvez trouver le code de l’article over sur Github .