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