Afficher la pageAnciennes révisionsLiens de retourHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== 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): <code ruby ClientMysql.java> 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; } } </code> ==== 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 : <code><script>alert("Coucou!");</script> </code> - 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. d3/tp04/suite.txt Dernière modification : 2025/09/28 19:10de dthevenot