Conteneur WEB Conteneur d’application
ContactManager Contact Contact
Modèle
Vue
JSP
Contrôleur
Servlets
AddContactForm
Servlet
AddContactExecute
Servlet
ListContact
Servlet
contactForm
contactAdded
contactNotAdded
listContact
Navigateur web
FACADE
EJB session
Remote
Stateless ou stateful
EJB entity
Local
TD6 Initiation aux EJB3 avec Eclipse
Ecriture d’une application J2EE complète
Nous allons écrire une application J2EE qui permet dans un navigateur web de rer des contacts. Pour cela, nous
allons suivre le pattern MVC (Modèle Vue Contrôleur). La vue est l’interface graphique écrite en jsp. Le contrôleur
sera écrit sous forme de servlets qui sont à même de contrôler le séquencement entre les différentes pages du projet.
Enfin, le modèle prendra la forme d’ejbs. L’architecture générale sera la suivante :
Conseil : utilisez les noms de classes et de variable du TD et prenez la version de JBoss de l’archive (7.1.1)
Cette architecture est une architecture J2EE classique.
Le client
Le client est dans la zone internet, il accède de ce fait au système d'information par le conteneur web.
Les servlets
Dans ce conteneur, une ou plusieurs servlets répondent aux demandes des clients. Le conteneur web est par nature
un conteneur fragile car accessible de partout. De ce fait, il est conçu pour contenir uniquement de la présentation ou
des transferts d'information entre le cœur du SI (les processus métiers et le client). De plus, un des apports de J2EE
est de permettre de proposer plusieurs présentations différentes associées aux processus métiers. Par exemple, dans
une agence de voyage, une réservation d'un séjour peut se faire directement par client dans une interface web ou par
le personnel de l'agence dans une application java. Les processus métiers impliqués sont les mêmes mais la
présentation différente. Il faut donc être très attentif à ne pas déplacer une partie du processus métier dans les
servlets. Dans cet exemple, les servlets contiendront uniquement l'appel à l'ejb Facade.
Les ejb
Tout d'abord, la persistance des données est assurée par une base de données mysql. Pour gérer cette base, il est
classique d'associer un ejb entité par table.
Dans tous les systèmes d'information, la base de données est complexe et faite de plusieurs tables interconnectées
par des clés étrangères. De plus, un processus métier fait couramment appel à plusieurs ejb. Par exemple, pour
réserver une chambre pour un client, il faut utiliser les ejb des hôtels et des chambres pour vérifier la réservation puis
l'ejb des réservations pour rajouter la réservation mais aussi l'ejb du client pour ajouter ou rechercher le client. La
gestion de ces processus complexe doit être isolée des ejb entités qui sont chacun dédiés à la gestion d'une table.
Pour cela, une solution est de créer un ejb dit façade qui se charge des processus métiers. Cet ejb ne gère pas de la
persistance mais synchronise les appels aux ejb persistants, il s'agit donc d'un ejb session sans état.
1 Création des projets
1.1 Création du projet WEB
Une fois votre IDE Eclipse lancé cliquez sur : « File -> New ->Project -> Web -> Dynamic Web Project ». Cliquez sur
Next. Remplissez les champs comme ci-dessous. Attention, le nom de l'EAR doit être modifié.
ASI TD6 – Anne Lapujade 1
Il ne vous reste plus qu’à cliquer sur « Finish ».
1.2 Création du projet EJB
Créez un projet EJB « EJB Project » (EJB -> EJB Project). Remplissez la fenêtre comme ci-dessous :
Cliquez sur « Finish» pour terminer l’opération.
1.3 Dépendances
Le projet web va accéder aux EJB, nous devons donc créer une dépendance entre ces deux projets. Faire un clic
droit sur ProjetContactWeb -> Properties. Allez dans Java Build Path et cliquez sur l’onglet Projects. Cliquez sur Add
et sélectionnez ProjetContactEJB.
ASI TD6 – Anne Lapujade 2
Ne vous inquiétez pas si la console JBoss vous indique une erreur " No META-INF/application.xml found".
Nous créerons ce fichier par la suite. Vous pouvez arrêter JBoss.
1.4 Vues finales
Maintenant que vous avez paramétré l’ensemble des projets (Web / EJB / EAR) vous devez avoir les 4 projets
suivants dans votre package explorer :
1.5 Ajout du projet dans l’environnement d’exécution du serveur
Dans l’onglet serveur, clic droit sur JBoss puis choisir Add and remove projects. Ajouter le ProjetContactEAR :
Remarque : vous pouvez comme ci-dessus retirer ProjetEJB du serveur, nous n'en n’aurons plus besoin.
2 Les EJB - ProjetContactEJB
Nous allons mettre en place un exemple simple qui consistera à développer une application web permettant d’ajouter
et lister des contacts dans un agenda.
Notre application a besoin :
de décrire l’entité Contact
de gérer les instances des contacts en base de données
ASI TD6 – Anne Lapujade 3
Pour cela, nous allons utiliser :
1 Entity Bean (permet de mapper notre entité objet Java vers une base de données)
1 Session Bean Stateless (service façade de gestion des instances)
2.1 Entity bean
2.1.1 Base de données
Créez une nouvelle base vide nommée agenda.
2.1.2 Les EJB
Créez un package ejbAgenda dans lequel vous mettrez vos EJB
Utilisez le TD précédent pour :
Créer la datasource
Créer un EJB entité Contact avec les attributs suivants :
private int id;
private String prenom;
private String nom;
private String addresse;
private int codePostal;
private String ville;
private String telephone;
private String mobile;
Remarque : Clic droit + Source + Generate getter and setters permet de gagner beaucoup de temps...
Créer un EJB façade ContactManager qui implante les méthodes suivantes :
* addContact : qui permet d’ajouter un contact
* listContact : qui retourne l’ensemble des contacts trouvés
L’implémentation de ces méthodes est la suivante :
public Contact ajouterContact(Contact contact) {
em.persist(contact);
return contact;
}
public Collection<Contact> listerContact() {
// Vous pouvez aussi utiliser une named query définie dans l’entité (cf TD5)
return em .createQuery( "SELECT c FROM Contact c" ).getResultList();
}
Remarque : pour un même ensemble de processus métiers, il est envisageable, notamment pour des raisons de
sécurité de créer plusieurs façades difrentes. Par exemple, dans le cas d'une banque, on peut avoir une façade
simplifiée pour un client distributeur de billets qui ne donne accès qu'aux méthodes du retrait et de l'édition d'un relevé
simplifié de compte. Par contre, dans le cas d'une application client destinée aux commerciaux de la banque, le
façade donnera accès à toutes les fonctionnalités de la banque.
3 Les servlets : ProjetContactWeb
Nous allons mettre en place le pattern MVC Modèle Vue Contrôleur ») dans notre application Web. Les servlets
sont les contrôleurs et les JSP les vues. La couche modèle est implémentée par les EJB3 Contact et
ContactManager.
Nous allons créer 3 servlets au total :
* AddContactForm : qui permettra d’afficher le formulaire d’ajout de contact
* AddContactExecute : qui ajoute le Contact avec les données du formulaire
* ListContact : qui récupère la liste des Contacts et l’affiche dans un tableau
Les classes suivantes vont être créées dans le projet ProjetContactWeb. Pour cela, clic droit sur
ProjetContactWeb > New package > nommez-le « web ».
3.1 La classe EjbLocator
Une fonctionnalité commune à ces trois servlets est la récupération du ContactManager (EJB Session). Le design
pattern « Locator » est une solution que nous allons utiliser afin de regrouper les mécanismes de localisation des EJB
au sein d’une même classe.
Créez dans le package web une classe EjbLocator dont voici le code source :
package web;
import java.util.Hashtable;
ASI TD6 – Anne Lapujade 4
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import ejbAgenda.ContactManagerRemote;
import ejbAgenda.RendezVousManagerRemote;
public class EjbLocator {
private static Context ctx;
private static EjbLocator instance = new EjbLocator();
private EjbLocator() {
}
public static EjbLocator getLocator() {
return instance;
}
private <T> T getEjb(Class<T> ejbClass, String beanName) {
try {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "ProjetContactEAR";
final String moduleName = "ProjetContactEJB";
return (T) context.lookup("java:global/" + appName + "/" + moduleName + "/" + beanName + "!"
+ ejbClass.getName());
} catch (NamingException e) {
return null;
}
}
public ContactManagerRemote getContactManager() {
return getEjb(ContactManagerRemote.class, "ContactManager");
}
}
Cette classe implémente le pattern Singleton afin de gérer la propre instanciation de son unique instance.
Vous pouvez remarquer l’utilisation des Generics (méthode getEjb).
3.2 La servlet d’affichage du formulaire d’ajout de contacts
Le code des servlets est alors très basique. Créez une servlet dans le package web du projet ProjetContactWeb
Fichier/Nouveau/Web/Servlet
ASI TD6 – Anne Lapujade 5
1 / 10 100%