Institut Supérieur De Gestion De Tunis cours AJEE
3
ème
LFIG BAYOUDHI Chaouki
1
Exemple JSF EJB et Bean géré
I. Enoncé :
Cet exemple est une petite application web proposant deux pages web :
L’une qui affiche un formulaire afin de pouvoir ajouter un livre
(
AjoutLivre.xhtml
),
L’autre qui énumère tous les livres présents dans la base
(
AfficherLivres.xhtml
)
.
Ces deux pages utilisent le bean géré
ControleurLivre
pour stocker les propriétés
nécessaires et pour la navigation.
En utilisant JPA(Java Persistance API) pour la persistance et EJB pour la logique
métier, tout s’emboîte : le bean géré passe tous les traitements métier à
ejbLivre
,
qui
contient deux méthodes :
L’une pour stocker un livre dans une base de données
(
AjoutLivre()
),
L’autre pour récupérer tous les livres (
recupererLivres()
).
ejbLivre
est un
bean de session sans état qui utilise
EntityManager
pour manipuler
une entité
Livre
.
Le principe de navigation entre les pages est très simple : lorsqu’un livre est ajouté, on
affiche la liste. Un lien sur la page de la liste permet de revenir ensuite à la page
AjoutLivre.xhtml
et de créer un autre livre.
Remarque :
Les différents composants sont assemblés dans un fichier .war et déployés sur une
instance de GlassFish et une base de données Derby.
Si on utilise, par exemple le framework Maven, cette application web doit respecter la
structure de répertoires de ce framework, les classes, les fichiers et les pages web
doivent être placés dans les répertoires suivants :
src/main/java
contient l’entité
Livre
,
l’EJB
ejbLivre
et le bean géré
ControleurLivre
.
src/main/resources
contient le fichier
persistence.xml
utilisé
pour associer l’entité à la base de données.
src/webapp
contient les deux pages web
AjoutLivre.xhtml
et
AfficherLivres.xhtml
.
src/webapp/WEB-INF
contient le fichier
web.xml
qui déclare la servlet
FacesServlet
.
pom.xml
est un fichier POM (Project Object Model) de Maven décrivant le projet, ses
dépendances et ses extensions.
Institut Supérieur De Gestion De Tunis cours AJEE
3
ème
LFIG BAYOUDHI Chaouki
2
II. L’entité Livre :
Cest la même entité vue en cours avec les annotations de mapping, j’ai
juste ajouté deux attributs description (résumé du livre) et id (un identifiant généré
automatiquement) et la requête nommée
trouverTousLesLivres
, qui permet de récupérer
tous les livres à partir de la base de données.
Entité Livre avec une requête nommée :
Package
coursJEE.ejbentity;
@Entity
@NamedQuery(name =
"trouverTousLesLivres",
query = "SELECT lv FROM Livre lv")
public class Livre {
@Id
@GeneratedValue
private long id;
@Column(nullable = false)
private String titre;
private float prix;
@Column(length = 2000)
private String description;
private String Code;
private int nbrePages;
// Constructeurs, getters, setters
}
Cette entité doit également être associée à un fichier
persistence.xml
dont le code est
détaillé au dessous.
Le fichier de configuration persistance.xml :
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name= "ExempleUP" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider </provider>
<class>coursJEE.ejbentity.Livre</class>
<properties>
<property name="eclipselink.target-database" value="DERBY"/>
<property name="eclipselink.jdbc.driver" value= "org.apache.derby.jdbc.ClientDriver"/>
<property name="eclipselink.jdbc.url" value="jdbc:derby://localhost:1527/ExempleDB"/>
<property name="eclipselink.jdbc.user" value="Chaouki"/>
<property name="eclipselink.jdbc.password" value="Bayoudhi"/>
</properties>
</persistence-unit>
</persistence>
Ce code permet de configurer la BD « exempleDB » gérée avec le SGBD Relationnel
Derby.
L’unité de persistance ExempleUP définit une connexion JDBC pour la base de
Institut Supérieur De Gestion De Tunis cours AJEE
3
ème
LFIG BAYOUDHI Chaouki
3
données Derby nommée ExempleDB. Elle se connecte à cette base sous le compte
utilisateur Chaouki avec le mot de passe Bayoudhi.
Le marqueur <class> demande au fournisseur de persistance de gérer la classe Livre.
Pour que ce code fonctionne, le SGBDR Derby doit s’exécuter sur le port 1527 et les
classes Livre et Main doivent avoir été compilées et déployées avec ce fichier META-
INF/persistence.xml.
Grâce à l’API d’EntityManager, notre code manipule des objets de façon orientée
objet, sans instructions SQL ni appel JDBC.
III. L’EJB ejbLivre :
Le code ci-dessous représente un bean de session sans état. Ce dernier obtient par
injection une référence à un gestionnaire d’entités grâce auquel il peut rendre
persistante une entité Livre
(avec la méthode
CreerLivre()
)
et récupérer tous les
livres de la base (avec la requête nommée
trouverTousLesLivres
).
Cet EJB n’a besoin
d’aucun descripteur de déploiement.
L’EJB sans
état
créant
et
récupérant des
Iivres :
@Stateless
public class ejbLivre {
@PersistenceContext(unitName = "chapter10PU")
private EntityManager em;
public List<Livre> recupererLivres() {
//exécute la requête nommée clarée dans l’entité
Query req = em.CreerNamedQuery("trouverTousLesLivres");
return req.getResultList();
}
public Livre AjoutLivre(Livre unLivre) {
//enregistre le livre dans la base
em.persist(unLivre);
return unLivre;
}
}
IV. Le bean géré ControleurLivre :
L’un des rôles d’un bean géré consiste à interagir avec les autres couches de
l’application (la couche EJB, par exemple) ou à effectuer des validations. Dans le
code du
ControleurLivre
(le bean géré) il faut ajouter lannotation
@ManagedBean
.
Ce bean géré contient deux attributs qui seront utilisés par les
pages :
lstLivres
est la liste des livres récupérés à partir de la base de données,
qui doit s’afficher dans la page
AfficherLivres.xhtml
.
unLivre
est l’objet qui sera associé au formulaire (dans la page
AjoutLivre.xhtml
)
et rendu persistant.
Institut Supérieur De Gestion De Tunis cours AJEE
3
ème
LFIG BAYOUDHI Chaouki
4
Tout le traitement métier (création et récupération des livres) s’effectue via
ejbLivre
(via l’instance
unEjbLiv)
.
Le bean géré obtient une référence à l’EJB par
injection, via l’annotation
@EJB
,
et dispose de deux méthodes qui seront invoquées par
les pages :
nouveauLiv()
:
Cette méthode n’effectue aucun traitement mais permet
de naviguer vers
AjoutLivre.xhtml
.
doCreerLivre()
:
Cette méthode permet de créer un livre en invoquant
l’EJB sans état et en lui passant l’attribut
unLivre
.
Puis elle appelle à
nouveau l’EJB pour obtenir tous les livres de la base et stocke la liste
dans l’attribut
lstLivres
du bean géré. Ensuite, la méthode renvoie le nom
de la page vers laquelle elle doit naviguer.
Les getters et les setters, sont nécessaires pour chaque attribut
(
unLivre
et
lstLivres
dans notre cas
).
Le bean
géré ControleurLivre
qui invoque I’EJB :
@ManagedBean
@RequestScoped
public class ControleurLivre {
@EJB
private ejbLivre unEjbLiv;
//Les attributs du bean géré
private Livre unLivre = new Livre();
private List<Livre> lstLivres;
public String nouveauLiv() {
return "AjoutLivre.xhtml";
}
public String recupererLivre() {
unLivre = unEjbLiv.CreerLivre(unLivre);
lstLivres = unEjbLiv.recupererLivres();
return "AfficherLivres.xhtml";
}
// Getters, setters
}
V. Les pages .xhtml :
La
page
AjoutLivre.xhtml
La page
AjoutLivre.xhtml
dont le code est ci-dessous est un formulaire permettant
à l’utilisateur de saisir les informations nécessaires à la création d’un livre (Code
,
titre, prix, description, nombre de pages et illustrations).
Institut Supérieur De Gestion De Tunis cours AJEE
3
ème
LFIG BAYOUDHI Chaouki
5
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<titre>Creer un nouveau Livre</titre>
</h:head>
<h:body>
<h1>Ajouter un Livre</h1>
<hr/>
<h:form>
<table border="0">
<tr>
<td><h:
outputLabel
value="Code : "/></td>
<td>
<h:
inputText
value="
#{controleurLvire.unLivre.Code}
"/>
</td>
</tr>
<tr>
<td><h:outputLabel value="Titre :"/></td>
<td>
<h:inputText value="
#{controleurLvire.unLivre.titre}
"/>
</td>
</tr>
<tr>
<td><h:outputLabel value="Prix : "/></td>
<td>
<h:inputText value="
#{controleurLvire.unLivre.prix}
"/>
</td>
</tr>
<tr>
<td><h:outputLabel value="Description : "/></td>
<td><h:
inputTextarea
value="
#{controleurLvire.unLivre.description}
"
cols="25" rows="4"/></td>
</tr>
<tr>
<td><h:outputLabel value="Nombre de pages : "/></td>
<td>
<h:inputText value="
#{controleurLvire.unLivre.nbrePages}
"/>
</td>
</tr>
<tr>
<td><h:outputLabel value="Illustrations : "/></td>
<td><h:
selectBooleanCheckbox
value="
#{controleurLvire.unLivre.illustrations}
"/> </td>
<tr>
</table>
<h:
commandButton
value="Ajout Livre"
action="
#{controleurLvire.doCreerLivre}
"/>
</h:form>
<hr/>
</h:body>
</html>
1 / 11 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !