Connexion
Introduction
Les principales maquettes dont celle de la fenêtre de connexion ont été créées et la gestion des événements a été traitée dans le chapitre Maquettes. Il s’agit dans ce chapitre de mettre en place tous les contrôles nécessaires avant d’autoriser l’accès à l’application. Simultanément, il faut gérer l’accès au serveur et à la base de données en prenant en compte les problèmes possibles de connexion.
Paramètres de connexion
JPA fournit un mécanisme général de configuration de la connexion à la base de données. Ce mécanisme s’appuie sur la présence d’un fichier particulier à un endroit donné. La première étape, vue au chapitre Base de données MySQL, a été de créer ce fichier et de l’avoir configuré avec les données de connexion à la base. Il sera complété ensuite au fur et à mesure de l’avancement du projet.
Répétez la création du fichier « persistence.xml » dans le répertoire src/main/resources/META-INF du projet de gestion.
Ajoutez le pilote JDBC MySQL dans les propriétés du projet.
Ajoutez les fichiers jar issus de la librairie EclipseLink.
Testez l’accès à la base de données avec la classe TestJPA qui a été codée au chapitre Base de données MySQL, en l’important dans le projet de gestion Oxygen.
Il est ensuite temps de s’intéresser à la méthode d’accès aux données de l’application.
Pour faire simple et rapide, le nom de l’utilisateur et le mot de passe sont uniques pour tous les utilisateurs de l’application. Les paramètres concernant le pilote, le serveur et la base de données proviennent de l’installation réalisée pour le SGBDR MySQL (cf. chapitre Base de données MySQL), ainsi que les données d’identification.
Dans une application plus réaliste, il serait possible de créer des tables utilisateurs avec pour chaque utilisateur un couple login/mot de passe unique et un identifiant d’accès unique à la base. Une autre possibilité serait de gérer les utilisateurs via la base de données elle-même, l’application se chargeant d’injecter...
Mise en service de la fenêtre de connexion
La fenêtre FConnexion va passer ici du statut de maquette à celle de fenêtre opérationnelle.
Commencez par rajouter un package nommé « dialogue ».
Recopiez dans ce package toutes les classes maquette.
La classe FConnexion est une IHM. Elle se contente de transmettre la demande de l’utilisateur à la classe Connexion pour la connexion à la base de données.
Ouvrez la classe graphique FConnexion avec WindowBuilder Editor.
Complétez les imports.
import controle.connection.Connexion;
Allez dans la méthode valider() et remplacez le code suivant :
boolean valide = true; // ce code sera remplacé plus tard
par :
String leNom = txtSaisieUtilisateur.getText();
String leMotDePasse = String.valueOf(
pwdMotDePasse.getPassword());
Connexion connexion = Connexion.getConnexion();
boolean valide = connexion.controle(leNom, leMotDePasse);
Le contrôle de saisie s’effectue avec la méthode controle() de la classe Connexion.
L’expression pwdMotDePasse.getPassword() renvoie un tableau de caractères.
Pour des raisons de sécurité à l’utilisation de la classe JPasswordField, Java fait une distinction entre les chaînes de caractères déclarées avec la classe String et les tableaux de caractères.
// accepté
char[] vChar = pwdMotDePasse.getPassword();
// refusé
String leMotDePasse = pwdMotDePasse.getPassword();
Il faut convertir le tableau de caractères en chaîne de caractères, conversion réalisée avec la méthode statique valueOf() de la classe String.
leMotDePasse = String.valueOf(pwdMotDePasse.getPassword());
Ces contrôles s’effectuent de deux manières : si la saisie du login/mot de passe...
Lecture des enregistrements
À ce stade, il est temps de faire quelques tests d’écriture et de lecture des données dans la base, à l’aide de la classe TestJPA.
Ajoutez d’abord une méthode toString() à cette classe en utilisant l’option Source - Generate toString()… du menu contextuel. Elle permettra d’avoir plus de confort dans l’affichage des données.
@Override
public String toString() {
return "TestJPA [clePrimaire=" + clePrimaire
+ ", message=" + message
+ "]";
}
Modifiez ensuite la méthode main() de la classe TestJPA comme ceci :
public static void main(String[] args) {
Connexion connexion = Connexion.getConnexion();
// création de données de test
TestJPA test1 = new TestJPA();
test1.clePrimaire = 1;
test1.message = "message 1";
TestJPA test2 = new TestJPA();
test2.clePrimaire = 2;
test2.message = "message 2";
TestJPA test3 = new TestJPA();
test3.clePrimaire = 3;
test3.message = "message 3";
// démarrer une transaction
EntityTransaction transaction = em.getTransaction();
transaction.begin();
// persister les éléments dans le gestionnaire d'entités
em.persist(test1);
em.persist(test2);
em.persist(test3);
// synchroniser le gestionnaire avec la base
em.flush();
em.remove(test3);
// finaliser la transaction
transaction.commit();
// les données sont maintenant en base
}
Pour effectuer une opération d’écriture vers la base, JPA doit obligatoirement être dans une transaction active. Cette transaction se récupère par la méthode...