Ceci est une ancienne révision du document !
D3-TP04-suite : Persistance des données (2)
Contexte
Nous poursuivons notre application permettant de gestion des clients d'une entreprise de travaux publics. Cette application doit permettre :
- De s'authentifier,
- De créer un nouveau client,
- De lister les clients
Travail déjà effectué
Le travail commencé a permis de gérer approximativement l'authentification, l'affichage d'un menu et l'affichage de la liste des clients.
Travail à faire
Désormais, il faudrait pouvoir permettre la saisie d'un nouveau client et enregistrer les données saisies dans la base de données bdclient.
I. Création du formulaire de saisie
Modifier la page nouveauClientVue.jsp en y insérant un formulaire qui devra permettre de saisir toutes les données de la table client (Sauf l'id qui s'incrémente automatiquement). Ce formulaire lancera la méthode doPost de la servlet NouveauServlet.java en cas de soumission. Une fois la création du client terminée, un message indique à l'utilisateur : le client no ….. a été créé avec succès
II. Modification de la classe ClientMysql
Cette classe est dédiée aux requêtes SQL concernant la table client.
La méthode readAll est déjà écrite, il faut désormais ajouter la méthode create(Client unClient).
Rappel : Les requêtes SQL ont besoin d'un objet de type Statement qui contiendra la requête SQL. La méthode executeUpdate appliquée à cet objet exécute la requête. Cette méthode retourne le nombre de lignes affectées par la requête. Les accès à la base de données sont des instructions “à risque”, c'est pourquoi elles seront encadrées par try { …}.
La méthode getGeneratedKeys permet de récupérer l'identifiant du client créé.
Exemple de méthode create pour l'ajout d'une occurrence dans une table Salarie :
III. Créer la classe NouveauClientForm dans le package com.test.forms
Cette classe contrôlera les saisies effectuées, puis permettra la création du client (Cf exemple AuthentifForm.java)
Ajouter la méthode verifierClient(HttpServletRequest request) :
- Avec les données récupérées, créer un nouveau client.
- Créer une instance de ClientMySQL
- Appeler la méthode create en lui passant le nouveau client créé
- Tester le retour de cette méthode et adapter le message dans resultat
- Tester la création, vérifier l'ajout de l'enregistrement dans la table client
IV. Modifier la méthode doPost de la servlet NouveauServlet.java
Cette méthode est exécutée après validation du formulaire de saisie d'un nouveau client. Elle devra instancier un objet de type NouveauClientForm, et appeler la méthode verifierClient. Si l'ajout s'est bien passé, la page de liste des clients s'affichera avec un message indiquant “L'ajout du client xxx s'est bien déroulé”. Sinon, la page de saisie du formulaire se réaffichera avec un message d'erreur.
V. Attention : injection SQL, faille XSS (Cross-Site Scripting) en vue…
Vous avez maintenant 2 formulaires dans votre application, testez -les en écrivant dans une zone de texte :
<script>alert("Coucou!");</script>
- Que remarquez-vous ? Pourquoi ?
- Vérifier ce qui est sauvegardé dans la base de données.
- En quoi cela est-il dangereux ?
Pour résoudre ce problème, de type faille xss, il faudra tester les zones saisies, elles ne devront pas comporter le caractère “<” :
- Modifier la méthode verifierClient de la classe NouveauClientForm, utiliser la méthode indexOf pour vérifier l'absence du caractère “<” au niveau des zones saisies. La création d'un client ne devra se faire que si ce caractère n'a pas été saisi.
Tester.
Pour résoudre le problème de type injection SQL (code SQL introduit dans des variables de sélection), il existe un moyen efficace : les requêtes préparées
Donc utiliser des requêtes préparées.