TP3 2016-2017 JSF2/EJB : Ecriture d'un gestionnaire 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 !

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 "new data source" dans le menu déroulant "Data Source", cette option indique que la base est nouvelle (qu'elle n'est pas déjà connue par le serveur comme sample du TP1) et que vous comptez la déployer avec l'application. Dans ce cas, lors du premier déploiement, glassfish "connectera" la base à partir du fichier glassfish-resources.xml qui va être généré dans votre application et qui décrit cette connexion.

Snap6 (1).jpg

Vérifier qu'un fichier glassfish-resources.xml (avant il s'appelait "sun-ressource.xml" avec glassfish3/netbeans 6.9) est apparu dans l'arbre du projet ejb, sous "server resources". C'est ce fichier qui va permettre à glassfish de se connecter à la base de données, qu'il ne connaissait pas avant. Regardez le source de ce fichier !

NOTE: avec Netbeans 8.0.2 il y a un bug, renommez le fichier glassfish-resources.xml en sun-resources.xml, sinon lors du déploiement, la serveur ne rajoutera pas automatiquement la base de données à ses connexions.

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", 150000));
   creerCompte(new CompteBancaire("Paul McCartney", 950000));
   creerCompte(new CompteBancaire("Ringo Starr", 20000));
   creerCompte(new CompteBancaire("Georges Harrisson", 100000));
}

 

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.

BIEN QU'ON FOURNISSE DES CORRECTIONS CI-DESSOUS, vous pouvez vous en inspirer, mais pas faire du copier/coller.

EMSI Casa 2016: TP3 pas fini fait en cours avec video de live coding

Jeudi 29/10 début du TP3

Vendredi 30: fin TP3 + TP4 + Lazy loading + Ajax + messages + initBD au déploiement + validation/Exceptions + relations

 

Note: pour faire marcher ce projet chez vous: 

  1. Dezipper et ouvrir le projet triangle avec NetBeans + cocher la case "ouvrir projets dépendants" à droite, pour ouvrir les trois projets (triangle, grain de café et globe terrestre)
  2. Supprimez les fichiers persistence.xml et sun-resources.xml dans le projet EJB
  3. Créez une nouvelle base de données dans NetBeans, par ex: "BDbuffa"
  4. Click droit dans le projet EJB/grain de café et new/other/persistence/persistence Unit
  5. Choisir "new data source"
  6. Donner le nom que vous voulez et selectionnez dans le menu déroulant la connexion à BDbuffa
  7. Cocher drop and create
  8. Vérifier dans les EJBs qu'il n'y a pas de nom après @PersistenceContext
  9. Clean and build et run

Vieille Correction du TP3

Ces corrections n'intègrent pas le Lazy Loading de la datatable.

Correction faite par des élèves, incluant le Lazy Loading.