lundi 26 novembre 2012

Java Serveur App 14 : validation


Validation

Un des problèmes fréquents de la programmation web est que les formulaires envoient uniquement des paramètres de type String. En web, tout est String et il faut donc convertir les informations d'un formulaire avant d'en faire un objet et/ou de l'écrire en BD.

La conversion inclut nécessairement une étape de validation puisque rien ne garantit qu'une chaîne de caractères représente un nombre, une date ou encore une adresse de courriel.

La validation peut s'effectuer de plusieurs manières:
  • Côté client, dans le navigateur et donc nécessairement en javascript. Récemment JQuery et ses plugins de validation ont montré leur puissance sur ce terrain.
  • Côté serveur avec l'ensemble des conversions et manipulations qui précèdent la création d'un objet correct.
  • AJAX : le client appelle le serveur pour une vérification sans recharger la page.
Nous allons donc voir quand et comment utiliser ces différentes techniques.

Validation côté client

La validation côté client a les caractéristiques suivantes:

  • Elle peut se faire sans accéder au serveur. Cela évite de charger le serveur et permet plus d'interactivité en pointant directement l'élément d'un formulaire qui pose problème.
  • Elle n'a pas accès directement à la base de données et ne peut donc pas vérifier si une valeur est présente au absente de la BD.
  • Elle concerne principalement les formulaires mais pas forcément les autres accès au serveur.

La librairie que nous utiliserons est JQuery Validation.
<form id="client" action="client" method="post">
 <!-- le titre devient le message d erreur -->
 <p>Nom: <input type="text" name="nom" class="required" minlength="2" maxlength="25" title="Ce champ est requis"> </p>
 <p>Carte de crédit: <input type="text" name="credit" class="creditcard"></p>
 <p>Courriel: <input type="text" name="courriel" class="required email"></p>
 <p>Age (entre 18 et 100 ans): <input type="text" name="age" id="age" title="Entre 18 et 100 ans"></p>
 <p><input type="submit" value="Envoyer"></p>
</form>


Le code Javascript décrit une nouvelle fonction de validation et permet de changer les messages d'erreur.


$.validator.addMethod("verifAge", function() {
 return $("#age").val() < 100 && $("#age").val() > 18;
});
$("#client").validate({
 rules : {
  age : {
   verifAge : true
  }
 // ajout de la règle au champ dont le id est age
 },
 messages : {
  credit : "Entrez une carte de crédit valide", // autre maniere de mettre le message d erreur (pas title)
  courriel : "Entrez un courriel valide"
 },
 onkeyup : false
});


Validation côté serveur

La validation côté serveur reste le seul et unique moyen de s'assurer qu'on créer des objets corrects. Un ensemble de librairies permettent de s'assurer que les valeurs de paramètres remplissent un ensemble de contraintes pour pouvoir les écrire sereinement en BD ou s'assurer qu'on pourra les convertir sans risque.


Nous utiliserons la librairie Apache Commons Validator. Ce code de validation va s'exécuter naturellement au niveau du contrôleur dans une architecture MVC. C'est la seule validation sûre avant d'écrire en BD.

Par contre le retour utilisateur est souvent plus compliqué. Ici nous utilisons un attribut contenant des messages à afficher dans la page.


if (action.equals("/server")){
 // server side validation
 System.out.println("Validation SERVER en cours");
 // creation des validateurs
 CreditCardValidator credit = new CreditCardValidator(CreditCardValidator.AMEX + CreditCardValidator.VISA);
 EmailValidator email = EmailValidator.getInstance();
 IntegerValidator age = IntegerValidator.getInstance();
 // validation
 boolean prenomOk = StringUtils.isAlpha(request.getParameter("prenom"));
 boolean courrielOk = email.isValid(request.getParameter("courriel"));
 boolean creditOk = credit.isValid(request.getParameter("credit"));
 // age est un peu plus complexe
 boolean ageOk = false;
 if (request.getParameter("age") != null && !request.getParameter("age").equals("")){
  ageOk  = age.isInRange(
    Integer.parseInt(request.getParameter("age")), 18, 100);
 }
 // messages pour l'utilisateur
 List<String> messages = new ArrayList<String>();
 if (!prenomOk) messages.add("Veuillez entrer un prénom avec des lettres");
 if (!courrielOk) messages.add("Veuillez entrer une adresse courriel valide");
 if (!creditOk) messages.add("Veuillez entrer une carte de crédit valide");
 if (!ageOk) messages.add("Veuillez entrer un age entre 18 et 100 ans");
 request.setAttribute("erreurs", messages);
 request.getRequestDispatcher("index.jsp").forward(request, response);
 System.out.println("Validation SERVER effectuée");
 return;
}



Validation AJAX

La validation AJAX est une tentative pour obtenir le meilleur des deux mondes:

  • L'interactivité côté client.
  • L'accès aux librairies et aux données côté serveur.
Il s'agit souvent d'une solution intéressante mais elle ne garantit pas que les données finalement envoyées seront correctes et ne dispense donc pas de validation côté serveur.

Dans le cas de JQuery Validation, il suffit de mettre en place une règle "remote". Javascript attend donc une réponse "true" ou "false" selon que le champ est bon ou mauvais.

// definit une regle qui demande au serveur si c bon (true) ou mauvais (false)
$("#ajax").validate({
 rules : {
  fajax : {
   required : true,
   remote : {
    url : 'ajaxValidate',
    type : "post"
   }
  }
 }
});
Dans ce cas, le code contrôleur est plutôt simple et doit juste répondre true ou false.
String[] conjonctions = {"mais","ou","est","donc","or","ni","car"};
String candidat = request.getParameter("fajax");
if (Arrays.asList(conjonctions).contains(candidat)){
 // on repond true si la valeur est bonne
 response.getWriter().print("true");
}
else{
 // on repond false si la valeur est à refuser
 response.getWriter().print("false");
}
Fichiers du projet

Vous trouverez le projet contenant les exemples de validation ici.

Aucun commentaire:

Enregistrer un commentaire