====== D3-TP04-suite : Projet gestion de clients - 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 clien**t 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 (avec requête préparée):
public int create(Client unClient){
int id=-1;
String sql = "INSERT INTO client (nom, prenom, mail) VALUES (?,?,?);";
try (PreparedStatement prepStmt = theConnection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
prepStmt.setString(1, unClient.getNom());//le param. 1 est remplacé par le nom du client
prepStmt.setString(2, unClient.getPrenom());
prepStmt.setString(3, unClient.getMail());
int status = prepStmt.executeUpdate();
// récupération de la clé auto-générée
if (status > 0) {
try (ResultSet result = prepStmt.getGeneratedKeys()) {
if (result.next()) { // <-- utiliser next() et pas first()
id = result.getInt(1);
}
}
}
prepStmt.close();
} catch(SQLException ex){
System.out.println("SQLException:"+ex.getMessage());
System.out.println("SQLState:"+ex.getSQLState());
System.out.println("code Erreur:"+ex.getErrorCode());
}
return id;
}
}
==== 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 :
- 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 "<" :
* Utiliser une expression régulière et la méthode matches pour vérifier qu'il n'y a que des caractères
Tester.