TP3 2011-2012 JSF2/EJB : Ecriture d'un gestionnaire de comptes bancaires

De $1

Version de 11:44, 18 Avr 2024

cette version.

Revenir à liste des archives.

Voir la version actuelle

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 netbeans 7 (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".

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 :

  • 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("Cartney", 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, 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.

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.