TP sur les EJB

Page Home (contact) Retour TPs

Support de cours


Remarque générale importante

NetBeans est un outil très pratique pour générer automatiquement du code. Ses facilités sont utilisées dans ce TP et les suivants sur JSF pour gagner du temps et arriver à des résultats plus motivants.

Cependant, ce cours n'est pas un cours sur le maniement de NetBeans mais un cours sur la programmation d'une application Web en Java. A chaque fois que NetBeans génère automatiquement du code, vous devez donc aller examiner le code et le comprendre. N'hésitez pas à demander des précisions à l'enseignant si vous ne comprenez pas.

EJB "façade" pour les accès à une base de données

Dans le TP précédent vous avez accédé à une base de données depuis un servlet.

Il vaut mieux isoler les accès à une base de données dans une classe à part. Vous utiliserez pour cela un EJB et JPA.

Créez un projet NetBeans de type "Web application" (sous "Java Web"), nommé Ejbs.

Création de la source de données et génération des entités JPA

Vous allez utiliser NetBeans pour générer automatiquement les entités JPA relatives aux tables PERSONNE et DEPARTEMENT créées lors du cours TIC409 (on n'utilisera pas les autres tables PROJET2 et PARTICIPATION2. Dans le cours TIC409 vous avez vu comment créer des tables à partir des entités ; dans ce TP vous allez voir comment créer des entités à partir des tables.

Clic droit sur le projet et New > Entity Classes from Database...

Pour le moment aucune Data Source ne correspond à la base de données que vous voulez utiliser. Au bas de la liste des Data Source choisissez "New Data Source...". Une fenêtre "Create Data Source s'ouvre" ; donnez le nom JNDI "jdbc/employes". Choisissez la Database Connection "jdbc:derby://localhost:1527/employes [toto on TOTO]" associée aux tables avec lesquelles vous voulez travailler. NetBeans examine la base de données et vous propose toutes les tables de la base. Choisissez PERSONNE et comme la case "Include Related Tables" est cochée, la table DEPARTEMENT sera aussi choisie.

Cliquez sur Next. Vous allez mettre les classes entités dans le paquetage entites (à indiquer dans le champ "Package"). Vous pouvez décocher "Generate JAXB Annotations" car vous ne l'utiliserez pas. Laissez cocher "Create Persistence Unit".

Cliquez sur Next. Laissez toutes le valeurs par défaut et cliquer sur Finish. Attendez le résultat un petit moment (il y a du travail...).

Examinez le résultat. Commencez par regarder l'arborescence des fichiers de l'application en cliquant sur l'onglet "Files" à gauche. Les fichiers de l'application sont sous le répertoire build/web (les autres répertoires de build sont utilisés par Netbeans) :

Revenez à l'onglet "Projects" qui présente les fichiers et ressources de l'application d'une manière plus simple pour le développeur.

Tout ce qui a été généré n'est pas parfait. Le plus gros problème est que NetBeans n'a pu construire la hiérarchie d'héritage pour les personnes, les clients et les employés. Des noms de variables d'instance ne sont pas non plus les meilleurs (Departement departementId; au lieu de Departement departement;) mais ça suffira pour ce que vous allez faire dans ce TP (dans un prochain TP vous utiliserez la bonne hiérarchie d'héritage pour les entités, comme dans le TP sur JPA).

Malgré les imperfections ce type de génération automatique peut vous faire gagner beaucoup de temps et il est important de savoir comment faire ; regardez en particulier le travail sur les associations.

Hormis les classes, NetBeans a aussi généré des fichiers de configuration :

Création des EJBs façade

Clic droit sur le projet puis New. Il faudra sans doute choisir "Other" pour choisir ensuite "Entreprise Java Beans" (ça dépend de ce que vous avez fait avant). Choisissez "Session Beans For Entity Classes". Cliquez sur Next.

Choisissez les 2 entités. Cliquez sur Next.

Donnez le nom "ejb" pour le paquetage. Ne cochez aucune case pour le type d'interface (Local ou Remote) ; en ce cas, aucune interface ne sera créée à part (l'interface constituée des méthodes publiques sera utilisée). Vous auriez aussi pu créer une interface locale car les EJB seront utilisés par un servlet qui est sur le même serveur d'application.

Etudiez les classes générées dans le paquetage ejb. Il y a une classe mère abstraite et les 2 EJBs sessions, façades pour les départements et les personnes. La plus grande partie du code est dans la classe mère : méthode CRUD pour gérer la persistance JPA des données de l'entité. Vous pouvez le prendre comme exemple pour votre code JPA par ailleurs. Le code JPA utilise la librairie "Criteria" (un peu complexe mais plus sûre que le langage JPQL).

Ajout du servlet

Recopiez dans ce projet le servlet ListeEmployes du TP sur les servlets (créez d'abord le paquetage du servlet avec New "Java package", puis copiez le servlet dans le paquetage).

Modifiez le code du servlet pour utiliser l'EJB façade pour afficher toutes les personnes (y compris les clients) :

Testez en lançant l'exécution du servlet comme vous l'avez fait lors du TP sur les servlets.

Modifiez le code pour n'afficher que les employés (sans changer l'EJB).

Correction :

Servlet ListeEmployes


Ajout de données dans la base

Pour "faire plus vrai" vous allez ajouter des données dans la base.

Pour remplir les tables avec de nombreuses données vous pouvez aussi utiliser un utilitaire pour générer des données tel que celui que vous trouverez à l'adresse http://www.generatedata.com (onglet Generator, cocher SQL, choisir MySQL pour échapper aux VARCHAR2, décocher "Enclose table and field names with backquotes") ; voici, par exemple, un fichier généré par cet outil ; il suppose que vous avez créé au moins 3 départements d'id 1, 2 et 3. Le problème est que l'outil entoure les nombres avec des '. Pour les enlever j'ai simplement copié les données dans NetBeans et utilisé le replace qui accepte les expressions régulières (ce replace est peu connu mais bien utile parfois) : remplacer "VALUES \('(\d+)','([123])','(\d+)'," par "VALUES ($1,$2,$3,".

Faites exécuter le script : onglet Services (à gauche) > Databases. Ouvrez la base employes si elle ne l'est pas déjà. Clic droit sur la table PERSONNE puis "Execute Command...". Collez le script dans la fenêtre de droite puis cliquez sur l'icône en haut avec un triangle vert ("Run SQL") ou tapez Ctrl Maj E.

Allez voir le résultat dans la table PERSONNE (clic droit sur la table et "View Data..."). Même les clients ont des numéros de département mais ça ne sera pas gênant ; si vous voulez vous pouvez les enlever facilement en lançant la requête SQL update TOTO.PERSONNE set departement_id = null where dtype = 'Client'.


Modification des données

Écrivez un nouveau servlet "Formulaire" qui affiche un formulaire pour modifier le salaire d'un employé. Faites simple : le formulaire demande l'identificateur de l'employé et le nouveau salaire.

Est-ce que vous devez coder un commit ?

Pour la première version, supposez que l'utilisateur n'a pas fait d'erreur en saisissant les valeurs dans le formulaire. Une nouvelle page est affichée indiquant que le salaire de l'employé a bien été modifié.

Vérifiez que le salaire a bien été modifié en allant voir directement dans la base de données par NetBeans.

Pour la version suivante, gérez les erreurs de l'utilisateur en affichant un message d'erreur si l'utilisateur n'a pas saisi un nombre pour l'identificateur ou le salaire ou si l'identificateur ne correspond à un employé. Faites simple ; il suffit juste que l'utilisateur se rende compte qu'il a fait une erreur.

Attention, pendant les tests, vérifiez que l'adresse du navigateur désigne bien "Formulaire" quand vous saisissez les données.

Correction :

Les classes


EJB stateful

Un exemple d'EJB stateful sera donné dans le prochain TP sur JSF


Pour ceux qui ont déjà fini...

Créez un autre projet et commencez cette fois-ci par créer les classes entités. Générez ensuite les façades à partir de ces entités.


Retour TPs