Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
d3:tp04:suite [2025/09/25 22:44] – [Travail à faire] dthevenot | d3:tp04:suite [2025/09/28 19:10] (Version actuelle) – [V. Attention : injection SQL, faille XSS (Cross-Site Scripting) en vue…] dthevenot | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== D3-TP04-suite : Persistance des données (2) ====== | + | ====== D3-TP04-suite : Projet gestion de clients - Persistance des données (2) ====== |
===== Contexte ===== | ===== Contexte ===== | ||
Nous poursuivons notre application permettant de gestion des clients d'une entreprise de travaux | Nous poursuivons notre application permettant de gestion des clients d'une entreprise de travaux | ||
Ligne 9: | Ligne 9: | ||
===== Travail à faire ===== | ===== Travail à faire ===== | ||
Désormais, il faudrait pouvoir permettre la **saisie d'un nouveau clien**t et enregistrer les données saisies | Désormais, il faudrait pouvoir permettre la **saisie d'un nouveau clien**t et enregistrer les données saisies | ||
+ | |||
+ | ==== 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' | ||
+ | ==== 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", | ||
+ | |||
+ | La méthode **getGeneratedKeys** permet de récupérer l' | ||
+ | |||
+ | Exemple de méthode **create** pour l' | ||
+ | <code ruby ClientMysql.java> | ||
+ | public int create(Client unClient){ | ||
+ | int id=-1; | ||
+ | | ||
+ | |||
+ | try (PreparedStatement prepStmt = theConnection.prepareStatement(sql, | ||
+ | | ||
+ | prepStmt.setString(1, | ||
+ | prepStmt.setString(2, | ||
+ | prepStmt.setString(3, | ||
+ | |||
+ | 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(" | ||
+ | System.out.println(" | ||
+ | System.out.println(" | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ==== III. Créer la classe NouveauClientForm dans le package com.test.forms ==== | ||
+ | | ||
+ | Cette classe contrôlera les saisies effectuées, | ||
+ | |||
+ | Ajouter la méthode **verifierClient(HttpServletRequest request)** : | ||
+ | * Avec les données récupérées, | ||
+ | * 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' | ||
+ | ==== 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**, | ||
+ | |||
+ | ==== V. Attention : injection SQL, faille XSS (Cross-Site Scripting) en vue… | ||
+ | |||
+ | Vous avez maintenant 2 formulaires dans votre application, | ||
+ | |||
+ | - 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. | ||