TP3 EJB/JSF/JPA 2014-2015 gestion de comptes bancaires

De $1

Introduction

Dans ce TP, contrairement aux TPs précédents, nous allons écrire une application de gestion de comptes bancaires, mais sans partir de tables pré-existantes. Vous utiliserez une entité CompteBancaire et un session bean GestionnaireDeCompteBancaires. Le TP comporte également l'écriture de pages JSF et de  Backing Beans pour accèder à ses comptes, déposer ou retirer de l'argent, transférer de l'argent d'un compte bancaire à un autre, chercher des comptes...

Vous travaillerez sur une nouvelle base de données ! Afin de ne pas "casser" celle qui est livrée en exemple (jdbc/sample...)

Création d'une base de donnée "Banque"

Netbeans comprend un outil basique de gestion de SGBD. A partir de l'onglet "services" vous allez ajouter une nouvelle base à la base de données Derby. Ainsi vous n'aurez plus de soucis quant à la création de nouvelles tables, etc.

Snap1.jpg

Donnez ensuite un nom à votre base. Vous DEVEZ OBLIGATOIREMENT donner un login/password.

Pour les M2 Nice : NE CHOISISSEZ PAS LE MEME NOM QUE MOI, Prenez un nom qui contient vos noms de famille ou de binome car ce TP sera à me rendre et il sera noté ! Comme j'importerai vos bases de données, elles doivent toutes avoir un nom différent ! Pas d'espace ou de caractères bizarres dans le nom ! Par ex : "BanqueTotoTata" avec Toto et Tata nom du binome.

Votre base doit apparaître dans la liste "Java DB". Faites clic droit/Se connecter

Snap3 (1).jpg

Vous devriez voir votre base dans la liste, et vous devriez pouvoir commencer à administrer votre base:.

Snap4.jpg

Ne faites rien pour le moment, car dans ce projet les tables vont êtres crées à partir des classes Java des entity beans !

Ajout de la base de données banque dans Glassfish

Il devrait être possible de configurer le projet pour que la base de données soit "déployée" en même temps que le projet que nous allons réaliser. En raison d'un bug de Netbeans 8.1 et/ou de Glassfish, cette technique ne fonctionne pas. Nous allons donc ajouter "manuellement" la base de données à GlassFish en utilisant sa console d'administration. Il existe d'autres possibilités dont on parlera en cours (en configurant la base dans des annotations de code, en ajoutant la base via la ligne de commande, en utilisant Maven).

  • Ouvrez la console d'administration de Glassfish (view domain admin console),
  • Allez dans JDBC, ouvrez cette option dans le menu de gauche,
  • Vous verrez deux entrées "JDBC ressources" et "JDBC connexion pool",
  • Allez dans cette dernière option, et cliquez sur "new/nouveau",
    • Pool name = Banque
    • Resource Type = javax.sql.DataSource
    • Database vendor = Derby (c'est JavaDB)
    • Cliquer sur Next
    • Ecran suivant, allez en bas là où il y a toutes les propriétés,
    • Dans un autre onglet ouvrez à nouveau la console d'admin et allez voir pour la base sample les propriétés qui sont renseignées, il faut renseigner ces six là, et enlever toutes les autres
    • JDBC Pool properties.jpg
    • Remplacez user/pass, DatabaseName et URL par ceux correspondant à votre base.
    • Cliquez sur Finish
    • Recliquez sur JDBC Connection Pool et sélectionnez votre base, cliquez sur le bouton PING, si il y a une erreur, vérifiez les propriétés que vous avez entrées, il doit y en avoir six, et les valeurs doivent correspondre à la base créée dans NetBeans. Pas la peine d'aller plus loin si ce point ne marche pas.
       
    • Maintenant allez dans l'onglet JDBC Resources et faites nouveau/new
    • Indiquez comme nom jdbc/banque ou un nom qui commence par jdbc/ c'est la convention,
    • Dans la liste déroulante en dessous choisissez la base que vous aviez configuré.
    • Voilà, maintenant vous pourrez faire "create entity from database ou create entity" et la base de données sera proposée dans la liste du wizard de NetBeans...

Ecriture d'une entité CompteBancaire

Vous allez créer un nouveau projet, à la manière du TP1. Donnez-lui un nom qui comporte votre nom de binome ! Par exemple "TP3BanqueTitiTata"

Au lieu de créer un entity bean à partir d'une table (Classe entité provenant de la base de données...), vous ferez une simple création d'entité (Classe entité...). 
- donnez-lui le nom CompteBancaire, et spécifiez un package, entity par exemple (ne tenez pas compte de la copie d'écran pour ces 2 noms).
- cochez Create Persistence Unit. Il se peut que l'interface graphique soit différente avec votre version de NetBeans (les screenshots datent de NetBeans 6).

Snap5 (1).jpg

Dans la création de la "Persistence Unit", vous indiquerez bien sur la nouvelle source de données que vous venez de créer. Choisissez bien la base de données que vous avez créée.

Dans le code source de l'entité, vérifier qu'une propriété est le numéro d'identification (la clé primaire, déclaré par l'annotation @Id), qui est en mode auto-incrément: (déclaré par l'annotation @GeneratedValue(strategy=GenerationType.AUTO)

Modifier l'entité CompteBancaire afin que chaque compte bancaire possède :

  • Le nom du propriétaire,
  • Le solde du compte.

Note : vous pouvez utiliser le menu "insert code/add property" pour générer en même temps les get/set.

Comme dans le cours, ajouter une méthode pour retirer de l'argent, pour en ajouter et pour consulter le solde, ainsi qu'un constructeur prenant en paramètre le nom du propriétaire et le solde initial :

 

public CompteBancaire(String nom, int solde) {
    this.nom = nom;
    this.solde = solde;
  }
  
  public void deposer(int montant) {
    solde += montant;
  }
  
  public int retirer(int montant) {
    if (montant < solde) {
      solde -= montant;
      return montant;
    } else {
      return 0;
    }
  }

Ce n'est pas grave si il n'y a pas de table pour les comptes bancaires, vous verrez que le serveur la créera automatiquement lors du premier déploiement du bean CompteBancaire.

Compilez. Vérifiez qu'il n'y a pas d'erreurs.

Ecriture d'un session bean façade : GestionnaireDeCompteBancaire

Vous allez maintenant écrire un session bean GestionnaireDeCompteBancaire, ce sera un session bean stateless. Ce session bean va proposer pour le moment deux fonctionalités (vous pouvez vous inspirer du TP 1 pour les implémenter) :

  • créer un compte bancaire : public void creerCompte(CompteBancaire c) {...} qui va insérer le compte dans la base.
  • retourner la liste des comptes bancaires par exemple public List<CompteBancaire> getAllComptes() {...} qui va faire l'équivalent d'un select * dans la base.

Vous ajouterez une méthode creerComptesTest() qui va créer quatre comptes, pour John, Paul, Georges et Ringo, avec les sommes suivantes. Ne faites pas attentions aux numéros de comptes, vous n'avez pas à les préciser puisque vous êtes en clé primaire générée automatiquement.

public void creerComptesTest() {
   creerCompte(new CompteBancaire("John Lennon", 150_000));
   creerCompte(new CompteBancaire("Paul McCartney", 950_000));
   creerCompte(new CompteBancaire("Ringo Starr", 20_000));
   creerCompte(new CompteBancaire("Georges Harrisson", 100_000));
}

 

Ecriture d'une page JSF et du backing bean associé

En vous inspirant de ce qui a été fait dans les précédents TPs, vous implémenterez les fonctionnalités suivantes :

  1. Template de présentation : un menu à gauche et une page principale au centre. Une fois généré par NetBeans, ajoutez-y une nouvelle partie "metadata" avant <h:head> (<ui:insert name="metadata"/>) ; par défaut elle est vide mais les clients du template pourront y mettre une section <metadata>, en particulier pour les paramètres de vue. Parmi les options du menu sur la gauche on trouvera les fonctionnalités suivantes...
  2. Affichage d'une table contenant tous les comptes bancaires, comme dans le TP1,
  3. Possibilité lorsqu'on clique sur un compte d'afficher un formulaire pour ajouter ou retirer de l'argent,
  4. Possibilité de transférer de l'argent d'un compte à l'autre. Pour le moment on affichera un formulaire dans lequel on entrera les clés primaires du compte source, du compte destination, puis la somme à transférer.
  5. Possibilité de supprimer un compte.

Dans un second temps, on modifiera le tableau pour ne pas "connaitre à l'avance tous les comptes bancaires", mais en utilisant une pagination "intelligente" (lazy loading dans la doc PrimeFaces). En d'autres termes, on ne requêtera les comptes que 20 par 20 ou 10 par 10 et chaque fois que l'on change de page, on requêtera les 10 ou 20 comptes suivants. En gros, au lieu d'avoir une méthode getAllComptes() dans le gestionnaire de comptes bancaires, on aura une méthode List<CompteBancaire> getComptes(int start, int nombreDeComptes)...

Bien entendu, vous utiliserez un Backing Bean pour les traitements et vous ajouterez dans le session bean GestionnaireDeComptesBancaire les méthodes nécessaires pour transférer, déposer, retirer de l'argent, chercher un compte etc. Vous essaierez également des transferts impossible et voir comment le système se comporte, peut-on se retrouver avec les données dans un état incohérent

Dans le prochain TP nous allons utiliser des relations pour associer aux comptes bancaires des clients (un client pourra avoir plusieurs comptes) et des opérations bancaires (débits, dépôts, transferts, création du compte, etc)

Il s'agit d'un long TP qui va durer plusieurs séances... et qui sera à rendre.