Académique Documents
Professionnel Documents
Culture Documents
MAVEN
Spring
Hibernate et Reverse Engineering
PrimeFaces implémentation des JSF (Java Server Faces )
sous
le serveur d’applications Apache Tomcat
Janvier 2020
Dr. J NDONG 1
Architecture Logicielle
Présentation:
Métier DAO
framework MVC 2 Contrôleur (aiguillage)
Gestion aux données
- modèles
(POJOs)
- PrimeFaces Servlet - JavaBeans
(JSF ) fournie (sessions)
par le framework: Hibernate
FacesServlet Spring IOC
Données
2
Création sous Eclipse un projet MAVEN
On utilise MAVEN pour gérer toutes les dépendances de notre application. Nous allons créer un
DWP (Dynamic Web Project) sous Eclipse JEE et Maven télécharge toutes les APIs dont on aura
besoin, notamment tous les frameworks mis en jeu.
Lancer donc Eclipse JEE et faites menu File New Maven Projet:
3
4
Vous obtenez la fenêtre suivante. Cliquez sur le bouton Next
5
Vous obtenez la fenêtre suivante. Laisser Internet charger les catégories de projets
(Archetype) et localisez et sélectionnez maven-archetype-webapp, Cliquez sur Next.
6
Vous obtenez la fenêtre suivante. Donner le Group Id, Artifact Id et le Package.
Cliquez sur Finish.
com.essai
projetmaven
com.essai.projetmaven
7
Vous obtenez la fenêtre suivante. La structure du projet ressemble à ceci:
Artifact Id
Créer 2 répertoires
Java et resources
Dans le répertoire main.
8
Framework SPRING
Spring est un framework open source rendant simple l’utilisation de JEE. Spring est né du constat que
l’utilisation des EJBs (Enterprise JavaBean) est très complexe et n’est adaptée que pour des projets de
très grande envergure.
Il se base sur le concept de conteneur léger et s’appuie sur des concepts modernes :
Il peut s’intégrer facilement avec d’autres frameworks tels que Struts, Hibernate, etc.
Spring propose donc une intégration des frameworks tiers9 les plus répandus.
A ce point Spring propose une architecture applicative générique capable de s’adapter aux
choix technologiques.
9
Conteneur léger
La notion de conteneur EJB est une technologie lourde à mettre en œuvre, inadaptée pour les objets
de faible granularité, intrusive dans le code et en partie dépendante du serveur d’applications, ne
serait-ce qu’en terme de configuration.
Un conteneur léger adopte une autre démarche: fournir une infrastructure de gestion de l’ensemble
des composants de l’application.
Ceci s’effectue:
- au travers de mécanismes de configuration comme les fichiers XML pour initialiser
les composants
- au travers de la gestion du cycle de vie des composants
- au travers de la gestion des dépendances entre les composants
Les conteneurs légers sont indépendants des technologies JEE et peuvent fonctionner sur
tout type de serveur d’application, voire sans eux en utilisant une simple JVM.
Ils rendent les applications qui les utilisent à la fois plus flexibles et mieux testables, car le
couplage entre les composants est géré par le conteneur et non plus directement dans le code source
de l’application. 10
Le support de la POA
Elle offre des mécanismes afin de mieux séparer les différentes préoccupations d’une application
en introduisant une nouvelle dimension de modularisation : l’aspect.
Elle se concentre sur les éléments transversaux, c’est-à-dire ceux qui se trouvent dupliqués ou
utilisés dans un grand nombre d’entités comme les classes ou les méthodes, sans pouvoir être
centralisés au sein d’une entité unique avec les concepts classiques.
Ainsi grâce à la notion d’aspects qui capturent en leur sein les préoccupations transversales,
la séparation des préoccupations est nettement améliorée.
11
Modèles de conception (design pattern)
Une modélisation appropriée des applications nécessite souvent de passer par des moyens
génériques (modèles) pour bien séparer les notions fonctionnelles manipulées par ces
applications, leur gestion et leur persistance.
Les fondements d’une bonne modélisation s’appuient sur deux piliers fondamentaux:
Séparation claire entre les notions fonctionnelles manipulées par l’application, leur gestion et
leur persistance. L’idée est d’améliorer la réutilisation et l’évolution de services autour des
notions fonctionnelles. Il s’agit d’une architecture en couches:
- une couche modèle contenant les notions fonctionnelles
- une couche service qui peut gérer les notions techniques
- une couche pour la persistance des données.
Séparation claire entre les interfaces et les implémentations pour rendre transparentes les
modifications des implémentations qui n’impactent pas les interfaces.
A partir de ces deux choix, nous pouvons choisir les modèles de conception suivants:
12
Modèles de conception (design pattern)
13
Inversion de contrôle
IoC (Inversion of Control)
Il s’agit du contrôle du flot d’exécution d’une application. Ce concept propose une gestion
des dépendances entre objets et leur instanciation, notamment dans le cadre d’une dissociation
entre des interfaces et leur implémentation.
Dans les applications complexes, souvent beaucoup d’objets fabriques et singletons sont
nécessaires. Et l’application devrait être en mesure de maîtriser la création des objets dont
elle a besoin et la gestion de leurs dépendances, ce qui assez fastidieux.
Un framework de création doit pouvoir prendre en charge cette problématique de
manière générique. C’est en ce moment que l’inversion de contrôle entre ne jeu.
Le résultat attendu: disparution pure et simple des fabriques et de l’implémentation des
Singletons.
Grâce au conteneur les mécanismes (explicites) de fabrication des objets et des dépendances
devient générique.
Pour réaliser l’inversion de contrôle, Spring utilise le concept d’injection de dépendances
pour rendre cette dernière transparente.
L’injection peut se faire:
- par le contructeur,
- par les modifieurs ou mutateurs (setter) 14
- par des interfaces.
Injection par modifieurs (setter injection): la propriété (champ) à modifier doit appartenir à un
JavaBean
15
Injection par constructeur :
</bean>
16
Comment intégrer les APIs des Framework dans votre application (fichier POM) ?
17
Par exemple, pour chercher Spring Core.
Spring Core
18
19
Copier cette dépendance dans votre pom.xml. 20
Utilisation du POM Maven pour intégrer Spring IOC pour la gestion des objets ?
(…)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
(…)
21
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
22
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>5.2.3.RELEASE</version>
<type>pom</type>
</dependency>
23
Gestion de pools d’objets par Spring (1/2)
Dans une vraie application d’entreprise, il faut, avant d’utiliser Spring IOC,
générer tous vos modèles par un outil de Reverse Engineering.
24
Gestion de pools d’objets par Spring (2/2)
Le contenu de ce fichier doit ressembler à ceci:
Ici je déclare un bean d’une référence de type Personne.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
26
Comment utiliser les beans de Spring dans l’application ?
package beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import modelsandDAO.Personne;
import modelsandDAO.PersonneHome;
Pour utiliser un framework ORM tel que Hibernate pour gérer les transations vers la base de
données, on insère les dépendances suivantes dans le POM.xml.
28
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.10.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId> Il faut insérer le driver du SGBDR
<version>42.2.9</version>
</dependency>
29
Emplacement des fichiers Hibernate lors du Reverse Engineering
30
package hibernate.sessionfactory.open;
import org.hibernate.HibernateException; import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml").build();
Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
return metadata.getSessionFactoryBuilder().build();
private SessionFactoryProvider() {
}
}
32
Framework MVC 2 Primefaces
<repositories>
<repository>
<id>prime-repo</id>
<name>Prime Repo</name>
<url>http://repository.primefaces.org</url>
</repository>
<repositories>
33
On donne la dépendance de Primefaces pour spécifier la version:
34
Primefaces s’appuie sur les Java Server Faces 2.x, donc il faut inclure les dépendances de JSF
37
Autres fichiers ressources
Si vous avez des fichiers particuliers comme des logos et images, vous pouvez les placer dans des sous-répertoire de webapp.
38
Utilisation MANUELLE des THEMES sous
Primefaces
Primefaces utilise un ensemble important de THEMES que vous pouvez utilisez dans votre application,
Créer un sous répertoire nommé lib dans WEB-INF et copiez-y les JARs nécessaires pour les thèmes souhaités:
39
Configurations nécessaires (1/2)
Si vous utilisez un framework MVC 2, il est nécessaire de configuration la servlet fournie
dans votre descripteur de déploiement web.xml.
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>./vues/login.jsf</welcome-file> Page d’acceuil de l’application
</welcome-file-list>
<context-param>
<param-name> primefaces.THEME</param-name> Configuration du thème blitzer
<param-value>blitzer</param-value>
</context-param>
(…)
40
Configurations nécessaires (2/2)
Si vous utilisez un framework MVC 2, il est nécessaire de configuration la servlet fournie
dans votre descripteur de déploiement web.xml.
(…)
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
41
</web-app>
Si tout est fait correctement, vous lancez l’application et vous obtenez cette magnifique page web
http://localhost:8088/primefacesmaven/
42