D3-TP04 : Projet gestion de clients(4) - Persistance des données (1)
Note:
- fichier configuration mariadb sur le serveur(sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf) à modifier (bind-address=0.0.0.0) pour accès distant
- relancer le serveur
- Mettre le .jar du jdbc dans les librairies du serveur web (C:\payara6\glassfish\domains\domain1\lib) et/ou ajouter la dépendance
- tester la configuration de l'accès à la bd dans Netbeans (Services → Bases de données) avant de commencer.
avec MAVEN
Ajouter une dépendance (pom.xml) :
<dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>3.3.3</version> </dependency>
Contexte
Nous poursuivons notre application de gestion des clients. 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 et l'affichage d'un menu. Les pages permettant de créer un nouveau client ou de les lister sont créées, mais elles ne font rien.
Travail à faire
Désormais, il faudrait pouvoir afficher la liste des clients.
- Pour cela, vous allez créer la base de données bdclient qui contient pour l’instant la table client(id, nom,prenom, mail), id autoincrémenté.
- Créer un bean Client correspondant à la description de la table client de la base de données
- Mettre en place le connecteur JDBC (mariadb-java-client-3.5.6.jar sur le drive et voir SIO1/scannetteTP4)
- Copier le connecteur dans les librairies de Payara (ex :C:\payara6\glassfish\domains\domain1\lib)
- Depuis le Drive, récupérer la classe Connexion et la déposer dans l'application dans un nouveau package com.test.bdd créé au niveau du répertoire Source Packages. Cette classe permet d'établir une connexion à la base de données.
Par la suite, pour établir une connexion, il faudra écrire : Connection theConnection = Connexion.getConnect( “192.168.100.100”, “bdclient”, “adminBDClient”, “mdpBDClient”);
La méthode getConnect est une méthode statique, qui peut donc être utilisée sans avoir besoin d'instancier la classe Connexion. Elle a besoin de 4 paramètres : le serveur de base de données, le nom de la base de données, un user de connexion avec son mot de passe associé.
I. Création de la classe ClientMysql
Cette classe sera dédiée aux requêtes SQL concernant la table client. Elle disposera d'un attribut : laConnexion de type Connexion et nous y implanterons les méthodes CRUD :
- Une méthode permettant de créer une occurrence, méthode create
- Une méthode permettant de lire une occurrence, méthode read
- Une méthode permettant de mettre à jour une occurrence, méthode update
- Une méthode permettant de supprimer une occurrence, méthode delete
- Une méthode permettant de retrouver toutes les occurrences, méthode readAll
Créer la nouvelle classe Java ClientMysql dans le package bdd
- Déclarer et initialiser l'attribut laConnexion
- Écrire la méthode readAll. Cette méthode n'a pas besoin de paramètre, et retourne une collection de clients
Les requêtes SQL ont besoin d'un objet de type Statement qui contiendra la requête SQL executeQuery. Cette méthode retourne un objet de type ResultSet (jeu d'enregistrements). Il faut appliquer la méthode next() au ResultSet obtenu pour se positionner sur un enregistrement. Ensuite, les méthode getInt(“nomAttribut”) ou getString(“nomAttribut) permettent de récupérer les valeurs des attributs.
Exemple :
- reaAll()
public ArrayList<Client> readAll(){ ArrayList<Client> lesClients=new ArrayList<>(); try { Statement stmt=theConnection.createStatement(); ResultSet resultQ=null; resultQ=stmt.executeQuery("SELECT * FROM client;"); while (resultQ.next()){ Client resultat=new Client(resultQ.getInt("id"),resultQ.getString("nom"),resultQ.getString("prenom"),resultQ.getString("mail")); lesClients.add(resultat); } resultQ.close(); stmt.close(); } catch(SQLException ex){ System.out.println("SQLException:"+ex.getMessage()); System.out.println("SQLState:"+ex.getSQLState()); System.out.println("code Erreur:"+ex.getErrorCode()); } return lesClients; } }
II. Modification de la servlet ListeServlet.java
Modifier la méthode doGet. Avant de solliciter la jsp, elle devra :
- Créer un objet de type ClientMysql
- Appeler la méthode readAll appliquée à cet objet
- transmettre la collection retournée (lesClients) par la méthode readAll à la vue par l'intermédiaire de l'objet request
III. Modification de la jsp listeclientsVue.jsp
La jsp devra afficher les clients présents dans la collection lesClients.
Optimisation du code
Fichier .env
Un fichier .env est un fichier de configuration qui permet de stocker des variables d’environnement nécessaires au fonctionnement de l'applications. Il joue un rôle crucial dans la gestion des paramètres sensibles tels que les clés API, les informations sur les bases de données ou d’autres configurations environnementales qui ne devraient pas être visibles dans le code source. Grâce à ce type de fichier, les développeurs peuvent garantir la sécurité des données tout en conservant une flexibilité dans la configuration des projets.
Avec Jakarta EE et serveur Payara
Le fichier .env peut être créé à la racine de ton projet (là où se trouvent le fichier pom.xml, le dossier src/) :
Exemple de contenu :
DB_HOST=192.168.100.100 DB_NAME=bdclient DB_USER=adminBDClient DB_PASSWORD=mdpBDClient
Dans les fichiers de configuratin (Project Files-fichier pom.xml), ajouter une dépendance dotenv-java (librairie utilisable avec Maven) :
<dependency> <groupId>io.github.cdimascio</groupId> <artifactId>dotenv-java</artifactId> <version>3.0.0</version> </dependency>
Dans le code,
- importation de l librairie :
import io.github.cdimascio.dotenv.Dotenv;
- exemple d'utilisation pour la connexion à la base de données :
// 1.Chargement du fichier .env à la racine du projet Dotenv dotenv = Dotenv.load(); // 2. Initialisation des paramètres de connexion String host = dotenv.get("DB_HOST"); // Serveur de bd String dbname = dotenv.get("DB_NAME"); // Nom bd String url = "jdbc:mariadb://" + host + "/" + dbname; // url de connexion url += "?autoReconnect=true"; // Ajout 26/09/2021 System.out.println("url : "+url); String user = dotenv.get("DB_USER"); // nom du user System.out.println("nomUtil : "+user); String passwd = dotenv.get("DB_PASSWORD"); // mot de passe System.out.println("mdp : "+passwd); // 3. Connexion connect = (Connection) DriverManager.getConnection(url, user, passwd);
Pour le déploiement
Dans pom.xml, configurer le plugin maven-resources-plugin pour que .env soit copié dans le target/ à chaque build.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <id>copy-env</id> <phase>process-resources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.outputDirectory}</outputDirectory> <resources> <resource> <directory>${basedir}</directory> <includes> <include>.env</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin>