d3:tp04:suite

Ceci est une ancienne révision du document !


D3-TP04-suite : Persistance des données

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

Le travail commencé a permis de gérer approximativement l'authentification, l'affichage d'un menu et l'affichage de la liste des clients.

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.

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

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;
     }
}

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

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.

Vous avez maintenant 2 formulaires dans votre application, testez -les en écrivant dans une zone de texte :

<script>alert("Coucou!");</script> 
  1. Que remarquez-vous ? Pourquoi ?
  2. Vérifier ce qui est sauvegardé dans la base de données.
  3. 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.

  • d3/tp04/suite.1758839318.txt.gz
  • Dernière modification : 2025/09/26 00:28
  • de dthevenot