• Aucun résultat trouvé

L'envoi des données

Dans le document Cours J2EE Approfondi (Page 196-200)

Maintenant que nous avons accès à notre page d'inscription, nous pouvons saisir des données dans le formulaire et les envoyer au serveur. Remplissez les champs du formulaire avec un nom d'utilisateur, un mot de passe et une adresse mail de votre choix, puis cliquez sur le bouton d'inscription. Voici à la figure suivante la page que vous obtenez.

Eh oui, nous avons demandé un envoi des données du formulaire par la méthode POST, mais nous n'avons pas surchargé la méthode doPost() dans notre servlet, nous avons uniquement écrit une méthode doGet(). Par conséquent, notre servlet

n'est pas encore capable de traiter une requête POST !

Nous savons donc ce qu'il nous reste à faire : il faut implémenter la méthode doPost(). Voici le code modifié de notre servlet :

Code : Java - com.sdzee.servlets.Inscription

package com.sdzee.servlets;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class Inscription extends HttpServlet {

public static final String VUE = "/WEB-INF/inscription.jsp";

public void doGet( HttpServletRequest request,

HttpServletResponse response ) throws ServletException, IOException{

/* Affichage de la page d'inscription */

this.getServletContext().getRequestDispatcher( VUE

).forward( request, response );

}

public void doPost( HttpServletRequest request,

HttpServletResponse response ) throws ServletException, IOException{

/* Traitement des données du formulaire */

} }

Maintenant que nous avons ajouté une méthode doPost(), nous pouvons envoyer les données du formulaire, il n'y aura plus d'erreur HTTP !

Par contre, la méthode doPost() étant vide, nous obtenons bien évidemment une page blanche en retour...

Contrôle : côté servlet

Maintenant que notre formulaire est accessible à l'utilisateur et que la servlet en charge de son contrôle est en place, nous pouvons nous attaquer à la vérification des données envoyées par le client.

Que souhaitons-nous vérifier ?

Nous travaillons sur un formulaire d'inscription qui contient quatre champs de type <input>, cela ne va pas être bien compliqué. Voici ce que je vous propose de vérifier :

que le champ obligatoire email n'est pas vide et qu'il contient une adresse mail valide ;

que les champs obligatoires mot de passe et confirmation ne sont pas vides, qu'ils contiennent au moins 3 caractères, et qu'ils sont égaux ;

que le champ facultatif nom, s'il est rempli, contient au moins 3 caractères. Nous allons confier ces tâches à trois méthodes distinctes :

une méthode validationEmail(), chargée de valider l'adresse mail saisie ;

une méthode validationMotsDePasse(), chargée de valider les mots de passe saisis ; une méthode validationNom(), chargée de valider le nom d'utilisateur saisi.

Voici donc le code modifié de notre servlet, impliquant la méthode doPost(), des nouvelles constantes et les méthodes de validation créées pour l'occasion, en charge de récupérer le contenu des champs du formulaire et de les faire valider :

package com.sdzee.servlets; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

public class Inscription extends HttpServlet {

public static final String VUE = "/WEB-INF/inscription.jsp";

public static final String CHAMP_EMAIL = "email";

public static final String CHAMP_PASS = "motdepasse";

public static final String CHAMP_CONF = "confirmation";

public static final String CHAMP_NOM = "nom";

public void doGet( HttpServletRequest request,

HttpServletResponse response ) throws ServletException, IOException{

/* Affichage de la page d'inscription */

this.getServletContext().getRequestDispatcher( VUE

).forward( request, response );

}

public void doPost( HttpServletRequest request,

HttpServletResponse response ) throws ServletException, IOException{

/* Récupération des champs du formulaire. */

String email = request.getParameter( CHAMP_EMAIL );

String motDePasse = request.getParameter( CHAMP_PASS );

String confirmation = request.getParameter( CHAMP_CONF );

String nom = request.getParameter( CHAMP_NOM );

try {

validationEmail( email );

validationMotsDePasse( motDePasse, confirmation );

validationNom( nom );

} catch (Exception e) {

/* Gérer les erreurs de validation ici. */

}

}

private void validationEmail( String email ) throws Exception{}

private void validationMotsDePasse( String motDePasse, String confirmation ) throws Exception{}

private void validationNom( String nom ) throws Exception{} }

La partie en charge de la récupération des champs du formulaire se situe aux lignes 24 à 27 : il s'agit tout simplement d'appels à la méthode request.getParameter(). Il nous reste maintenant à implémenter nos trois dernières méthodes de validation, qui sont vides pour le moment. Voilà un premier jet de ce que cela pourrait donner :

Code : Java - com.sdzee.servlets.Inscription

...

/**

* Valide l'adresse mail saisie. */

private void validationEmail( String email ) throws Exception {

if ( email != null && email.trim().length() != 0 ) {

if ( !email.matches(

"([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" ) ) {

throw new Exception( "Merci de saisir une adresse mail valide." );

}

} else {

throw new Exception( "Merci de saisir une adresse mail." );

}

/**

* Valide les mots de passe saisis. */

private void validationMotsDePasse( String motDePasse, String confirmation ) throws Exception{

if (motDePasse != null && motDePasse.trim().length() != 0 &&

confirmation != null && confirmation.trim().length() != 0) {

if (!motDePasse.equals(confirmation)) {

throw new Exception("Les mots de passe entrés sont différents, merci de les saisir à nouveau.");

} else if (motDePasse.trim().length() < 3) {

throw new Exception("Les mots de passe doivent contenir au moins 3 caractères.");

}

} else {

throw new Exception("Merci de saisir et confirmer votre mot de passe.");

} }

/**

* Valide le nom d'utilisateur saisi. */

private void validationNom( String nom ) throws Exception {

if ( nom != null && nom.trim().length() < 3 ) {

throw new Exception( "Le nom d'utilisateur doit contenir au moins 3 caractères." );

} }

Je ne détaille pas le code de ces trois courtes méthodes. Si vous ne comprenez pas leur fonctionnement, vous devez impérativement revenir par vous-mêmes sur ces notions basiques du langage Java avant de continuer ce tutoriel.

J'ai ici fait en sorte que dans chaque méthode, lorsqu'une erreur de validation se produit, le code envoie une exception contenant un message explicitant l'erreur. Ce n'est pas la seule solution envisageable, mais c'est une solution qui a le mérite de tirer parti de la gestion des exceptions en Java. À ce niveau, un peu de réflexion sur la conception de notre système de validation s'impose :

Que faire de ces exceptions envoyées ?

En d'autres termes, quelles informations souhaitons-nous renvoyer à l'utilisateur en cas d'erreur ? Pour un formulaire d'inscription, a priori nous aimerions bien que l'utilisateur soit au courant du succès ou de l'échec de l'inscription, et en cas d'échec qu'il soit informé des erreurs commises sur les champs posant problème.

Comment procéder ? Là encore, il y a bien des manières de faire. Je vous propose ici le mode de fonctionnement suivant : une chaîne resultat contenant le statut final de la validation des champs ;

une Map erreurs contenant les éventuels messages d'erreur renvoyés par nos différentes méthodes se chargeant de la validation des champs. Une HashMap convient très bien dans ce cas d'utilisation : en l'occurrence, la clé sera le nom du champ et la valeur sera le message d'erreur correspondant.

Mettons tout cela en musique, toujours dans la méthode doPost() de notre servlet :

Code : Java - com.sdzee.servlets.Inscription

package com.sdzee.servlets;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class Inscription extends HttpServlet {

public static final String VUE = "/WEB- INF/inscription.jsp";

public static final String CHAMP_EMAIL = "email";

public static final String CHAMP_PASS = "motdepasse";

public static final String CHAMP_CONF = "confirmation";

public static final String CHAMP_NOM = "nom";

public static final String ATT_ERREURS = "erreurs";

public static final String ATT_RESULTAT = "resultat";

public void doGet( HttpServletRequest request,

HttpServletResponse response ) throws ServletException, IOException

{

/* Affichage de la page d'inscription */

this.getServletContext().getRequestDispatcher( VUE

).forward( request, response );

}

public void doPost( HttpServletRequest request,

HttpServletResponse response ) throws ServletException, IOException

{

String resultat;

Map<String, String> erreurs = new HashMap<String, String>();

/* Récupération des champs du formulaire. */

String email = request.getParameter( CHAMP_EMAIL );

String motDePasse = request.getParameter( CHAMP_PASS );

String confirmation = request.getParameter( CHAMP_CONF );

String nom = request.getParameter( CHAMP_NOM );

/* Validation du champ email. */

try {

validationEmail( email );

} catch ( Exception e ) {

erreurs.put( CHAMP_EMAIL, e.getMessage() );

}

/* Validation des champs mot de passe et confirmation. */

try {

validationMotsDePasse( motDePasse, confirmation );

} catch ( Exception e ) {

erreurs.put( CHAMP_PASS, e.getMessage() );

}

/* Validation du champ nom. */

try {

validationNom( nom );

} catch ( Exception e ) {

erreurs.put( CHAMP_NOM, e.getMessage() );

}

/* Initialisation du résultat global de la validation. */

if ( erreurs.isEmpty() ) {

resultat = "Succès de l'inscription.";

} else {

resultat = "Échec de l'inscription.";

}

/* Stockage du résultat et des messages d'erreur dans l'objet request */

request.setAttribute( ATT_ERREURS, erreurs );

request.setAttribute( ATT_RESULTAT, resultat );

/* Transmission de la paire d'objets request/response à notre JSP */

Dans le document Cours J2EE Approfondi (Page 196-200)