SlideShare une entreprise Scribd logo
1  sur  164
Télécharger pour lire hors ligne
SSpprriinngg FFrraammeewwoorrkk :: 
- AArrcchhiitteeccttuurree JJEEEE 
- SSpprriinngg IIOOCC 
- SSpprriinngg MMVVCC 
- SSpprriinngg IInntteeggrraattiioonn :: RRMMII,, JJaaxxWWSS,, JJaaxxRRSS,, JJMMSS,, JJMMXX,, …… 
- SSpprriinngg SSeeccuurriittyy 
Mohamed Youssfi 
Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA) 
ENSET, Université Hassan II Casablanca, Maroc 
Email : med@youssfi.net 
Supports de cours : http://fr.slideshare.net/mohamedyoussfi9 
Chaîne vidéo : http://youtube.com/mohamedYoussfi 
Recherche : http://www.researchgate.net/profile/Youssfi_Mohamed/publications 
med@youssfi.net
AArrcchhiitteeccttuurree JJ22EEEE 
med@youssfi.net | ENSET Université 
Hassan II Mohammedia
Exigences d’un pprroojjeett iinnffoorrmmaattiiqquuee 
 Exigences fonctionnelles: 
◦ Une application est créée pour répondre , tout d’abord, aux 
besoins fonctionnels des entreprises. 
 Exigences Techniques : 
◦ Les performances: 
 Temps de réponse 
 Haute disponibilité et tolérance aux pannes 
 Eviter le problème de montée en charge 
med@youssfi.net 
◦ La maintenance: 
 Une application doit évoluer dans le temps. 
 Doit être fermée à la modification et ouverte à l’extension 
◦ Sécurité 
◦ Portabilité 
◦ Distribution 
◦ Capacité de communiquer avec d’autres applications distantes. 
◦ Capacité de fournir le service à différents type de clients (Desk TOP, Mobile, SMS, http…) 
◦ ….. 
◦ Coût du logiciel 
3
CCoonnssttaatt 
 Il est très difficile de développer un système logiciel qui 
respecte ces exigences sans utiliser l’expérience des autres : 
◦ Serveur d’application JEE: 
 JBOSS, Web Sphere, 
 GlassFish, Tomcat, 
 … 
◦ Framework pour l’Inversion de contrôle: 
 Spring (Conteneur léger) 
 EEJJBB ((CCoonntteenneeuurr lloouurrdd)) 
◦ Frameworks : 
 Mapping objet relationnel (ORM ) : JPA, Hibernate, Toplink, … 
 Applications Web : Struts, JSF, SpringMVC 
 …. 
◦ Middlewares : 
 RMI, CORBA : Applications distribuées 
 JAXWS pour Web services SOAP 
 JAXRS pour les Web services RESTful 
 JMS : Communication asynchrone entre les application 
 … 
med@youssfi.net
AArrcchhiitteeccttuurreess 
DDiissttrriibbuuééss 
SGBD 
Serveur d’application J2EE 
Couche DAO 
Mapping Objet Relationnel (JPA, Hibernate) 
Couche métier 
Couche Service 
RMI, JMS 
CORBA,SOAP Objet Java 
Application .Net SOAP (HTTP+XML) 
ou CORBA 
Smart Phone 
REST (HTTP+JSON) 
Couche web 
MiddleWares : 
- RMI 
- CORBA 
- EJB Session 
- SOAP (Web Sevices) 
- JMS 
-Java Mail 
-SMSLib 
med@youssfi.net 
HTTP 
Client HTTP 
-HTML, CSS, JavaScript 
-XML, AJAX, Jquery 
-SVG ou Flash 
Aplication PHP 
SOAP (HTTP+XML) 
Client JMS 
JMS 
Client SMS 
SMS 
5 
-Servlet 
- JSP 
- FrameWorks 
-Struts 
-Spring MVC 
- JSF
AArrcchhiitteeccttuurree JJ22EEEE 
Serveur d’application J2EE 
Web Container 
(Couche Web) 
Spring ou EJB 
Container 
(Couche Métier) 
Servlet, JSP 
Service 
Client Java 
RMI, 
JMS 
Client http 
Client SOAP 
Java, .Net, PHP, Cobol 
HTTP 
HTML 
SOAP 
XML 
Services de 
l’infrastructure 
JaxWS, Jax RS 
Jersey, CXF, AXIS 
JTA 
JNDI 
Spring MVC, JSF 
Composants 
JPA 
Hibernate 
SGBD 
DDaattaa BBaassee 
SOAP 
Service 
RESTful 
JDBC 
Client HTTP 
Mobile, JQuery, Flash 
HTTP 
JSON, XML, .. 
…. 
AXIS, CXF 
Jersey, CXF 
Métier 
(Traitements) 
Entity Entity
SSpprriinngg FFrraammeewwoorrkk AArrcchhiitteeccttuurree 
med@youssfi.net
SSpprriinngg FFrraammeewwoorrkk AArrcchhiitteeccttuurree 
 Spring est modulaire , permettant de 
choisir les modules appropriés à votre 
application, sans être obligé d’autiliser le 
reste. 
 Spring Framework fournit plus de 20 
modules qui peuvent être utilisé dans els 
applications. 
med@youssfi.net
CCoorree CCoonnttaaiinneerr 
 The Core Container consists of the Core, Beans, 
Context, and Expression Language modules whose 
detail is as follows: 
◦ The Core module provides the fundamental parts of the 
framework, including the IoC and Dependency Injection 
features. 
◦ TThhee BBeeaann mmoodduullee pprroovviiddeess BBeeaannFFaaccttoorryy wwhhiicchh iiss aa 
sophisticated implementation of the factory pattern. 
◦ The Context module builds on the solid base provided by 
the Core and Beans modules and it is a medium to access 
any objects defined and configured. The ApplicationContext 
interface is the focal point of the Context module. 
◦ The Expression Language module provides a powerful 
expression language for querying and manipulating an object 
graph at runtime. 
med@youssfi.net
DDaattaa AAcccceessss//IInntteeggrraattiioonn 
 The Data Access/Integration layer consists of the JDBC, ORM, 
OXM, JMS and Transaction modules whose detail is as follows: 
◦ The JDBC module provides a JDBC-abstraction layer that removes the 
need to do tedious JDBC related coding. 
◦ The ORM module provides integration layers for popular object-relational 
mapping APIs, including JPA, JDO, Hibernate, and iBatis. 
◦ TThhee OOXXMM mmoodduullee pprroovviiddeess aann aabbssttrraaccttiioonn llaayyeerr tthhaatt ssuuppppoorrttss 
Object/XML mapping implementations for JAXB, Castor, XMLBeans, 
JiBX and XStream. 
◦ The Java Messaging Service JMS module contains features for producing 
and consuming messages. 
◦ The Transaction module supports programmatic and declarative 
transaction management for classes that implement special interfaces 
and for all your POJOs. 
med@youssfi.net
WWeebb 
 The Web layer consists of the Web, Web-Servlet, 
Web-Struts, and Web-Portlet modules whose detail is 
as follows: 
◦ The Web module provides basic web-oriented integration 
features such as multipart file-upload functionality and the 
initialization of the IoC container using servlet listeners 
aanndd aa wweebb--oorriieenntteedd aapppplliiccaattiioonn ccoonntteexxtt.. 
◦ The Web-Servlet module contains Spring's model-view-controller 
(MVC) implementation for web applications 
◦ The Web-Struts module contains the support classes for 
integrating a classic Struts web tier within a Spring 
application. 
◦ The Web-Portlet module provides the MVC 
implementation to be used in a portlet environment and 
mirrors the functionality of Web-Servlet module. 
med@youssfi.net
AAuuttrreess 
 There are few other important modules like AOP, 
Aspects, Instrumentation, Web and Test modules 
whose detail is as follows: 
◦ The AOP module provides aspect-oriented programming 
implementation allowing you to define method-interceptors 
and pointcuts to cleanly decouple code that 
iimmpplleemmeennttss ffuunnccttiioonnaalliittyy tthhaatt sshhoouulldd bbee sseeppaarraatteedd.. 
◦ The Aspects module provides integration with AspectJ 
which is again a powerful and mature aspect oriented 
programming (AOP) framework. 
◦ The Instrumentation module provides class 
instrumentation support and class loader implementations 
to be used in certain application servers. 
◦ The Test module supports the testing of Spring 
components with JUnit or TestNG frameworks. 
med@youssfi.net
IInnvveerrssiioonn ddee ccoonnttrrôôllee 
oouu 
IInnjjeeccttiioonn ddee ddééppeennddaanncceess 
med@youssfi.net
Rappels de quelque pprriinncciippeess ddee 
ccoonncceeppttiioonn 
 Une application qui n’évolue pas meurt. 
 Une application doit être fermée à la modification 
et ouverte à l’extension. 
 Une application doit s’adapter aux changements 
 Efforcez-vous à coupler faiblement vos classes. 
 Programmer une interface et non une 
implémentation 
med@youssfi.net 
 Etc..
CCoouuppllaaggee FFoorrtt 
eett 
CCoouuppllaaggee ffaaiibbllee 
med@youssfi.net
CCoouuppllaaggee ffoorrtt 
 Quand une classe A est lié à une classe B, on dit que la classe A est 
fortement couplée à la classe B. 
 La classe A ne peut fonctionner qu’en présence de la classe B. 
 Si une nouvelle version de la classe B (soit B2), est crée, on est obligé de 
modifier dans la classe A. 
 Modifier une classe implique: 
◦ Il faut disposer du code source. 
◦ Il faut recompiler, déployer et distribuer la nouvelle application aux clients. 
◦ Ce qui engendre un cauchemar au niveau de la maintenance de l’application 
med@youssfi.net 
A 
b: B 
calcul() : double 
B 
getValue() : double 
1
Exemple ddee ccoouuppllaaggee ffoorrtt 
MetierImpl 
dao: DaoImpl 
calcul() : double 
DaoImpl 
getValue() : double 
1 
package dao; 
public class DaoImpl { 
public double getValue(){ 
return(5); 
Presentation 
metier:MetierImpl 
main(String[] a):void 
1 
package metier; 
import dao.DaoImpl; 
public class MetierImpl { 
med@youssfi.net 
} 
} 
private DaoImpl dao; 
public MetierImpl() { 
dao=new DaoImpl(); 
} 
public double calcul(){ 
double nb=dao.getValue(); 
return 2*nb; 
} 
} 
package pres; 
import metier.MetierImpl; 
public class Presentation { 
private static MetierImpl metier; 
public static void main(String[] 
args) { 
metier=new MetierImpl(); 
System.out.println(metier.calcul()); 
} 
}
Problèmes dduu ccoouuppllaaggee ffoorrtt 
 Dans l’exemple précédent, les classes MetierImpl et DaoImpl sont liées 
par un couplage fort. De même pour les classe Presentation et 
MetierImpl 
 Ce couplage fort n’a pas empêché de résoudre le problème au niveau 
fonctionnel. 
 Mais cette conception nous ne a pas permis de créer une application 
fermée à la modification et ouverte à l’extension. 
 En effet, la création d’une nouvelle version de la méthode getValue() 
de la classe DaoImpl, va nous obliger d’éditer le code source de 
l’application aussi bien au niveau de DaoImpl et aussi MetierImpl. 
 De ce fait nous avons violé le principe « une application doit être 
fermée à la modification et ouverte à l’exetension» 
 Nous allons voir que nous pourrons faire mieux en utilisant le 
med@youssfi.net 
couplage faible.
CCoouuppllaaggee FFaaiibbllee.. 
 Pour utiliser le couplage faible, nous devons utiliser les interfaces. 
 Considérons une classe A qui implémente une interface IA, et une classe B qui 
implémente une interface IB. 
 Si la classe A est liée à l’interface IB par une association, on dit que le classe A et la 
classe B sont liées par un couplage faible. 
 Cela signifie que la classe B peut fonctionner avec n’importe quelle classe qui 
implémente l’interface IA. 
 En effet la classe B ne connait que l’interface IA. De ce fait n’importe quelle classe 
implémentant cette interface peut être associée à la classe B, sans qu’il soit 
nécéssaire de modifier quoi que se soit dans la classe B. 
 Avec le couplage faible, nous pourrons créer des application fermée à la 
1 IB 
getValue() : double 
med@youssfi.net 
modification et ouvertes à l’extension. 
AImpl 
b: IB 
calcul() : double 
BImpl 
getValue() : double 
IA 
calcul() : double
Exemple ddee ccoouuppaaggee ffaaiibbllee 
MetierImpl 
dao: IDao 
calcul() : double 
1 IDao 
getValue() : double 
DaoImpl 
getValue() : double 
IMetier 
calcul() : double 
Presentation 
metier:IMetier 
main(String[] a):void 
1 
package metier; 
public interface IMetier { 
public double calcul(); 
package dao; 
public interface IDao { 
public double getValue(); 
} 
package dao; 
public class DaoImpl implements IDao { 
public double getValue() { 
return 5; 
} 
} 
med@youssfi.net 
package metier; 
import dao.IDao; 
public class MetierImpl 
implements IMetier { 
private IDao dao; 
public double calcul() { 
double nb=dao.getValue(); 
return 2*nb; 
} 
// Getters et Setters 
} 
}
Injection ddeess ddééppeennddaanncceess 
 Injection par instanciation statique : 
import metier.MetierImpl; 
import dao.DaoImpl; 
public class Presentation { 
public static void main(String[] args) { 
DaoImpl dao=new DaoImpl(); 
MetierImpl metier=new MetierImpl(); 
metier.setDao(dao); 
System.out.println(metier.calcul()); 
} 
} 
med@youssfi.net
Injection ddeess ddééppeennddaanncceess 
 Injection par instanciation dynamique par réflexion : 
 Fichier texte de configuration : config.txt 
ext.DaoImp 
metier.MetierImpl 
import java.io.*;import java.lang.reflect.*; 
import java.util.Scanner; import metier.IMetier; 
import dao.IDao; 
public class Presentation { 
public static void main(String[] args) { 
try { 
Scanner scanner=new Scanner(new File(config.text)); 
String daoClassname=scanner.next(); 
String metierClassName=scanner.next(); 
Class cdao=Class.forName(daoClassname); 
IDao dao= (IDao) cdao.newInstance(); 
Class cmetier=Class.forName(metierClassName); 
IMetier metier=(IMetier) cmetier.newInstance(); 
Method meth=cmetier.getMethod(setDao,new Class[]{IDao.class}); 
meth.invoke(metier, new Object[]{dao}); 
System.out.println(metier.calcul()); 
} catch (Exception e) { e.printStackTrace(); } 
} 
} 
med@youssfi.net
Injection des ddééppeennddaanncceess aavveecc SSpprriinngg. 
 L’injection des dépendance, ou l’inversion de contrôle est un 
concept qui intervient généralement au début de l’exécution 
de l’application. 
 Spring IOC commence par lire un fichier XML qui déclare 
quelles sont différentes classes à instancier et d’assurer les 
dépendances entre les différentes instances. 
 Quand on a besoin d’intégrer une nouvelle implémentation à 
une application, il suffirait de la déclarer dans le fichier xml de 
beans spring. 
med@youssfi.net
application Injection des dépendances dans une jjaavvaa ssttaannddaarrdd 
?xml version=1.0 encoding=UTF-8? 
!DOCTYPE beans PUBLIC -//SPRING//DTD BEAN 2.0//EN 
http://www.springframework.org/dtd/spring-beans- 
2.0.dtd  
beans 
bean id=d class=dao.DaomImpl2/bean 
bean id=metier class=metier.MetierImpl 
property name=dao ref=d/property 
/bean 
med@youssfi.net 
/beans 
metier:MetierImpl 
dao: 
calcul() : double 
d:DaoImpl 
getValue() : double
application Injection des dépendances dans une jjaavvaa ssttaannddaarrdd 
package pres; 
import metier.IMetier; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
public class Presentation { 
public static void main(String[] args) { 
ClassPathXmlApplicationContext context=new 
ClassPathXmlApplicationContext(new String[]{spring-ioc.xml}); 
IMetier metier=(IMetier) context.getBean(metier); 
System.out.println(metier.calcul()); 
med@youssfi.net 
} 
}
med@youssfi.net
MMaavveenn ddeeppeennddeenncciieess 
dependencies 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-core/artifactId 
version3.2.2.RELEASE/version 
//ddeeppeennddeennccyy 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-context/artifactId 
version3.2.2.RELEASE/version 
/dependency 
/dependencies 
med@youssfi.net
SSttrruuccttuurree dduu pprroojjeett 
med@youssfi.net
Injection des dépendances ddaannss uunnee 
aapppplliiccaattiioonn wweebb 
 Dans une application web, SpringIOC est appelé au démarrage du 
serveur en déclarant le listener ContextLoaderListener dans le fichier 
web.xml 
context-param 
param-namecontextConfigLocation/param-name 
param-value/WEB-INF/spring-beans.xml/param-value 
/context-param 
med@youssfi.net 
listener 
listener-class 
org.springframework.web.context.ContextLoaderListener 
/listener-class 
/listener 
 Dans cette déclaration, CotextLoaderListener est appelé par Tomcat au 
moment du démarrage de l’application. Ce listener cherchera le fichier 
de beans spring « spring-beans.xml » stocké dans le dossier WEB-INF. ce 
qui permet de faire l’injection des dépendances entre MetierImpl et 
DaoImpl
AArrcchhiitteeccttuurreess 
DDiissttrriibbuuééss 
SGBD 
Serveur d’application J2EE 
Couche DAO 
Mapping Objet Relationnel (JPA, Hibernate) 
Couche métier 
Couche Service 
RMI, JMS 
CORBA,SOAP Objet Java 
Application .Net SOAP (HTTP+XML) 
ou CORBA 
Smart Phone 
REST (HTTP+JSON) 
Couche web 
MiddleWares : 
- RMI 
- CORBA 
- EJB Session 
- SOAP (Web Sevices) 
- JMS 
-Java Mail 
-SMSLib 
med@youssfi.net 
HTTP 
Client HTTP 
-HTML, CSS, JavaScript 
-XML, AJAX, Jquery 
-SVG ou Flash 
Aplication PHP 
SOAP (HTTP+XML) 
Client JMS 
JMS 
Client SMS 
SMS 
30 
-Servlet 
- JSP 
- FrameWorks 
-Struts 
-Spring MVC 
- JSF
SSpprriinngg 
 Spring est un framework open source JEE pour les applications n-tiers, 
dont il facilite le développement et les tests. 
 Il est considéré comme un conteneur dit « léger », c’est-à-dire une 
infrastructure similaire à un serveur d’application J2EE. 
 Il prend donc en charge la création d’objets et la mise en relation 
d’objets par l’intermédiaire d’un fichier de configuration qui décrit 
les objets à fabriquer et les relations de dépendances entre ces 
objets. 
 IIll ppeerrmmeett ddee ssééppaarreerr llee ccooddee mmééttiieerr dduu ccooddee tteecchhnniiqquuee 
 Spring s’appuie principalement sur l’intégration de trois concepts 
clés : 
◦ l’inversion de contrôle ou injection de dépendance (IoC). 
◦ la programmation orientée aspect (AOP). 
◦ une couche d’abstraction. 
 Ce framework, grâce à sa couche d’abstraction, ne concurrence pas 
d’autres frameworks dans une couche spécifique d’un modèle 
architectural MVC mais s’avère un framework multi-couches 
pouvant s’insérer au niveau de toutes les couches. 
med@youssfi.net
SSpprriinngg FFrraammeewwoorrkk AArrcchhiitteeccttuurree 
med@youssfi.net
SSpprriinngg MMVVCC 
med@youssfi.net
SSpprriinngg MMVVCC 
 Architecture de Spring MVC 
med@youssfi.net
SSpprriinngg MMVVCC 
med@youssfi.net
SSpprriinngg MMVVCC AArrcchhiitteeccttuurree 
med@youssfi.net
SSpprriinngg MMVVCC 
med@youssfi.net
Architecture d’une application rreessppeeccttaanntt 
llee mmooddèèllee MMVVCC 
 Au sein de l'architecture 3tier, l'architecture MVC peut 
être représentée comme suit : 
Métier DAO SGBD 
med@youssfi.net 
Données 
User 
1 2 
Contrôleur 
Vue 
Modèle 
3 
4 
6 5
SSpprriinngg MMVVCC 
 1- le client fait une demande au contrôleur. Celui-ci voit 
passer toutes les demandes des clients. C'est la porte 
d'entrée de l'application. C'est le C de MVC. Ici le 
contrôleur est assuré par une servlet générique : 
org.springframework.web.servlet.DispatcherServlet 
 2- le contrôleur principal [DispatcherServlet] fait exécuter 
l'action demandée par l'utilisateur par une classe 
implémentant l'interface : 
org.springframework.web.servlet.mvc.Controller 
◦ A cause du nom de l'interface, nous appellerons une telle classe un 
contrôleur secondaire pour le distinguer du contrôleur principal 
[DispatcherServlet] ou simplement contrôleur lorsqu'il n'y a 
pas d'ambiguïté. 
 3- le contrôleur [Controller] traite une demande 
particulière de l'utilisateur. Pour ce faire, il peut avoir besoin 
de l'aide de la couche métier. Une fois la demande du client 
traitée, celle-ci peut appeler diverses réponses. Un exemple 
classique est : 
◦ une page d'erreurs si la demande n'a pu être traitée correctement 
◦ une page de confirmation sinon 
med@youssfi.net
SSpprriinngg MMVVCC 
 4- Le contrôleur choisit la réponse (= vue) à envoyer au client. Choisir la 
réponse à envoyer au client nécessite plusieurs étapes : 
◦ choisir l'objet qui va générer la réponse. C'est ce qu'on appelle la vue V, le V de 
MVC. Ce choix dépend en général du résultat de l'exécution de l'action demandée 
par l'utilisateur. 
◦ lui fournir les données dont il a besoin pour générer cette réponse. En effet, celle-ci 
contient le plus souvent des informations calculées par la couche métier ou le 
contrôleur lui-même. Ces informations forment ce qu'on appelle le modèle M de la 
vue, le M de MVC. Spring MVC fournit ce modèle sous la forme d'un dictionnaire de 
type java.util.Map. 
◦ Cette étape consiste donc en le choix d'une vue V et la construction du modèle M 
nécessaire à celle-ci. 
 5- Le contrôleur DispatcherServlet demande à la vue choisie de s'afficher. 
Il s'agit d'une classe implémentant l'interface 
org.springframework.web.servlet.View 
◦ Spring MVC propose différentes implémentations de cette interface pour générer 
med@youssfi.net 
des flux HTML, Excel, PDF, ... 
 6. le générateur de vue View utilise le modèle Map préparé par le 
contrôleur Controller pour initialiser les parties dynamiques de la réponse 
qu'il doit envoyer au client. 
 7. la réponse est envoyée au client. La forme exacte de celle-ci dépend du 
générateur de vue. Ce peut être un flux HTML, XML, PDF, Excel, ...
Installation dduu pplluuggiinn :: sspprriinngg ttoooollss 
ppoouurr eecclliippssee 
med@youssfi.net
Installation dduu pplluuggiinn :: sspprriinngg ttoooollss 
ppoouurr eecclliippssee 
med@youssfi.net
CCrrééaattiioonn dd’’uunn pprroojjeett SSpprriinngg 
med@youssfi.net
CCrrééaattiioonn dd’’uunn pprroojjeett SSpprriinngg 
med@youssfi.net
SSttrruuccttuurree dduu pprroojjeett 
Navigator Explorer 
med@youssfi.net
wweebb..xxmmll 
?xml version=1.0 encoding=UTF-8? 
web-app version=2.5 xmlns=http://java.sun.com/xml/ns/javaee 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xsi:schemaLocation=http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
!-- The definition of the Root Spring Container shared by all Servlets and 
Filters -- 
context-param 
param-namecontextConfigLocation/param-name 
param-value/WEB-INF/spring/root-context.xml/param-value 
/context-param 
!-- Creates the Spring Container shared by all Servlets and Filters -- 
listener 
listener-class 
org.springframework.web.context.ContextLoaderListener/listener-class 
/listener 
med@youssfi.net
wweebb..xxmmll 
!-- Processes application requests -- 
servlet 
servlet-nameappServlet/servlet-name 
servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class 
init-param 
param-namecontextConfigLocation/param-name 
param-value/WEB-INF/spring/appServlet/servlet-context.xml/param-value 
//iinniitt--ppaarraamm 
load-on-startup1/load-on-startup 
/servlet 
servlet-mapping 
servlet-nameappServlet/servlet-name 
url-pattern//url-pattern 
/servlet-mapping 
/web-app 
med@youssfi.net
//WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll 
• Ce fichier est lu par ContextLoaderListener, au démarrage du serveur . 
• C’est un fichier dans lequel contexte de l’application sera construit 
• ContextLoaderListener représente Spring IOC 
• c’est donc un fichier pour l’injection des dépendances 
• Pour le moment, il est vide 
?xml version=1.0 encoding=UTF-8? 
beans 
xmlns=http://www.springframework.org/schema/beans 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xsi:schemaLocation=http://www.springframework.org/sc 
hema/beans 
http://www.springframework.org/schema/beans/spring-beans. 
xsd 
!-- Root Context: defines shared resources visible 
to all other web components -- 
/beans 
med@youssfi.net
//WWEEBB-IINNFF//sspprriinngg/aappppSSeerrvvlleett/sseerrvvlleett-ccoonntteexxtt..xxmmll 
• Ce fichier est lu par DispatcherServlet qui représente le controleur web de l’application 
?xml version=1.0 encoding=UTF-8? 
beans:beans xmlns=http://www.springframework.org/schema/mvc 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xmlns:beans=http://www.springframework.org/schema/beans 
xmlns:context=http://www.springframework.org/schema/context 
xsi:schemaLocation=http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
!-- Enables the Spring MVC @Controller programming model -- 
annotation-driven / 
!-- Handles HTTP GET requests for /resources/** by efficiently serving up static 
resources in the ${webappRoot}/resources directory -- 
resources mapping=/resources/** location=/resources/ / 
!-- Resolves views selected for rendering by @Controllers to .jsp resources in the 
/WEB-INF/views directory -- 
beans:bean class=org.springframework.web.servlet.view.InternalResourceViewResolver 
beans:property name=prefix value=/WEB-INF/views/ / 
beans:property name=suffix value=.jsp / 
/beans:bean 
context:component-scan base-package=ma.enset.myCataogue / 
/beans:beans 
med@youssfi.net
Un eexxeemmppllee ddee ccoonnttrrôôlleeuurr SSpprriinngg MMVVCC 
package ma.enset.myCataogue; 
import java.text.*;import java.util.*;import org.slf4j.*;import 
org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
/** Handles requests for the application home page. */ 
@Controller 
public class HomeController { 
private static final Logger logger = LoggerFactory.getLogger(HomeController.class); 
/** Simply selects the home view to render by returning its name. */ 
@@RReeqquueessttMMaappppiinngg((vvaalluuee == //, mmeetthhoodd == RReeqquueessttMMeetthhoodd..GGEETT)) 
public String home(Locale locale, Model model) { 
logger.info(Welcome home! The client locale is {}., locale); 
Date date = new Date(); 
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 
String formattedDate = dateFormat.format(date); 
model.addAttribute(serverTime, formattedDate ); 
return home; 
} 
} 
med@youssfi.net
UUnn eexxeemmppllee ddee vvuuee JJSSPP 
%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c % 
%@ page session=false % 
html 
head 
titleHome/title 
/head 
body 
hh11 HHeelllloo wwoorrlldd!! //hh11 
P The time on the server is ${serverTime}. /P 
/body 
/html 
med@youssfi.net
FFuunnccttiioonnnneemmeenntt 
Tomcat 
Lire web.xml 
:ContextLoaderListner 
Instancier Lire 
root-context.xml 
:DispatcherServlet 
Instancier 
Lire 
root-context.xml 
Client 
:HomeController 
Req HTTP 
med@youssfi.net 
GET/ 
doGet(request,response) 
instancier 
Model 
And 
View 
:home.jsp 
home() 
instancier 
html rendu 
Rep HTTP
AApppplliiccaattiioonn 11 
 On souhaite créer une application qui permet de gérer des produits. Chaque produit est 
défini par sa référence (de type String), sa désignation, son prix et sa quantité. L’application 
doit permettre les opérations suivantes : 
◦ Ajouter un nouveau produit 
◦ Consulter tous les produits 
◦ Consulter les produits dont le nom contient un mot clé. 
◦ Consulter un produit 
◦ Supprimer un produit 
◦ MMeettttrree àà jjoouurr uunn pprroodduuiitt.. 
 Cette application se compose de trois couches DAO, Métier et Présentation. 
 Elle doit être fermée à la modification et ouverte à l’extension. 
 L’injection des dépendances sera effectuée en utilisant Spring IOC. 
 Nous allons définir deux implémentations de la couche DAO. 
◦ Une implémentation qui gère les produits qui sont stockés dans une liste de type 
HashMap. 
◦ Dans la deuxième implémentation, nous allons supposer que les produits sont stockés 
dans une base de données de type MySQL. 
med@youssfi.net
EEccrraannss ddee ll’’aapppplliiccaattiioonn 
med@youssfi.net
Validation des données ccoottéé sseerrvveeuurr 
med@youssfi.net
SSaaiissiiee dd’’uunn pprroodduuiitt 
med@youssfi.net
AApprrèèss AAjjoouutt dd’’uunn pprroodduuiitt 
med@youssfi.net
EEddiittiioonn dd’’uunn pprroodduuiitt 
med@youssfi.net
MMiissee àà jjoouurr dd’’uunn pprroodduuiitt 
med@youssfi.net
SSuupppprreessssiioonn dd’’uunn pprroodduuiitt 
med@youssfi.net
SSttrruuccttuurree dduu pprroojjeett 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
med@youssfi.net
Architecture tteecchhnniiqquuee 
Web Container Spring IOC Container 
ContextLoaderListner 
Couche Métier 
ICatMetier 
Couche DAO 
ICatDAO 
dependencies 
Spring 
Hibernate-validator 
web.xml 
produits.jsp 
Produit 
aapplicationContext.xml 
servlet-context.xml 
CatMetierImpl 
CatDAOImpl 
CatalController 
DispatcherSevlet 
HTTP 
HTML 
Client HTTP
MMaavveenn ddeeppeennddeenncciieess :: SSpprriinngg 
pom.xml 
properties 
java-version1.6/java-version 
org.springframework-version 
3.2.3.RELEASE 
/org.springframework-version 
org.aspectj-version1.6.10/org.aspectj-version 
org.slf4j-version1.6.6/org.slf4j-version 
/properties 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
!-- Spring -- 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-context/artifactId 
version${org.springframework-version}/version 
exclusions 
!-- Exclude Commons Logging in favor of SLF4j -- 
exclusion 
ggrroouuppIIddccoommmmoonnss--llooggggiinngg//ggrroouuppIIdd 
artifactIdcommons-logging/artifactId 
/exclusion 
/exclusions 
/dependency 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-webmvc/artifactId 
version${org.springframework-version}/version 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
!-- AspectJ -- 
dependency 
groupIdorg.aspectj/groupId 
artifactIdaspectjrt/artifactId 
version${org.aspectj-version}/version 
/dependency 
!-- Logging -- 
dependency 
groupIdorg.slf4j/groupId 
artifactIdslf4j-api/artifactId 
vveerrssiioonn$${{oorrgg..ssllff44jj--vveerrssiioonn}}//vveerrssiioonn 
/dependency 
dependency 
groupIdorg.slf4j/groupId 
artifactIdjcl-over-slf4j/artifactId 
version${org.slf4j-version}/version 
scoperuntime/scope 
/dependency 
dependency 
groupIdorg.slf4j/groupId 
artifactIdslf4j-log4j12/artifactId 
version${org.slf4j-version}/version 
scoperuntime/scope 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
dependency 
groupIdlog4j/groupId 
artifactIdlog4j/artifactId 
version1.2.15/version 
exclusions 
exclusion 
groupIdjavax.mail/groupId 
artifactIdmail/artifactId 
/exclusion 
exclusion 
ggrroouuppIIddjjaavvaaxx..jjmmss//ggrroouuppIIdd 
artifactIdjms/artifactId 
/exclusion 
exclusion 
groupIdcom.sun.jdmk/groupId 
artifactIdjmxtools/artifactId 
/exclusion 
exclusion 
groupIdcom.sun.jmx/groupId 
artifactIdjmxri/artifactId 
/exclusion 
/exclusions 
scoperuntime/scope 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
!-- @Inject -- 
dependency 
groupIdjavax.inject/groupId 
artifactIdjavax.inject/artifactId 
version1/version 
/dependency 
!-- Servlet -- 
dependency 
groupIdjavax.servlet/groupId 
artifactIdservlet-api/artifactId 
vveerrssiioonn22..55//vveerrssiioonn 
scopeprovided/scope 
/dependency 
dependency 
groupIdjavax.servlet.jsp/groupId 
artifactIdjsp-api/artifactId 
version2.1/version 
scopeprovided/scope 
/dependency 
dependency 
groupIdjavax.servlet/groupId 
artifactIdjstl/artifactId 
version1.2/version 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
!-- Test -- 
dependency 
groupIdjunit/groupId 
artifactIdjunit/artifactId 
version4.7/version 
scopetest/scope 
/dependency 
!-- Hibernate Validator -- 
dependency 
groupIdorg.hibernate/groupId 
artifactIdhibernate-validator/artifactId 
version5.0.0.Final/version 
/dependency 
med@youssfi.net
CCOOUUCCHHEE DDAAOO 
med@youssfi.net
EEnnttiittéé PPrroodduuiitt 
package org.miage.sid.dao; 
import java.io.Serializable; 
import javax.validation.constraints.DecimalMin; 
import javax.validation.constraints.Size; 
import org.hibernate.validator.constraints.NotEmpty; 
public class Produit implements Serializable { 
@NotEmpty 
@@SSiizzee((mmiinn==44,mmaaxx==1122)) 
private String reference; 
@NotEmpty 
private String designation; 
@DecimalMin(value=100) 
private double prix; 
private int quantite; 
// Constructeurs 
// Getters et Setters 
} 
med@youssfi.net
IInntteerrffaaccee IICCaattaalloogguueeDDAAOO 
package org.miage.sid.dao; 
import java.util.List; 
public interface ICatalogueDAO { 
public void addProduit(Produit p); 
public ListProduit getAllProduits(); 
ppuubblliicc LLiissttPPrroodduuiitt ggeettPPrroodduuiittss((SSttrriinngg mmcc));; 
public Produit getProduit(String reference); 
public void deleteProduit(String refernce); 
public void updateProduit(Produit p); 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn CCaattaalloogguueeDDAAOOIImmppll 
package org.miage.sid.dao; 
import java.util.*; 
import org.apache.log4j.Logger; 
public class CatalogueDaoImpl implements ICatalogueDAO { 
private MapString, Produit produits=new HashMapString, Produit(); 
Logger logger=Logger.getLogger(CatalogueDaoImpl.class); 
@Override 
public void addProduit(Produit p) { 
pprroodduuiittss..ppuutt((pp..ggeettRReeffeerreennccee(()), pp));; 
} 
@Override 
public ListProduit getAllProduits() { 
CollectionProduit prods=produits.values(); 
return new ArrayListProduit(prods); 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn CCaattaalloogguueeDDAAOOIImmppll 
@Override 
public ListProduit getProduits(String mc) { 
ListProduit prods=new ArrayListProduit(); 
for(Produit p:produits.values()) 
if(p.getDesignation().indexOf(mc)=0) 
prods.add(p); 
return prods; 
} 
@@OOvveerrrriiddee 
public Produit getProduit(String reference) { 
return produits.get(reference); 
} 
@Override 
public void deleteProduit(String refernce) { 
produits.remove(refernce); 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn CCaattaalloogguueeDDAAOOIImmppll 
@Override 
public void updateProduit(Produit p) { 
produits.put(p.getReference(),p); 
} 
public void init(){ 
logger.info(Initialisation du catalogue); 
this.addProduit(new Produit(HP675,Ordinateur HP, 8000, 5)); 
tthhiiss..aaddddPPrroodduuiitt((nneeww PPrroodduuiitt((AAEEPP6655,IImmpprriioommaannttee AAEE,776600, 8800))));; 
this.addProduit(new Produit(AT980,Smart Phone GT, 4500, 8)); 
} 
} 
med@youssfi.net
CCOOUUCCHHEE MMEETTIIEERR 
med@youssfi.net
IInntteerrffaaccee IIccaattaalloogguueeMMeettiieerr 
package org.miage.sid.metier; 
import java.util.List; 
import org.miage.sid.dao.Produit; 
public interface ICatalogueMetier { 
public void addProduit(Produit p); 
public ListProduit getAllProduits(); 
public ListProduit getProduits(String mc); 
public Produit getProduit(String reference); 
public void deleteProduit(String refernce); 
public void updateProduit(Produit p); 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn CCaattaalloogguueeMMeettiieerrIImmppll 
package org.miage.sid.metier; 
import java.util.List; import org.miage.sid.dao.ICatalogueDAO; 
import org.miage.sid.dao.Produit; 
public class CatalogueMetierImpl implements ICatalogueMetier { 
private ICatalogueDAO dao; 
/*Setter setDao pour l'injection*/ 
public void setDao(ICatalogueDAO dao) { 
tthhiiss..ddaaoo == ddaaoo;; 
} 
@Override 
public void addProduit(Produit p) { 
dao.addProduit(p); 
} 
@Override 
public ListProduit getAllProduits() { 
return dao.getAllProduits(); 
}
IImmpplléémmeennttaattiioonn CCaattaalloogguueeMMeettiieerrIImmppll 
@Override 
public ListProduit getProduits(String mc) { 
return dao.getProduits(mc); 
} 
@Override 
public Produit getProduit(String reference) { 
return dao.getProduit(reference); 
} 
@Override 
public void deleteProduit(String refernce) { 
dao.deleteProduit(refernce); 
} 
@Override 
public void updateProduit(Produit p) { 
dao.updateProduit(p); 
} 
}
IINNJJEECCTTIIOONN DDEESS 
DDDDEEEEPPPPEEEENNNNDDDDAAAANNNNCCCCEEEESSSS 
med@youssfi.net
aapppplliiccaattiioonnCCoonntteexxtt..xxmmll 
?xml version=1.0 encoding=UTF-8? 
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.xsd 
bean id=dao class=org.miage.sid.dao.CatalogueDaoImpl init-method=init/bean 
bean id=metier class=org.miage.sid.metier.CatalogueMetierImpl 
pprrooppeerrttyy nnaammee==ddaaoo rreeff==ddaaoo//pprrooppeerrttyy 
/bean 
/beans 
med@youssfi.net
CCOOUUCCHHEE WWEEBB 
med@youssfi.net
wweebb..xxmmll 
?xml version=1.0 encoding=UTF-8? 
web-app version=2.5 xmlns=http://java.sun.com/xml/ns/javaee 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xsi:schemaLocation=http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
!-- The definition of the Root Spring Container shared by all Servlets and Filters -- 
context-param 
param-namecontextConfigLocation/param-name 
param-valueclasspath*:applicationContext.xml/param-value 
/context-param 
!-- Creates the Spring Container shared by all Servlets and Filters -- 
listener 
listener-classorg.springframework.web.context.ContextLoaderListener/listener-class 
/listener 
med@youssfi.net
wweebb..xxmmll 
!-- Processes application requests -- 
servlet 
servlet-nameappServlet/servlet-name 
servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class 
init-param 
param-namecontextConfigLocation/param-name 
param-value/WEB-INF/spring/appServlet/servlet-context.xml/param-value 
/init-param 
llooaadd--oonn--ssttaarrttuupp11//llooaadd--oonn--ssttaarrttuupp 
/servlet 
servlet-mapping 
servlet-nameappServlet/servlet-name 
url-pattern//url-pattern 
/servlet-mapping 
/web-app 
med@youssfi.net
//WWEEBB-IINNFF//sspprriinngg/aappppSSeerrvvlleett//sseerrvvlleett-ccoonntteexxtt..xxmmll 
?xml version=1.0 encoding=UTF-8? 
beans:beans xmlns=http://www.springframework.org/schema/mvc 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xmlns:beans=http://www.springframework.org/schema/beans 
xmlns:context=http://www.springframework.org/schema/context 
xsi:schemaLocation=http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc.xsd 
http://www.springframework.org/schema/beans 
hhttttpp::////wwwwww..sspprriinnggffrraammeewwoorrkk..oorrgg//sscchheemmaa//bbeeaannss//sspprriinngg--bbeeaannss..xxssdd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd 
med@youssfi.net
//WWEEBB-IINNFF//sspprriinngg/aappppSSeerrvvlleett//sseerrvvlleett-ccoonntteexxtt..xxmmll 
!-- DispatcherServlet Context: defines this servlet's request-processing 
infrastructure -- 
!-- Enables the Spring MVC @Controller programming model -- 
annotation-driven / 
!-- Handles HTTP GET requests for /resources/** by efficiently serving up 
static resources in the ${webappRoot}/resources directory -- 
resources mapping=/resources/** location=/resources/ / 
!-- Resolves views selected for rendering by @Controllers to .jsp 
rreessoouurrcceess iinn tthhee //WWEEBB--IINNFF//vviieewwss ddiirreeccttoorryy ---- 
beans:bean 
class=org.springframework.web.servlet.view.InternalResourceViewResolver 
beans:property name=prefix value=/WEB-INF/views/ / 
beans:property name=suffix value=.jsp / 
/beans:bean 
context:component-scan base-package=org.miage.sid / 
/beans:beans 
med@youssfi.net
CCaattaalloogguueeCCoonnttrroolllleerr 
package org.miage.sid.web; 
import javax.validation.Valid; 
import org.miage.sid.dao.Produit; 
import org.miage.sid.metier.ICatalogueMetier; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
iimmppoorrtt oorrgg..sspprriinnggffrraammeewwoorrkk..vvaalliiddaattiioonn..BBiinnddiinnggRReessuulltt;; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
@Controller 
public class CatalogueController { 
@Autowired 
private ICatalogueMetier metier; 
med@youssfi.net
CCaattaalloogguueeCCoonnttrroolllleerr 
@RequestMapping(/index) 
public String index(Model model){ 
model.addAttribute(produit,new Produit()); 
model.addAttribute(produits, metier.getAllProduits()); 
return produits; 
} 
@RequestMapping(/saveProduit) 
public String save(@Valid Produit p,BindingResult bindingResult,Model 
mmooddeell)){{ 
if(bindingResult.hasErrors()){ 
model.addAttribute(produits, metier.getAllProduits()); 
return produits; 
} 
metier.addProduit(p); 
model.addAttribute(produit,new Produit()); 
model.addAttribute(produits, metier.getAllProduits()); 
return produits; 
} 
med@youssfi.net
CCaattaalloogguueeCCoonnttrroolllleerr 
@RequestMapping(/deleteProduit) 
public String delete(@RequestParam String ref,Model model){ 
metier.deleteProduit(ref); 
model.addAttribute(produit,new Produit()); 
model.addAttribute(produits, metier.getAllProduits()); 
return produits; 
} 
@@RReeqquueessttMMaappppiinngg((//eeddiittPPrroodduuiitt)) 
public String edit(@RequestParam String ref,Model model){ 
model.addAttribute(produit,metier.getProduit(ref)); 
model.addAttribute(produits, metier.getAllProduits()); 
return produits; 
} 
} 
med@youssfi.net
LLaa vvuuee pprroodduuiittss..jjsspp 
%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c % 
%@ taglib uri=http://www.springframework.org/tags/form prefix=f % 
!DOCTYPE html 
html 
head 
meta charset=UTF-8 
titleCatalogue de produits/title 
link rel=stylesheet type=text/css href=%=request.getContextPath() 
%/resources/css/style.css 
/head 
body 
div id=formProduits 
f:form modelAttribute=produit method=post action=saveProduit 
table 
tr 
tdRéférence:/td 
tdf:input path=reference//td 
tdf:errors path=reference cssClass=error//td 
/tr
LLaa vvuuee pprroodduuiittss..jjsspp 
tr 
tdDésignation:/td 
tdf:input path=designation//td 
tdf:errors path=designation cssClass=error//td 
/tr 
tr 
tdPrix:/td tdf:input path=prix//td 
tdf:errors path=prix cssClass=error//td 
/tr 
ttrr 
tdQuantité:/tdtdf:input path=quantite//td 
tdf:errors path=quantite cssClass=error//td 
/tr 
tr 
tdinput type=submit value=Save/td 
/tr 
/table 
/f:form 
/div 
med@youssfi.net
LLaa vvuuee pprroodduuiittss..jjsspp 
div id=listProduits 
table class=table1 
tr 
thREF/ththDESIGNATION/th 
thPRIX/ththQUANTITE/th 
/tr 
c:forEach items=${produits} var=p 
tr 
td${p.reference}/td 
ttdd$${{pp..ddeessiiggnnaattiioonn}}//ttdd 
td${p.prix}/td 
td${p.quantite}/td 
tda href=deleteProduit?ref=${p.reference}Supprimer/a/td 
tda href=editProduit?ref=${p.reference}Edit/a/td 
/tr 
/c:forEach 
/table 
/div 
/body 
/html med@youssfi.net
LLaa ffeeuuiillllee ddee ssttyyllee ccssss :: ssttyyllee..ccssss 
div{ 
padding: 10px; 
margin: 10px; 
border: 1px dotted gray; 
} 
.table1 th{ 
border: 1px dotted gray; 
padding: 10px; 
margin: 10px; 
bbaacckkggrroouunndd:: ppiinnkk;; 
} 
.table1 td{ 
border: 1px dotted gray; 
padding: 10px; 
margin: 10px; 
background: white; 
} 
.error{ 
color: red; 
} 
med@youssfi.net
AApppplliiccaattiioonn 
 On souhait créer une application qui permet de gérer des 
produits. 
 Chaque produit est défini par son code, son nom et son prix. 
 L’application doit permettre de: 
◦ Saisir et ajouter un nouveau produit 
◦ Afficher tous les produits 
◦ Supprimer un produit 
◦ AAjjoouutteerr uunnee lliissttee ddee pprroodduuiittss eennvvooyyééss ppaarr uunn cclliieenntt HHTTTTPP ddaannss 
un fichier Excel 
 Les fonctionnalités de cette application doivent être 
accessibles via : 
◦ Un client HTTP ( Navigateur Web) 
◦ Un client SOAP (Application .Net) 
◦ Un client RMI (Client Lourd Swing Java) 
◦ Un client Androïde (HTTP, JSON) 
med@youssfi.net
SSttrruuccttuurree dduu pprroojjeett 
med@youssfi.net
AArrcchhiitteeccttuurree SGBD 
Spring IOC Container 
ContextLoaderListner 
JPATransaction 
Manager 
Couche Métier 
ICatMetier 
EntityManager 
FactoryBean 
Couche DAO 
ICatDAO 
SimpleJaxWs 
ServiceExporter 
Couche SOAP 
SimpleJaxWs 
ServiceExporter 
Couche RMI 
ICatRemote 
dependencies 
Spring 
JaxWS 
Jax RS 
Jackson 
persistence.xml 
JPA 
Hibernate 
Web Container 
RMI 
Client Java Client SOAP 
CatMetierImpl 
CatDAOImpl 
CatSOAPImpl 
CatRMIImpl 
JDBC 
SOAP 
Client HTTP 
Client Mobile 
DispatcherSevlet 
CatalController 
View.jsp 
HTTP 
HTML 
HTTP 
JSON
MMaavveenn ddeeppeennddeenncciieess :: SSpprriinngg 
pom.xml 
properties 
java-version1.6/java-version 
org.springframework-version 
3.2.3.RELEASE 
/org.springframework-version 
org.aspectj-version1.6.10/org.aspectj-version 
org.slf4j-version1.6.6/org.slf4j-version 
/properties 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
!-- @Inject -- 
dependency 
groupIdjavax.inject/groupId 
artifactIdjavax.inject/artifactId 
version1/version 
/dependency 
!-- AspectJ -- 
dependency 
groupIdorg.aspectj/groupId 
artifactIdaspectjrt/artifactId 
version${org.aspectj-version}/version 
//ddeeppeennddeennccyy 
!-- Spring -- 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-context/artifactId 
version${org.springframework-version}/version 
exclusions 
!-- Exclude Commons Logging in favor of SLF4j -- 
exclusion 
groupIdcommons-logging/groupId 
artifactIdcommons-logging/artifactId 
/exclusion 
/exclusions 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess :: SSpprriinngg 
!-- Spring -- 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-webmvc/artifactId 
version${org.springframework-version}/version 
/dependency 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-orm/artifactId 
vveerrssiioonn$${{oorrgg..sspprriinnggffrraammeewwoorrkk--vveerrssiioonn}}//vveerrssiioonn 
/dependency 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-beans/artifactId 
version${org.springframework-version}/version 
/dependency 
dependency 
groupIdorg.springframework/groupId 
artifactIdspring-tx/artifactId 
version3.2.2.RELEASE/version 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
!-- Hibernte JPA -- 
dependency 
groupIdorg.hibernate/groupId 
artifactIdhibernate-commons-annotations/artifactId 
version3.2.0.Final/version 
/dependency 
dependency 
groupIdorg.hibernate/groupId 
artifactIdhibernate-entitymanager/artifactId 
vveerrssiioonn33..66..00..FFiinnaall//vveerrssiioonn 
/dependency 
dependency 
groupIdorg.hibernate/groupId 
artifactIdhibernate-validator/artifactId 
version4.1.0.Final/version 
/dependency 
dependency 
groupIdorg.hibernate.javax.persistence/groupId 
artifactIdhibernate-jpa-2.0-api/artifactId 
version1.0.0.Final/version 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess :: LLooggggiinngg 
!-- Logging -- 
dependency 
groupIdorg.slf4j/groupId 
artifactIdslf4j-api/artifactId 
version${org.slf4j-version}/version 
/dependency 
dependency 
groupIdorg.slf4j/groupId 
artifactIdjcl-over-slf4j/artifactId 
version${org.slf4j-version}/version 
scoperuntime/scope 
/dependency 
dependency 
groupIdorg.slf4j/groupId 
artifactIdslf4j-log4j12/artifactId 
version${org.slf4j-version}/version 
scoperuntime/scope 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess :: LLoo44jj 
dependency 
groupIdlog4j/groupId 
artifactIdlog4j/artifactId 
version1.2.15/version 
exclusions 
exclusion 
groupIdjavax.mail/groupId 
artifactIdmail/artifactId 
/exclusion 
exclusion 
ggrroouuppIIddjjaavvaaxx..jjmmss//ggrroouuppIIdd 
artifactIdjms/artifactId 
/exclusion 
exclusion 
groupIdcom.sun.jdmk/groupId 
artifactIdjmxtools/artifactId 
/exclusion 
exclusion 
groupIdcom.sun.jmx/groupId 
artifactIdjmxri/artifactId 
/exclusion 
/exclusions 
scoperuntime/scope 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess :: WWeebb 
!-- Servlet -- 
dependency 
groupIdjavax.servlet/groupId 
artifactIdservlet-api/artifactId 
version2.5/version 
scopeprovided/scope 
/dependency 
dependency 
groupIdjavax.servlet.jsp/groupId 
artifactIdjsp-api/artifactId 
version2.1/version 
scopeprovided/scope 
/dependency 
dependency 
groupIdjavax.servlet/groupId 
artifactIdjstl/artifactId 
version1.2/version 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess 
!-- Test -- 
dependency 
groupIdjunit/groupId 
artifactIdjunit/artifactId 
version4.7/version 
scopetest/scope 
/dependency 
!– MySQL JDBC Driver -- 
dependency 
groupIdmysql/groupId 
aarrttiiffaaccttIIddmmyyssqqll--ccoonnnneeccttoorr--jjaavvaa//aarrttiiffaaccttIIdd 
version5.1.6/version 
/dependency 
!– To generate JSON with jackson -- 
dependency 
groupIdorg.codehaus.jackson/groupId 
artifactIdjackson-core-asl/artifactId 
version1.9.10/version 
/dependency 
dependency 
groupIdorg.codehaus.jackson/groupId 
artifactIdjackson-mapper-asl/artifactId 
version1.9.10/version 
/dependency 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess :: SSpprriinngg SSeeccuurruuttyy 
!-- Spring Security -- 
dependency 
groupIdorg.springframework.security/groupId 
artifactIdspring-security-core/artifactId 
version3.2.0.RELEASE/version 
/dependency 
dependency 
groupIdorg.springframework.security/groupId 
artifactIdspring-security-config/artifactId 
version3.2.0.RELEASE/version 
/dependency 
dependency 
groupIdorg.springframework.security/groupId 
artifactIdspring-security-web/artifactId 
version3.2.0.RELEASE/version 
/dependency 
/dependencies 
med@youssfi.net
MMaavveenn DDeeppeennddeenncciieess :: FFiillee UUppllooaadd eett EExxcceell 
!-- Apache Commons Upload -- 
dependency 
groupIdcommons-fileupload/groupId 
artifactIdcommons-fileupload/artifactId 
version1.2.2/version 
/dependency 
dependency 
groupIdcommons-io/groupId 
aarrttiiffaaccttIIddccoommmmoonnss--iioo//aarrttiiffaaccttIIdd 
version1.3.2/version 
/dependency 
!-- Apache Excel -- 
dependency 
groupIdorg.apache.poi/groupId 
artifactIdpoi/artifactId 
version3.7/version 
/dependency 
med@youssfi.net
med@youssfi.net
EEnnttiittiieess 
med@youssfi.net
EEnnttiittéé :: PPrroodduuiitt 
package ma.enset.catalogue.entities; 
import java.io.Serializable;import javax.persistence.*; 
import javax.validation.constraints.Size; 
import org.hibernate.validator.constraints.NotEmpty; 
@Entity 
public class Produit implements Serializable { 
@Id 
@@GGeenneerraatteeddVVaalluuee((ssttrraatteeggyy==GGeenneerraattiioonnTTyyppee..IIDDEENNTTIITTYY)) 
private Long idProduit; 
@NotEmpty 
@Size(max=60,min=3) 
private String nomProduit; 
private double prix; 
// Constructeur sans paramètre 
// Constructeur avec paramètres (nom, prix) 
// Getters et Setters 
} 
med@youssfi.net
CCoouucchhee DDAAOO 
med@youssfi.net
IInntteerrffaaccee DDAAOO 
package ma.enset.catalogue.dao; 
import java.util.List; 
import ma.enset.catalogue.entities.Produit; 
public interface ICatalogueDAO { 
ppuubblliicc vvooiidd aaddddPPrroodduuiitt((PPrroodduuiitt pp));; 
public ListProduit listProduits(); 
public void deleteProduit(Long idP); 
public Produit editProduit(Long idP); 
public void updateProduit(Produit p); 
public ListProduit chercherProduits(String motCle); 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn DDAAOO 
package ma.enset.catalogue.dao; 
import java.util.List;import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query;import ma.enset.catalogue.entities.Produit; 
public class CatalogueDaoImpl implements ICatalogueDAO { 
@PersistenceContext 
private EntityManager entityManager; 
@Override 
public void addProduit(Produit p) { 
entityManager.persist(p); 
} 
@Override 
public ListProduit listProduits() { 
Query req=entityManager.createQuery(select p from Produit p); 
return req.getResultList(); 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn DDAAOO 
@Override 
public void deleteProduit(Long idP) { 
Produit p=entityManager.find(Produit.class,idP); 
entityManager.remove(p); 
} 
@Override 
public Produit editProduit(Long idP) { 
Produit p=entityManager.find(Produit.class,idP); 
return p; 
} 
@Override 
public void updateProduit(Produit p) { 
entityManager.merge(p); 
} 
@Override 
public ListProduit chercherProduits(String motCle) { 
Query req=entityManager.createQuery(select p from Produit p where p.nomProduit like :x); 
req.setParameter(x, %+motCle+%); 
return req.getResultList(); 
} 
} med@youssfi.net
CCoouucchhee MMééttiieerr 
med@youssfi.net
IInntteerrffaaccee MMééttiieerr 
package ma.enset.catalogue.metier; 
import java.util.List; 
import ma.enset.catalogue.entities.Produit; 
public interface ICatalogueMetier { 
public void addProduit(Produit p); 
ppuubblliicc LLiissttPPrroodduuiitt lliissttPPrroodduuiittss(());; 
public void deleteProduit(Long idP); 
public Produit editProduit(Long idP); 
public void updateProduit(Produit p); 
public ListProduit chercherProduits(String 
motCle); 
} 
med@youssfi.net
IImmpplléémmeennttaattiioonn mmééttiieerr 
package ma.enset.catalogue.metier; 
import java.util.List; 
import org.springframework.transaction.annotation.Transactional; 
import ma.enset.catalogue.dao.ICatalogueDAO; 
import ma.enset.catalogue.entities.Produit; 
public class CatalogueMetierImpl implements ICatalogueMetier { 
pprriivvaattee IICCaattaalloogguueeDDAAOO ddaaoo;; 
public void setDao(ICatalogueDAO dao) { 
this.dao = dao; 
} 
@Override 
@Transactional 
public void addProduit(Produit p) { 
dao.addProduit(p); 
} 
med@youssfi.net
Implémentation mmééttiieerr 
@Override 
public ListProduit listProduits() { return dao.listProduits(); } 
@Override 
@Transactional 
public void deleteProduit(Long idP) { dao.deleteProduit(idP); } 
@Override 
public Produit editProduit(Long idP) { return dao.editProduit(idP); } 
@Override 
@@TTrraannssaaccttiioonnaall 
public void updateProduit(Produit p) { 
dao.updateProduit(p); 
} 
@Override 
@Transactional 
public ListProduit chercherProduits(String motCle) { 
return dao.chercherProduits(motCle); 
} 
} 
med@youssfi.net
WWeebb SSeerrvviiccee SSOOAAPP 
package ma.enset.catalogue.service; 
import java.util.List; 
import javax.jws.WebParam; 
import javax.jws.WebService; 
import org.springframework.beans.factory.annotation.Autowired; 
import ma.enset.catalogue.entities.Produit; 
import ma.enset.catalogue.metier.ICatalogueMetier; 
@WebService 
ppuubblliicc ccllaassss CCaattaalloogguueeSSeerrvviiccee {{ 
private ICatalogueMetier metier; 
public void setMetier(ICatalogueMetier metier) { 
this.metier = metier; 
} 
public ListProduit listProduits(){ 
return metier.listProduits(); 
} 
public Produit getProduit(@WebParam(name=idProduit)Long idP){ 
return metier.editProduit(idP); 
}} 
med@youssfi.net
Service RRMMII :: IInntteerrffaaccee RReemmoottee 
package ma.enset.catalogue.rmi; 
import java.rmi.Remote; 
import java.rmi.RemoteException; 
import java.util.List; 
import ma.enset.catalogue.entities.Produit; 
ppuubblliicc iinntteerrffaaccee IICCaattaalloogguueeRReemmoottee eexxtteennddss RReemmoottee {{ 
public void addProduit(Produit p)throws RemoteException;; 
public ListProduit listProduits()throws RemoteException;; 
public void deleteProduit(Long idP)throws RemoteException;; 
public Produit editProduit(Long idP)throws RemoteException;; 
public void updateProduit(Produit p)throws RemoteException;; 
} 
med@youssfi.net
Service RMI : Implémentation dduu sseerrvviiccee RRMMII 
package ma.enset.catalogue.rmi; 
import java.rmi.RemoteException; 
import java.util.List; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import ma.enset.catalogue.entities.Produit; 
import ma.enset.catalogue.metier.ICatalogueMetier; 
ppuubblliicc ccllaassss CCaattaalloogguueeRRmmiiSSeerrvviicceeIImmppll iimmpplleemmeennttss IICCaattaalloogguueeRReemmoottee {{ 
private ICatalogueMetier metier; 
public void setMetier(ICatalogueMetier metier) { 
this.metier = metier; 
} 
@Override 
public void addProduit(Produit p) throws RemoteException { 
metier.addProduit(p); 
} 
med@youssfi.net
Service RMI : Implémentation dduu sseerrvviiccee RRMMII 
@Override 
public ListProduit listProduits() throws RemoteException { 
return metier.listProduits(); 
} 
@Override 
public void deleteProduit(Long idP) throws RemoteException { 
metier.deleteProduit(idP); 
} 
@Override 
public Produit editProduit(Long idP) throws RemoteException { 
return metier.editProduit(idP); 
} 
@Override 
public void updateProduit(Produit p) throws RemoteException { 
metier.updateProduit(p); 
} 
} med@youssfi.net
mmaaiinn//jjaavvaa//rreessoouurrcceess//MMEETTAA-IINNFF// 
ppeerrssiisstteennccee..xxmmll 
?xml version=1.0 encoding=UTF-8? 
persistence xmlns=http://java.sun.com/xml/ns/persistence 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xsi:schemaLocation=http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd 
version=2.0 
persistence-unit name=MY_P_U transaction-type=RESOURCE_LOCAL 
providerorg.hibernate.ejb.HibernatePersistence/provider 
properties 
property name=hibernate.show_sql value=true/ 
property name=hibernate.hbm2ddl.auto value=update/ 
/properties 
/persistence-unit 
/persistence 
med@youssfi.net
Injection ddeess ddééppeennddaanncceess 
med@youssfi.net
Injection ddeess ddééppeennddaanncceess 
//WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll 
?xml version=1.0 encoding=UTF-8? 
beans xmlns=http://www.springframework.org/schema/beans 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xmlns:context=http://www.springframework.org/schema/context 
xmlns:p=http://www.springframework.org/schema/p 
xmlns:tx=http://www.springframework.org/schema/tx 
xsi:schemaLocation=http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
hhttttpp::////wwwwww..sspprriinnggffrraammeewwoorrkk..oorrgg//sscchheemmaa//ccoonntteexxtt hhttttpp::////wwwwww..sspprriinnggffrraammeewwoorrkk..oorrgg//sscchheemmaa//ccoonntteexxtt//sspprriinngg--ccoonntteexxtt--33..11..xxssdd 
!-- Root Context: defines shared resources visible to all other web components -- 
context:annotation-config/context:annotation-config 
bean id=dao class=ma.enset.catalogue.dao.CatalogueDaoImpl/bean 
bean id=metier class=ma.enset.catalogue.metier.CatalogueMetierImpl 
property name=dao ref=dao/property 
/bean 
med@youssfi.net
Injection ddeess ddééppeennddaanncceess 
//WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll 
bean id=datasource 
class=org.springframework.jdbc.datasource.DriverManagerDataSource 
property name=driverClassName value=com.mysql.jdbc.Driver/property 
property name=url value=jdbc:mysql://locahost:3306/DB_SID_CAT/property 
property name=username value=root/property 
property name=password value=/property 
/bean 
bean id=persistenceUnitManager 
class=org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager 
property name=persistenceXmlLocations 
list 
valueclasspath*:META-INF/persistence.xml/value 
/list 
/property 
property name=defaultDataSource ref=dataSource/property 
/bean 
med@youssfi.net
Injection ddeess ddééppeennddaanncceess 
//WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll 
bean id=entityManagerFactory 
class=org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 
property name=persistenceUnitManager 
ref=persistenceUnitManager/property 
property name=persistenceUnitName value=MY_P_U/property 
/bean 
bbeeaann iidd==ttrraannssaaccttiioonnMMaannaaggeerr 
class=org.springframework.orm.jpa.JpaTransactionManager 
property name=entityManagerFactory ref=entityManagerFactory/property 
/bean 
tx:annotation-driven transaction-manager=transactionManager/ 
med@youssfi.net
Injection ddeess ddééppeennddaanncceess 
//WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll 
bean id=service class=ma.enset.catalogue.service.CatalogueService 
property name=metier ref=metier/property 
/bean 
bean class=org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter 
property name=baseAddress value=http://localhost:8080/services//property 
/bean 
bbeeaann iidd==rrmmiiCCaattaalloogguuee ccllaassss==mmaa..eennsseett..ccaattaalloogguuee..rrmmii..CCaattaalloogguueeRRmmiiSSeerrvviicceeIImmppll 
property name=metier ref=metier/property 
/bean 
bean class=org.springframework.remoting.rmi.RmiServiceExporter 
property name=serviceName value=catService/property 
property name=service ref=rmiCatalogue/property 
property name=serviceInterface 
value=ma.enset.catalogue.rmi.ICatalogueRemote/property 
/bean 
/beans 
med@youssfi.net
Couche WWeebb :: CCoonnttrrôôlleeuurr 
package ma.enset.catalogue.controllers; 
import java.util.List; import javax.validation.Valid; 
import ma.enset.catalogue.entities.Produit; import ma.enset.catalogue.metier.ICatalogueMetier; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.annotation.*; 
@Controller 
public class CatalogueController { 
@Autowired 
private ICatalogueMetier metier; 
@RequestMapping(value=/index) 
public String index(Model model){ 
model.addAttribute(produit, new Produit()); 
model.addAttribute(produits, metier.listProduits()); 
return produits; 
} 
med@youssfi.net
Couche WWeebb :: CCoonnttrrôôlleeuurr 
@RequestMapping(value=/saveProduit) 
public String saveProduit(@Valid Produit p,BindingResult 
bindingResult,Model model){ 
if(bindingResult.hasErrors()) return produits; 
if(p.getIdProduit()==null) 
metier.addProduit(p); 
else metier.updateProduit(p); 
model.addAttribute(produit, new Produit()); 
mmooddeell..aaddddAAttttrriibbuuttee((pprroodduuiittss, mmeettiieerr..lliissttPPrroodduuiittss(())));; 
return produits; 
} 
@RequestMapping(value=/deleteProduit) 
public String delete(@RequestParam(value=id) Long id, Model model){ 
metier.deleteProduit(id); 
model.addAttribute(produit, new Produit()); 
model.addAttribute(produits, metier.listProduits()); 
return produits; 
} 
med@youssfi.net
Couche WWeebb :: CCoonnttrrôôlleeuurr 
@RequestMapping(value=/editProduit/{id}) 
public String edit(@PathVariable(value=id) Long id, Model model){ 
Produit p=metier.editProduit(id); 
model.addAttribute(produit, p); 
model.addAttribute(produits, metier.listProduits()); 
return produits; 
} 
@@RReeqquueessttMMaappppiinngg((vvaalluuee==//lliissttPPrroodduuiittss//{{mmcc}})) 
@ResponseBody 
public ListProduit listProduits(@PathVariable(value=mc)String mc){ 
return metier.chercherProduits(mc); 
} 
} 
med@youssfi.net
VVuuee :: pprroodduuiittss..jjsspp 
med@youssfi.net
VVuuee :: pprroodduuiittss..jjsspp 
med@youssfi.net
VVuuee :: pprroodduuiittss..jjsspp 
%@ page language=java contentType=text/html; charset=ISO-8859-1 
pageEncoding=ISO-8859-1% 
%@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c % 
%@taglib uri=http://www.springframework.org/tags/form prefix=f % 
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN 
http://www.w3.org/TR/html4/loose.dtd 
html 
head 
mmeettaa hhttttpp--eeqquuiivv==CCoonntteenntt--TTyyppee ccoonntteenntt==tteexxtt//hhttmmll;; cchhaarrsseett==IISSOO--88885599--11 
titleInsert title here/title 
/head 
body 
f:form action=saveProduit modelAttribute=produit 
table 
tr 
tdID Produit:f:hidden path=idProduit//td 
td${produit.idProduit}/td 
/tr 
med@youssfi.net
VVuuee :: pprroodduuiittss..jjsspp 
tr 
tdNom Produit:/td 
tdf:input path=nomProduit//td 
tdf:errors path=nomProduit cssClass=error//td 
/tr 
tr 
tdPrix:/td 
tdf:input path=prix//td 
tdf:errors path=prix cssClass=error//td 
/tr 
tr 
tdinput type=submit value=Save/td 
/tr 
/table 
/f:form 
/body 
med@youssfi.net
VVuuee :: pprroodduuiittss..jjsspp 
table border=1 width=80% 
tr 
thID/ththNom/ththPrix/th 
/tr 
c:forEach items=${produits} var=p 
tr 
td${p.idProduit }/td 
td${p.nomProduit }/td 
td${p.prix }/td 
tda href=deleteProduit?id=${p.idProduit }Supprimer/a/td 
tda href=editProduit/${p.idProduit }Edit/a/td 
/tr 
/c:forEach 
/table 
/html 
med@youssfi.net
TTeesstteerr llee wweebb sseerrvviiccee 
med@youssfi.net
Tester lleess mméétthhooddeess aavveecc ooxxyyggeenn 
med@youssfi.net
Requête eett rrééppoonnssee SSOOAAPP 
 SOAP-ENV:Envelope xmlns:SOAP-ENV= 
http://schemas.xmlsoap.org/soap/envelope/ 
SOAP-ENV:Header/ 
SOAP-ENV:Body 
listProduits xmlns=http://service.catalogue.enset.ma// 
/SOAP-ENV:Body 
/SOAP-ENV:Envelope 
 ?xml version=1.0 ? 
S:Envelope xmlns:S=http://schemas.xmlsoap.org/soap/envelope/ 
S:Body 
ns2:listProduitsResponse xmlns:ns2=http://service.catalogue.enset.ma/ 
return 
idProduit12/idProduit 
SGBD 
Couche DAO 
Couche Métier 
med@youssfi.net 
nomProduitaaaaa/nomProduit 
prix0.0/prix 
/return 
return 
idProduit13/idProduit 
nomProduitaaaaa/nomProduit 
prix0.0/prix 
/return 
return 
idProduit20/idProduit 
nomProduitpppppp/nomProduit 
prix0.0/prix 
/return 
return 
idProduit26/idProduit 
nomProduitHP980900/nomProduit 
prix9800.0/prix 
/return 
/ns2:listProduitsResponse 
/S:Body 
/S:Envelope 
Web Service 
SOAP 
OXYGEN
Requête eett rrééppoonnssee SSOOAAPP 
 SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ 
SOAP-ENV:Header/ 
SOAP-ENV:Body 
getProduit xmlns=http://service.catalogue.enset.ma/ 
idProduit xmlns=26/idProduit 
/getProduit 
/SOAP-ENV:Body 
/SOAP-ENV:Envelope 
med@youssfi.net 
 ?xml version=1.0 ? 
S:Envelope xmlns:S=http://schemas.xmlsoap.org/soap/envelope/ 
S:Body 
ns2:getProduitResponse xmlns:ns2=http://service.catalogue.enset.ma/ 
return 
idProduit26/idProduit 
nomProduitHP980900/nomProduit 
prix9800.0/prix 
/return 
/ns2:getProduitResponse 
/S:Body 
/S:Envelope
CClliieenntt RRMMII 
import java.rmi.Naming; 
import java.util.List; 
import ma.enset.catalogue.entities.Produit; 
import ma.enset.catalogue.rmi.ICatalogueRemote; 
public class ClientRMICatalogue { 
public static void main(String[] args) { 
try { 
ICatalogueRemote stub=(ICatalogueRemote) 
Naming.lookup(rmi://localhost:1099/catService); 
ListProduit prods=stub.listProduits(); 
SGBD 
Couche DAO 
Couche Métier 
Service RMI 
for(Produit p:prods){ 
System.out.println(p.getNomProduit()); 
System.out.println(p.getPrix()); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
} 
med@youssfi.net 
RMI 
Client RMI
CClliieenntt AAnnddrrooïïddee 
SGBD 
Couche DAO 
Couche Métier 
Service WEB 
med@youssfi.net 
HTTP 
JSON 
Client Mobile 
Androide
VVuuee 
med@youssfi.net
LL’’aaccttiivviittéé 
package com.example.catalogue; 
import java.io.*;import org.apache.http.*;import org.apache.http.client.*; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.*;import android.os.*;import android.app.Activity; 
import android.view.*;import android.view.View.OnClickListener; 
import android.widget.*; 
public class MainActivity extends Activity implements OnClickListener { 
private EditText editTextMC; private Button buttonOK; 
private GridView gridViewProduits; 
@Override 
pprrootteecctteedd vvooiidd oonnCCrreeaattee((BBuunnddllee ssaavveeddIInnssttaanncceeSSttaattee)) {{ 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
buttonOK=(Button) findViewById(R.id.button1); 
editTextMC=(EditText) findViewById(R.id.editTextMC); 
gridViewProduits=(GridView) findViewById(R.id.gridView1); 
buttonOK.setOnClickListener(this); 
StrictMode.ThreadPolicy threadPolicy=new 
StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(threadPolicy); 
} 
med@youssfi.net
LL’’aaccttiivviittéé 
@Override 
public void onClick(View arg0) { 
Toast.makeText(getApplicationContext(), Chargement,Toast.LENGTH_LONG).show(); 
StringBuilder reponseHTTP = new StringBuilder(); 
HttpClient client = new DefaultHttpClient(); 
String mc=editTextMC.getText().toString(); 
HttpGet httpGet = new HttpGet 
(http://192.168.1.79:8080/catalogue/listProduits/+mc); 
try { 
HttpResponse response = client.execute(httpGet); 
StatusLine statusLine = response.getStatusLine(); 
int statusCode = statusLine.getStatusCode(); 
if (statusCode == 200) { 
HttpEntity entity = response.getEntity(); 
InputStream content = entity.getContent(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
String line; 
while ((line = reader.readLine()) != null) { 
reponseHTTP.append(line); 
} 
med@youssfi.net
LL’’aaccttiivviittéé 
JSONArray jsonArray=new JSONArray(reponseHTTP.toString()); 
String[] produits=new String[(jsonArray.length()+1)*3]; 
int index=-1; 
produits[++index]=ID;produits[++index]=NOM;produits[++index]=PRIX; 
for (int i = 0; i  jsonArray.length(); i++) { 
JSONObject jsonObject = jsonArray.getJSONObject(i); 
produits[++index]=jsonObject.getString(idProduit); 
produits[++index]=jsonObject.getString(nomProduit); 
produits[++index]=jsonObject.getString(prix); 
} 
ArrayAdapterString adapter = new ArrayAdapterString 
(this, android.R.layout.simple_list_item_1, produits); 
gridViewProduits.setAdapter(adapter); 
} else { 
Toast.makeText(getApplicationContext(), Code =+statusCode, 
Toast.LENGTH_LONG).show(); 
} } catch (Exception e) { 
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
e.printStackTrace(); 
}}} 
med@youssfi.net
UUppllooaadd dd’’uunn ffiicchhiieerr FFoorrmmaatt EExxcceell qquuii ccoonnttiieenntt lleess pprroodduuiittss 
Classeur.x1.xls 
med@youssfi.net
DDééppeennddaanncceess 
!-- Apache Commons Upload -- 
dependency 
groupIdcommons-fileupload/groupId 
artifactIdcommons-fileupload/artifactId 
version1.2.2/version 
/dependency 
!-- Apache Commons Upload -- 
ddeeppeennddeennccyy 
groupIdcommons-io/groupId 
artifactIdcommons-io/artifactId 
version1.3.2/version 
/dependency 
!-- Apache Excel -- 
dependency 
groupIdorg.apache.poi/groupId 
artifactIdpoi/artifactId 
version3.7/version 
/dependency 
med@youssfi.net
CCllaassssee UUppllooaaddeeddFFiillee 
package ma.enset.catalogue.controllers; 
import org.springframework.web.multipart.commons.CommonsMultipartFile; 
public class UploadedFile { 
private CommonsMultipartFile file; 
ppuubblliicc CCoommmmoonnssMMuullttiippaarrttFFiillee ggeettFFiillee(()) {{ 
return file; 
} 
public void setFile(CommonsMultipartFile file) { 
this.file = file; 
} 
} 
med@youssfi.net
CCoonnttrroolleeuurr 
package ma.enset.catalogue.controllers; 
import java.io.File;import java.io.FileOutputStream; 
import java.util.ArrayList;import java.util.HashMap; 
import java.util.List;import java.util.Map; 
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; 
import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.HandlerExceptionResolver; 
import org.springframework.web.servlet.ModelAndView; 
import ma.enset.catalogue.entities.Produit; 
import ma.enset.catalogue.metier.ICatalogueMetier; 
@Controller 
public class UploadProduitsController implements HandlerExceptionResolver { 
@Autowired 
private ICatalogueMetier metier; 
@RequestMapping(value=/formUpload) 
public String formUpload(@ModelAttribute(value=form) UploadedFile form){ 
return formUpload; 
} 
med@youssfi.net
Contrôleur : Sauvegarde dduu ffiicchhiieerr 
@RequestMapping(value=/saveUploadedFile) 
public String saveUploadedFile( 
@ModelAttribute(value=form) UploadedFile form, 
BindingResult bindingResult,Model model){ 
if(!bindingResult.hasErrors()){ 
try { 
// Enregistrement du fichier 
String filePath= 
SSyysstteemm..ggeettPPrrooppeerrttyy((jjaavvaa..iioo..ttmmppddiirr))++//++ffoorrmm..ggeettFFiillee(())..ggeettOOrriiggiinnaallFFii 
lename(); 
FileOutputStream outputStream=new FileOutputStream(new File(filePath)); 
outputStream.write(form.getFile().getFileItem().get()); 
outputStream.close(); 
System.out.println(form.getFile().getSize()); 
med@youssfi.net
CCoonnttrrôôlleeuurr :: TTrraaiitteemmeett dduu ffiicchhiieerr EExxcceell 
// Interprétation du fichier Excel 
HSSFWorkbook workbook=new HSSFWorkbook(form.getFile().getInputStream()); 
HSSFSheet f1=workbook.getSheet(Feuil1); 
int l1=f1.getFirstRowNum(); 
int l2=f1.getLastRowNum(); 
ListProduit produits=new ArrayListProduit(); 
for(int i=l1+1;i=l2;i++){ 
Produit p=new Produit(); 
HSSFRow r1=f1.getRow(i); 
int n1=r1.getFirstCellNum(); 
p.setNomProduit(r1.getCell(n1).getStringCellValue()); 
p.setPrix(r1.getCell(n1+1).getNumericCellValue()); 
metier.addProduit(p); 
produits.add(p); 
} 
model.addAttribute(produits, produits); 
} catch (Exception e) { 
throw new RuntimeException(e); 
}} 
return formUpload; 
} 
med@youssfi.net
Contrôleur :: GGeessttiioonn ddeess EExxcceeppttiioonnss 
@Override 
public ModelAndView resolveException(HttpServletRequest request, 
HttpServletResponse response, Object o, Exception e) { 
MapObject, Object model=new HashMapObject, Object(); 
model.put(errors, e.getMessage()); 
model.put(form, new UploadedFile()); 
return new ModelAndView(formUpload,(Map)model); 
} 
} 
med@youssfi.net
Vue :: ffoorrmmUUppllooaadd..jjsspp 
%@ page language=java contentType=text/html; charset=ISO-8859-1 
pageEncoding=ISO-8859-1% 
%@taglib prefix=c uri=http://java.sun.com/jsp/jstl/core % 
%@taglib prefix=f uri=http://www.springframework.org/tags/form % 
html 
head 
meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1 
titleInsert title here/title 
/head 
bbooddyy 
f:form commandName=form action=saveUploadedFile enctype=multipart/form-data 
method=post 
table 
tr 
tdFichier Excel (Froamt XLS):/td 
tdf:input type=file path=file/ 
tdf:errors path=*/f:errors${errors}/td 
/tr 
tr tdinput type=submit value=Upload//td /tr 
/table 
/f:form 
med@youssfi.net
Vue :: ffoorrmmUUppllooaadd..jjsspp 
h3Content/h3 
table border=1 
tr 
thNom/ththPrix/th 
/tr 
c:forEach items=${produits} var=p 
tr 
td${p.nomProduit}/td 
td${p.prix}/td 
/tr 
/c:forEach 
/table 
/body 
/html 
med@youssfi.net
Limitation de la taille ddeess ffiicchhiieerrss 
uuppllooaaddéé 
Fichier : /WEB-INF/spring/appServlet/servlet-context.xml 
beans:bean 
class=org.springframework.web.multipart.commons.CommonsMultipartResolver 
id=multipartResolver 
beans:property name=maxUploadSize value=100000/beans:property 
/beans:bean 
med@youssfi.net
SSPPRRIINNGG SSEECCUURRIITTYY 
med@youssfi.net
wweebb..xxmmll 
 Déclarer le filtre DelegatingFilterProxy dans le fichier web.xml 
 Toutes les requêtes HTTP passent par ce filtre. 
 Le nom du filtre est : springSecurityFilterChain 
 Ce nom devrait correspondre au nom d’un bean spring qui sera déployé par 
ContextLoaderListener et qui contient les règles de sécurité à exécuter. 
!-- Spring Security -- 
filter 
filter-namespringSecurityFilterChain/filter-name 
filter-class 
org.springframework.web.filter.DelegatingFilterProxy/filter-class 
/filter 
filter-mapping 
filter-namespringSecurityFilterChain/filter-name 
url-pattern/*/url-pattern 
/filter-mapping 
med@youssfi.net
BBaassee ddee ddoonnnnééeess 
 Créer deux tables : 
◦ Users : qui contient les utilisateurs autorisés à accéder à 
l’application 
◦ Roles : qui contient les rôles de chaque utilisateur 
med@youssfi.net
Base de ddoonnnnééeess :: TTaabbllee UUsseerrss 
-- 
-- Structure de la table `users` 
-- 
CREATE TABLE IF NOT EXISTS `users` ( 
`ID_USER` int(11) NOT NULL AUTO_INCREMENT, 
`username` varchar(15) NOT NULL, 
`PASSWORD` varchar(100) NOT NULL, 
`ACTIVED` tinyint(1) NOT NULL, 
PRIMARY KEY (`ID_USER`), 
UUNNIIQQUUEE KKEEYY ``LLOOGGIINN`` ((``uusseerrnnaammee``)) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 
-- 
-- Contenu de la table `users` 
-- 
INSERT INTO `users` (`ID_USER`, `username`, `PASSWORD`, `ACTIVED`) VALUES 
(1, 'admin1', 'e00cf25ad42683b3df678c61f42c6bda', 1), 
(2, 'admin2', 'c84258e9c39059a89ab77d846ddab909', 1), 
(3, 'user', 'ee11cbb19052e40b07aac0ca060c23ee', 1); 
med@youssfi.net
Base de ddoonnnnééeess :: TTaabbllee rroolleess 
-- 
-- Structure de la table `roles` 
-- 
CREATE TABLE IF NOT EXISTS `roles` ( 
`ID_ROLE` int(11) NOT NULL AUTO_INCREMENT, 
`ID_USER` int(11) NOT NULL, 
`ROLE_NAME` varchar(20) NOT NULL, 
PRIMARY KEY (`ID_ROLE`), 
KEY `ID_USER` (`ID_USER`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 
-- 
---- CCoonntteennuu ddee llaa ttaabbllee ``rroolleess`` 
-- 
INSERT INTO `roles` (`ID_ROLE`, `ID_USER`, `ROLE_NAME`) VALUES 
(1, 1, 'ROLE_ADMIN_CAT'), 
(2, 1, 'ROLE_ADMIN_PROD'), 
(3, 2, 'ROLE_ADMIN_PROD'), 
(4, 3, 'ROLE_USER'); 
-- 
-- Contraintes pour la table `roles` 
-- 
ALTER TABLE `roles` 
ADD CONSTRAINT `roles_ibfk_1` FOREIGN KEY (`ID_USER`) REFERENCES `users` (`ID_USER`); 
med@youssfi.net
rroooott-ccoonntteexxtt..xxmmll 
?xml version=1.0 encoding=UTF-8? 
beans xmlns=http://www.springframework.org/schema/beans 
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xmlns:tx=http://www.springframework.org/schema/tx 
xmlns:context=http://www.springframework.org/schema/context 
xmlns:s=http://www.springframework.org/schema/security 
xsi:schemaLocation=http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.2.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
bean id=datasource class=org.springframework.jdbc.datasource.DriverManagerDataSource 
property name=driverClassName value=com.mysql.jdbc.Driver/property 
property name=url value=jdbc:mysql://localhost:3306/DB_SID_CAT/property 
property name=username value=root/property 
property name=password value=/property 
/bean 
med@youssfi.net
rroooott-ccoonntteexxtt..xxmmll 
s:http 
s:intercept-url pattern=/produits/** access=ROLE_ADMIN_PROD/ 
s:intercept-url pattern=/categories/** access=ROLE_ADMIN_CAT/ 
s:form-login login-page=/login default-target-url=/produits/index 
authentication-failure-url=/login / 
s:logout logout-success-url=/logout / 
/s:http 
s:authentication-manager 
s:authentication-provider 
s:password-encoder hash=md5/s:password-encoder 
s:jdbc-user-service data-source-ref=datasource 
users-by-username-query=select username,password, actived 
from users where username=? 
authorities-by-username-query=select u.username, r.role_name from users u, roles r 
where u.id_user = r.id_user and u.username =?  / 
!-- 
s:user-service 
s:user name=admin1 password=admin1 authorities=ROLE_ADMIN_PROD/ 
s:user name=admin2 authorities=ROLE_ADMIN_CAT,ROLE_ADMIN_PROD password=admin2 / 
/s:user-service 
-- 
/s:authentication-provider 
/s:authentication-manager 
/beans med@youssfi.net
CCoonnttrrôôlleeuurr 
package org.enset.sid.controllers; 
import org.springframework.stereotype.Controller; 
import 
org.springframework.web.bind.annotation.RequestMa 
pping; 
@Controller 
public class LoginController { 
@RequestMapping(/login) 
public String login(){ 
return login; 
} 
} 
med@youssfi.net
llooggiinn..jjsspp 
html 
head 
meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1 
titleInsert title here/title 
/head 
body 
form action=j_spring_security_check method=post 
table 
tr 
tdLogin/td 
tdinput type=text name=j_username/td 
//ttrr 
tr 
tdPass word/td 
tdinput type=password name=j_password/td 
/tr 
tr 
tdinput type=submit value=Login/td 
/tr 
/table 
/form 
/body 
/html 
med@youssfi.net

Contenu connexe

Tendances

Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...ENSET, Université Hassan II Casablanca
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...ENSET, Université Hassan II Casablanca
 

Tendances (20)

Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFITheses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Cours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapterCours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapter
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Cours design pattern m youssfi partie 2 observer
Cours design pattern m youssfi partie 2 observerCours design pattern m youssfi partie 2 observer
Cours design pattern m youssfi partie 2 observer
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
 
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 

En vedette (10)

Cours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweightCours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweight
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeSystèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
 
Cours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 compositeCours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 composite
 
Cours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateurCours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateur
 
Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)
 
Resume
ResumeResume
Resume
 
Intelligence artificielle et système multi-agent
Intelligence artificielle et système multi-agentIntelligence artificielle et système multi-agent
Intelligence artificielle et système multi-agent
 

Similaire à Support de cours Spring M.youssfi

Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Eric Bourdet
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Eric Bourdet
 
Marzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcMarzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcabderrahim marzouk
 
Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2RomainKuzniak
 
Présentation PFE Module Article GPAO
Présentation PFE Module Article GPAOPrésentation PFE Module Article GPAO
Présentation PFE Module Article GPAOahmedmiha
 
Cas Pratique Du Mode DéConnecté De Silverlight
Cas Pratique Du Mode DéConnecté De SilverlightCas Pratique Du Mode DéConnecté De Silverlight
Cas Pratique Du Mode DéConnecté De SilverlightArnaud Auroux
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp FrGregory Renard
 
Créer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShopCréer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShopPrestaShop
 
Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...
Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...
Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...Siham Rim Boudaoud
 
Cv ines ouaz
Cv ines ouazCv ines ouaz
Cv ines ouazInes Ouaz
 
Softfluent speig mdday2010
Softfluent speig mdday2010Softfluent speig mdday2010
Softfluent speig mdday2010MD DAY
 

Similaire à Support de cours Spring M.youssfi (20)

Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
 
CV_Bilel CHAOUADI
CV_Bilel CHAOUADICV_Bilel CHAOUADI
CV_Bilel CHAOUADI
 
Java Server Faces 2
Java Server Faces 2Java Server Faces 2
Java Server Faces 2
 
Marzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcMarzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvc
 
Design applicatif avec symfony2
Design applicatif avec symfony2Design applicatif avec symfony2
Design applicatif avec symfony2
 
CV REBAI Hamida
CV REBAI HamidaCV REBAI Hamida
CV REBAI Hamida
 
Présentation PFE Module Article GPAO
Présentation PFE Module Article GPAOPrésentation PFE Module Article GPAO
Présentation PFE Module Article GPAO
 
Formation gwt
Formation gwtFormation gwt
Formation gwt
 
Architecture .net
Architecture  .netArchitecture  .net
Architecture .net
 
Cas Pratique Du Mode DéConnecté De Silverlight
Cas Pratique Du Mode DéConnecté De SilverlightCas Pratique Du Mode DéConnecté De Silverlight
Cas Pratique Du Mode DéConnecté De Silverlight
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp Fr
 
Créer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShopCréer et intégrer son thème PrestaShop
Créer et intégrer son thème PrestaShop
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...
Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...
Mémoire de Licence, site web dynamique sous JEE, application aux entreprises ...
 
Cours spring
Cours springCours spring
Cours spring
 
Mysql
MysqlMysql
Mysql
 
Cv ines ouaz
Cv ines ouazCv ines ouaz
Cv ines ouaz
 
Softfluent speig mdday2010
Softfluent speig mdday2010Softfluent speig mdday2010
Softfluent speig mdday2010
 
2 ModéLe Mvc
2 ModéLe Mvc2 ModéLe Mvc
2 ModéLe Mvc
 

Plus de ENSET, Université Hassan II Casablanca

Plus de ENSET, Université Hassan II Casablanca (6)

Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
 
Support distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcastSupport distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcast
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 

Support de cours Spring M.youssfi

  • 1. SSpprriinngg FFrraammeewwoorrkk :: - AArrcchhiitteeccttuurree JJEEEE - SSpprriinngg IIOOCC - SSpprriinngg MMVVCC - SSpprriinngg IInntteeggrraattiioonn :: RRMMII,, JJaaxxWWSS,, JJaaxxRRSS,, JJMMSS,, JJMMXX,, …… - SSpprriinngg SSeeccuurriittyy Mohamed Youssfi Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA) ENSET, Université Hassan II Casablanca, Maroc Email : med@youssfi.net Supports de cours : http://fr.slideshare.net/mohamedyoussfi9 Chaîne vidéo : http://youtube.com/mohamedYoussfi Recherche : http://www.researchgate.net/profile/Youssfi_Mohamed/publications med@youssfi.net
  • 2. AArrcchhiitteeccttuurree JJ22EEEE med@youssfi.net | ENSET Université Hassan II Mohammedia
  • 3. Exigences d’un pprroojjeett iinnffoorrmmaattiiqquuee Exigences fonctionnelles: ◦ Une application est créée pour répondre , tout d’abord, aux besoins fonctionnels des entreprises. Exigences Techniques : ◦ Les performances: Temps de réponse Haute disponibilité et tolérance aux pannes Eviter le problème de montée en charge med@youssfi.net ◦ La maintenance: Une application doit évoluer dans le temps. Doit être fermée à la modification et ouverte à l’extension ◦ Sécurité ◦ Portabilité ◦ Distribution ◦ Capacité de communiquer avec d’autres applications distantes. ◦ Capacité de fournir le service à différents type de clients (Desk TOP, Mobile, SMS, http…) ◦ ….. ◦ Coût du logiciel 3
  • 4. CCoonnssttaatt Il est très difficile de développer un système logiciel qui respecte ces exigences sans utiliser l’expérience des autres : ◦ Serveur d’application JEE: JBOSS, Web Sphere, GlassFish, Tomcat, … ◦ Framework pour l’Inversion de contrôle: Spring (Conteneur léger) EEJJBB ((CCoonntteenneeuurr lloouurrdd)) ◦ Frameworks : Mapping objet relationnel (ORM ) : JPA, Hibernate, Toplink, … Applications Web : Struts, JSF, SpringMVC …. ◦ Middlewares : RMI, CORBA : Applications distribuées JAXWS pour Web services SOAP JAXRS pour les Web services RESTful JMS : Communication asynchrone entre les application … med@youssfi.net
  • 5. AArrcchhiitteeccttuurreess DDiissttrriibbuuééss SGBD Serveur d’application J2EE Couche DAO Mapping Objet Relationnel (JPA, Hibernate) Couche métier Couche Service RMI, JMS CORBA,SOAP Objet Java Application .Net SOAP (HTTP+XML) ou CORBA Smart Phone REST (HTTP+JSON) Couche web MiddleWares : - RMI - CORBA - EJB Session - SOAP (Web Sevices) - JMS -Java Mail -SMSLib med@youssfi.net HTTP Client HTTP -HTML, CSS, JavaScript -XML, AJAX, Jquery -SVG ou Flash Aplication PHP SOAP (HTTP+XML) Client JMS JMS Client SMS SMS 5 -Servlet - JSP - FrameWorks -Struts -Spring MVC - JSF
  • 6. AArrcchhiitteeccttuurree JJ22EEEE Serveur d’application J2EE Web Container (Couche Web) Spring ou EJB Container (Couche Métier) Servlet, JSP Service Client Java RMI, JMS Client http Client SOAP Java, .Net, PHP, Cobol HTTP HTML SOAP XML Services de l’infrastructure JaxWS, Jax RS Jersey, CXF, AXIS JTA JNDI Spring MVC, JSF Composants JPA Hibernate SGBD DDaattaa BBaassee SOAP Service RESTful JDBC Client HTTP Mobile, JQuery, Flash HTTP JSON, XML, .. …. AXIS, CXF Jersey, CXF Métier (Traitements) Entity Entity
  • 8. SSpprriinngg FFrraammeewwoorrkk AArrcchhiitteeccttuurree Spring est modulaire , permettant de choisir les modules appropriés à votre application, sans être obligé d’autiliser le reste. Spring Framework fournit plus de 20 modules qui peuvent être utilisé dans els applications. med@youssfi.net
  • 9. CCoorree CCoonnttaaiinneerr The Core Container consists of the Core, Beans, Context, and Expression Language modules whose detail is as follows: ◦ The Core module provides the fundamental parts of the framework, including the IoC and Dependency Injection features. ◦ TThhee BBeeaann mmoodduullee pprroovviiddeess BBeeaannFFaaccttoorryy wwhhiicchh iiss aa sophisticated implementation of the factory pattern. ◦ The Context module builds on the solid base provided by the Core and Beans modules and it is a medium to access any objects defined and configured. The ApplicationContext interface is the focal point of the Context module. ◦ The Expression Language module provides a powerful expression language for querying and manipulating an object graph at runtime. med@youssfi.net
  • 10. DDaattaa AAcccceessss//IInntteeggrraattiioonn The Data Access/Integration layer consists of the JDBC, ORM, OXM, JMS and Transaction modules whose detail is as follows: ◦ The JDBC module provides a JDBC-abstraction layer that removes the need to do tedious JDBC related coding. ◦ The ORM module provides integration layers for popular object-relational mapping APIs, including JPA, JDO, Hibernate, and iBatis. ◦ TThhee OOXXMM mmoodduullee pprroovviiddeess aann aabbssttrraaccttiioonn llaayyeerr tthhaatt ssuuppppoorrttss Object/XML mapping implementations for JAXB, Castor, XMLBeans, JiBX and XStream. ◦ The Java Messaging Service JMS module contains features for producing and consuming messages. ◦ The Transaction module supports programmatic and declarative transaction management for classes that implement special interfaces and for all your POJOs. med@youssfi.net
  • 11. WWeebb The Web layer consists of the Web, Web-Servlet, Web-Struts, and Web-Portlet modules whose detail is as follows: ◦ The Web module provides basic web-oriented integration features such as multipart file-upload functionality and the initialization of the IoC container using servlet listeners aanndd aa wweebb--oorriieenntteedd aapppplliiccaattiioonn ccoonntteexxtt.. ◦ The Web-Servlet module contains Spring's model-view-controller (MVC) implementation for web applications ◦ The Web-Struts module contains the support classes for integrating a classic Struts web tier within a Spring application. ◦ The Web-Portlet module provides the MVC implementation to be used in a portlet environment and mirrors the functionality of Web-Servlet module. med@youssfi.net
  • 12. AAuuttrreess There are few other important modules like AOP, Aspects, Instrumentation, Web and Test modules whose detail is as follows: ◦ The AOP module provides aspect-oriented programming implementation allowing you to define method-interceptors and pointcuts to cleanly decouple code that iimmpplleemmeennttss ffuunnccttiioonnaalliittyy tthhaatt sshhoouulldd bbee sseeppaarraatteedd.. ◦ The Aspects module provides integration with AspectJ which is again a powerful and mature aspect oriented programming (AOP) framework. ◦ The Instrumentation module provides class instrumentation support and class loader implementations to be used in certain application servers. ◦ The Test module supports the testing of Spring components with JUnit or TestNG frameworks. med@youssfi.net
  • 13. IInnvveerrssiioonn ddee ccoonnttrrôôllee oouu IInnjjeeccttiioonn ddee ddééppeennddaanncceess med@youssfi.net
  • 14. Rappels de quelque pprriinncciippeess ddee ccoonncceeppttiioonn Une application qui n’évolue pas meurt. Une application doit être fermée à la modification et ouverte à l’extension. Une application doit s’adapter aux changements Efforcez-vous à coupler faiblement vos classes. Programmer une interface et non une implémentation med@youssfi.net Etc..
  • 15. CCoouuppllaaggee FFoorrtt eett CCoouuppllaaggee ffaaiibbllee med@youssfi.net
  • 16. CCoouuppllaaggee ffoorrtt Quand une classe A est lié à une classe B, on dit que la classe A est fortement couplée à la classe B. La classe A ne peut fonctionner qu’en présence de la classe B. Si une nouvelle version de la classe B (soit B2), est crée, on est obligé de modifier dans la classe A. Modifier une classe implique: ◦ Il faut disposer du code source. ◦ Il faut recompiler, déployer et distribuer la nouvelle application aux clients. ◦ Ce qui engendre un cauchemar au niveau de la maintenance de l’application med@youssfi.net A b: B calcul() : double B getValue() : double 1
  • 17. Exemple ddee ccoouuppllaaggee ffoorrtt MetierImpl dao: DaoImpl calcul() : double DaoImpl getValue() : double 1 package dao; public class DaoImpl { public double getValue(){ return(5); Presentation metier:MetierImpl main(String[] a):void 1 package metier; import dao.DaoImpl; public class MetierImpl { med@youssfi.net } } private DaoImpl dao; public MetierImpl() { dao=new DaoImpl(); } public double calcul(){ double nb=dao.getValue(); return 2*nb; } } package pres; import metier.MetierImpl; public class Presentation { private static MetierImpl metier; public static void main(String[] args) { metier=new MetierImpl(); System.out.println(metier.calcul()); } }
  • 18. Problèmes dduu ccoouuppllaaggee ffoorrtt Dans l’exemple précédent, les classes MetierImpl et DaoImpl sont liées par un couplage fort. De même pour les classe Presentation et MetierImpl Ce couplage fort n’a pas empêché de résoudre le problème au niveau fonctionnel. Mais cette conception nous ne a pas permis de créer une application fermée à la modification et ouverte à l’extension. En effet, la création d’une nouvelle version de la méthode getValue() de la classe DaoImpl, va nous obliger d’éditer le code source de l’application aussi bien au niveau de DaoImpl et aussi MetierImpl. De ce fait nous avons violé le principe « une application doit être fermée à la modification et ouverte à l’exetension» Nous allons voir que nous pourrons faire mieux en utilisant le med@youssfi.net couplage faible.
  • 19. CCoouuppllaaggee FFaaiibbllee.. Pour utiliser le couplage faible, nous devons utiliser les interfaces. Considérons une classe A qui implémente une interface IA, et une classe B qui implémente une interface IB. Si la classe A est liée à l’interface IB par une association, on dit que le classe A et la classe B sont liées par un couplage faible. Cela signifie que la classe B peut fonctionner avec n’importe quelle classe qui implémente l’interface IA. En effet la classe B ne connait que l’interface IA. De ce fait n’importe quelle classe implémentant cette interface peut être associée à la classe B, sans qu’il soit nécéssaire de modifier quoi que se soit dans la classe B. Avec le couplage faible, nous pourrons créer des application fermée à la 1 IB getValue() : double med@youssfi.net modification et ouvertes à l’extension. AImpl b: IB calcul() : double BImpl getValue() : double IA calcul() : double
  • 20. Exemple ddee ccoouuppaaggee ffaaiibbllee MetierImpl dao: IDao calcul() : double 1 IDao getValue() : double DaoImpl getValue() : double IMetier calcul() : double Presentation metier:IMetier main(String[] a):void 1 package metier; public interface IMetier { public double calcul(); package dao; public interface IDao { public double getValue(); } package dao; public class DaoImpl implements IDao { public double getValue() { return 5; } } med@youssfi.net package metier; import dao.IDao; public class MetierImpl implements IMetier { private IDao dao; public double calcul() { double nb=dao.getValue(); return 2*nb; } // Getters et Setters } }
  • 21. Injection ddeess ddééppeennddaanncceess Injection par instanciation statique : import metier.MetierImpl; import dao.DaoImpl; public class Presentation { public static void main(String[] args) { DaoImpl dao=new DaoImpl(); MetierImpl metier=new MetierImpl(); metier.setDao(dao); System.out.println(metier.calcul()); } } med@youssfi.net
  • 22. Injection ddeess ddééppeennddaanncceess Injection par instanciation dynamique par réflexion : Fichier texte de configuration : config.txt ext.DaoImp metier.MetierImpl import java.io.*;import java.lang.reflect.*; import java.util.Scanner; import metier.IMetier; import dao.IDao; public class Presentation { public static void main(String[] args) { try { Scanner scanner=new Scanner(new File(config.text)); String daoClassname=scanner.next(); String metierClassName=scanner.next(); Class cdao=Class.forName(daoClassname); IDao dao= (IDao) cdao.newInstance(); Class cmetier=Class.forName(metierClassName); IMetier metier=(IMetier) cmetier.newInstance(); Method meth=cmetier.getMethod(setDao,new Class[]{IDao.class}); meth.invoke(metier, new Object[]{dao}); System.out.println(metier.calcul()); } catch (Exception e) { e.printStackTrace(); } } } med@youssfi.net
  • 23. Injection des ddééppeennddaanncceess aavveecc SSpprriinngg. L’injection des dépendance, ou l’inversion de contrôle est un concept qui intervient généralement au début de l’exécution de l’application. Spring IOC commence par lire un fichier XML qui déclare quelles sont différentes classes à instancier et d’assurer les dépendances entre les différentes instances. Quand on a besoin d’intégrer une nouvelle implémentation à une application, il suffirait de la déclarer dans le fichier xml de beans spring. med@youssfi.net
  • 24. application Injection des dépendances dans une jjaavvaa ssttaannddaarrdd ?xml version=1.0 encoding=UTF-8? !DOCTYPE beans PUBLIC -//SPRING//DTD BEAN 2.0//EN http://www.springframework.org/dtd/spring-beans- 2.0.dtd beans bean id=d class=dao.DaomImpl2/bean bean id=metier class=metier.MetierImpl property name=dao ref=d/property /bean med@youssfi.net /beans metier:MetierImpl dao: calcul() : double d:DaoImpl getValue() : double
  • 25. application Injection des dépendances dans une jjaavvaa ssttaannddaarrdd package pres; import metier.IMetier; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Presentation { public static void main(String[] args) { ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(new String[]{spring-ioc.xml}); IMetier metier=(IMetier) context.getBean(metier); System.out.println(metier.calcul()); med@youssfi.net } }
  • 27. MMaavveenn ddeeppeennddeenncciieess dependencies dependency groupIdorg.springframework/groupId artifactIdspring-core/artifactId version3.2.2.RELEASE/version //ddeeppeennddeennccyy dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version3.2.2.RELEASE/version /dependency /dependencies med@youssfi.net
  • 29. Injection des dépendances ddaannss uunnee aapppplliiccaattiioonn wweebb Dans une application web, SpringIOC est appelé au démarrage du serveur en déclarant le listener ContextLoaderListener dans le fichier web.xml context-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring-beans.xml/param-value /context-param med@youssfi.net listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener Dans cette déclaration, CotextLoaderListener est appelé par Tomcat au moment du démarrage de l’application. Ce listener cherchera le fichier de beans spring « spring-beans.xml » stocké dans le dossier WEB-INF. ce qui permet de faire l’injection des dépendances entre MetierImpl et DaoImpl
  • 30. AArrcchhiitteeccttuurreess DDiissttrriibbuuééss SGBD Serveur d’application J2EE Couche DAO Mapping Objet Relationnel (JPA, Hibernate) Couche métier Couche Service RMI, JMS CORBA,SOAP Objet Java Application .Net SOAP (HTTP+XML) ou CORBA Smart Phone REST (HTTP+JSON) Couche web MiddleWares : - RMI - CORBA - EJB Session - SOAP (Web Sevices) - JMS -Java Mail -SMSLib med@youssfi.net HTTP Client HTTP -HTML, CSS, JavaScript -XML, AJAX, Jquery -SVG ou Flash Aplication PHP SOAP (HTTP+XML) Client JMS JMS Client SMS SMS 30 -Servlet - JSP - FrameWorks -Struts -Spring MVC - JSF
  • 31. SSpprriinngg Spring est un framework open source JEE pour les applications n-tiers, dont il facilite le développement et les tests. Il est considéré comme un conteneur dit « léger », c’est-à-dire une infrastructure similaire à un serveur d’application J2EE. Il prend donc en charge la création d’objets et la mise en relation d’objets par l’intermédiaire d’un fichier de configuration qui décrit les objets à fabriquer et les relations de dépendances entre ces objets. IIll ppeerrmmeett ddee ssééppaarreerr llee ccooddee mmééttiieerr dduu ccooddee tteecchhnniiqquuee Spring s’appuie principalement sur l’intégration de trois concepts clés : ◦ l’inversion de contrôle ou injection de dépendance (IoC). ◦ la programmation orientée aspect (AOP). ◦ une couche d’abstraction. Ce framework, grâce à sa couche d’abstraction, ne concurrence pas d’autres frameworks dans une couche spécifique d’un modèle architectural MVC mais s’avère un framework multi-couches pouvant s’insérer au niveau de toutes les couches. med@youssfi.net
  • 34. SSpprriinngg MMVVCC Architecture de Spring MVC med@youssfi.net
  • 38. Architecture d’une application rreessppeeccttaanntt llee mmooddèèllee MMVVCC Au sein de l'architecture 3tier, l'architecture MVC peut être représentée comme suit : Métier DAO SGBD med@youssfi.net Données User 1 2 Contrôleur Vue Modèle 3 4 6 5
  • 39. SSpprriinngg MMVVCC 1- le client fait une demande au contrôleur. Celui-ci voit passer toutes les demandes des clients. C'est la porte d'entrée de l'application. C'est le C de MVC. Ici le contrôleur est assuré par une servlet générique : org.springframework.web.servlet.DispatcherServlet 2- le contrôleur principal [DispatcherServlet] fait exécuter l'action demandée par l'utilisateur par une classe implémentant l'interface : org.springframework.web.servlet.mvc.Controller ◦ A cause du nom de l'interface, nous appellerons une telle classe un contrôleur secondaire pour le distinguer du contrôleur principal [DispatcherServlet] ou simplement contrôleur lorsqu'il n'y a pas d'ambiguïté. 3- le contrôleur [Controller] traite une demande particulière de l'utilisateur. Pour ce faire, il peut avoir besoin de l'aide de la couche métier. Une fois la demande du client traitée, celle-ci peut appeler diverses réponses. Un exemple classique est : ◦ une page d'erreurs si la demande n'a pu être traitée correctement ◦ une page de confirmation sinon med@youssfi.net
  • 40. SSpprriinngg MMVVCC 4- Le contrôleur choisit la réponse (= vue) à envoyer au client. Choisir la réponse à envoyer au client nécessite plusieurs étapes : ◦ choisir l'objet qui va générer la réponse. C'est ce qu'on appelle la vue V, le V de MVC. Ce choix dépend en général du résultat de l'exécution de l'action demandée par l'utilisateur. ◦ lui fournir les données dont il a besoin pour générer cette réponse. En effet, celle-ci contient le plus souvent des informations calculées par la couche métier ou le contrôleur lui-même. Ces informations forment ce qu'on appelle le modèle M de la vue, le M de MVC. Spring MVC fournit ce modèle sous la forme d'un dictionnaire de type java.util.Map. ◦ Cette étape consiste donc en le choix d'une vue V et la construction du modèle M nécessaire à celle-ci. 5- Le contrôleur DispatcherServlet demande à la vue choisie de s'afficher. Il s'agit d'une classe implémentant l'interface org.springframework.web.servlet.View ◦ Spring MVC propose différentes implémentations de cette interface pour générer med@youssfi.net des flux HTML, Excel, PDF, ... 6. le générateur de vue View utilise le modèle Map préparé par le contrôleur Controller pour initialiser les parties dynamiques de la réponse qu'il doit envoyer au client. 7. la réponse est envoyée au client. La forme exacte de celle-ci dépend du générateur de vue. Ce peut être un flux HTML, XML, PDF, Excel, ...
  • 41. Installation dduu pplluuggiinn :: sspprriinngg ttoooollss ppoouurr eecclliippssee med@youssfi.net
  • 42. Installation dduu pplluuggiinn :: sspprriinngg ttoooollss ppoouurr eecclliippssee med@youssfi.net
  • 43. CCrrééaattiioonn dd’’uunn pprroojjeett SSpprriinngg med@youssfi.net
  • 44. CCrrééaattiioonn dd’’uunn pprroojjeett SSpprriinngg med@youssfi.net
  • 45. SSttrruuccttuurree dduu pprroojjeett Navigator Explorer med@youssfi.net
  • 46. wweebb..xxmmll ?xml version=1.0 encoding=UTF-8? web-app version=2.5 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd !-- The definition of the Root Spring Container shared by all Servlets and Filters -- context-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring/root-context.xml/param-value /context-param !-- Creates the Spring Container shared by all Servlets and Filters -- listener listener-class org.springframework.web.context.ContextLoaderListener/listener-class /listener med@youssfi.net
  • 47. wweebb..xxmmll !-- Processes application requests -- servlet servlet-nameappServlet/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring/appServlet/servlet-context.xml/param-value //iinniitt--ppaarraamm load-on-startup1/load-on-startup /servlet servlet-mapping servlet-nameappServlet/servlet-name url-pattern//url-pattern /servlet-mapping /web-app med@youssfi.net
  • 48. //WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll • Ce fichier est lu par ContextLoaderListener, au démarrage du serveur . • C’est un fichier dans lequel contexte de l’application sera construit • ContextLoaderListener représente Spring IOC • c’est donc un fichier pour l’injection des dépendances • Pour le moment, il est vide ?xml version=1.0 encoding=UTF-8? beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://www.springframework.org/sc hema/beans http://www.springframework.org/schema/beans/spring-beans. xsd !-- Root Context: defines shared resources visible to all other web components -- /beans med@youssfi.net
  • 49. //WWEEBB-IINNFF//sspprriinngg/aappppSSeerrvvlleett/sseerrvvlleett-ccoonntteexxtt..xxmmll • Ce fichier est lu par DispatcherServlet qui représente le controleur web de l’application ?xml version=1.0 encoding=UTF-8? beans:beans xmlns=http://www.springframework.org/schema/mvc xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:beans=http://www.springframework.org/schema/beans xmlns:context=http://www.springframework.org/schema/context xsi:schemaLocation=http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd !-- Enables the Spring MVC @Controller programming model -- annotation-driven / !-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -- resources mapping=/resources/** location=/resources/ / !-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -- beans:bean class=org.springframework.web.servlet.view.InternalResourceViewResolver beans:property name=prefix value=/WEB-INF/views/ / beans:property name=suffix value=.jsp / /beans:bean context:component-scan base-package=ma.enset.myCataogue / /beans:beans med@youssfi.net
  • 50. Un eexxeemmppllee ddee ccoonnttrrôôlleeuurr SSpprriinngg MMVVCC package ma.enset.myCataogue; import java.text.*;import java.util.*;import org.slf4j.*;import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** Handles requests for the application home page. */ @Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); /** Simply selects the home view to render by returning its name. */ @@RReeqquueessttMMaappppiinngg((vvaalluuee == //, mmeetthhoodd == RReeqquueessttMMeetthhoodd..GGEETT)) public String home(Locale locale, Model model) { logger.info(Welcome home! The client locale is {}., locale); Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); String formattedDate = dateFormat.format(date); model.addAttribute(serverTime, formattedDate ); return home; } } med@youssfi.net
  • 51. UUnn eexxeemmppllee ddee vvuuee JJSSPP %@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c % %@ page session=false % html head titleHome/title /head body hh11 HHeelllloo wwoorrlldd!! //hh11 P The time on the server is ${serverTime}. /P /body /html med@youssfi.net
  • 52. FFuunnccttiioonnnneemmeenntt Tomcat Lire web.xml :ContextLoaderListner Instancier Lire root-context.xml :DispatcherServlet Instancier Lire root-context.xml Client :HomeController Req HTTP med@youssfi.net GET/ doGet(request,response) instancier Model And View :home.jsp home() instancier html rendu Rep HTTP
  • 53. AApppplliiccaattiioonn 11 On souhaite créer une application qui permet de gérer des produits. Chaque produit est défini par sa référence (de type String), sa désignation, son prix et sa quantité. L’application doit permettre les opérations suivantes : ◦ Ajouter un nouveau produit ◦ Consulter tous les produits ◦ Consulter les produits dont le nom contient un mot clé. ◦ Consulter un produit ◦ Supprimer un produit ◦ MMeettttrree àà jjoouurr uunn pprroodduuiitt.. Cette application se compose de trois couches DAO, Métier et Présentation. Elle doit être fermée à la modification et ouverte à l’extension. L’injection des dépendances sera effectuée en utilisant Spring IOC. Nous allons définir deux implémentations de la couche DAO. ◦ Une implémentation qui gère les produits qui sont stockés dans une liste de type HashMap. ◦ Dans la deuxième implémentation, nous allons supposer que les produits sont stockés dans une base de données de type MySQL. med@youssfi.net
  • 55. Validation des données ccoottéé sseerrvveeuurr med@youssfi.net
  • 57. AApprrèèss AAjjoouutt dd’’uunn pprroodduuiitt med@youssfi.net
  • 59. MMiissee àà jjoouurr dd’’uunn pprroodduuiitt med@youssfi.net
  • 63. Architecture tteecchhnniiqquuee Web Container Spring IOC Container ContextLoaderListner Couche Métier ICatMetier Couche DAO ICatDAO dependencies Spring Hibernate-validator web.xml produits.jsp Produit aapplicationContext.xml servlet-context.xml CatMetierImpl CatDAOImpl CatalController DispatcherSevlet HTTP HTML Client HTTP
  • 64. MMaavveenn ddeeppeennddeenncciieess :: SSpprriinngg pom.xml properties java-version1.6/java-version org.springframework-version 3.2.3.RELEASE /org.springframework-version org.aspectj-version1.6.10/org.aspectj-version org.slf4j-version1.6.6/org.slf4j-version /properties med@youssfi.net
  • 65. MMaavveenn DDeeppeennddeenncciieess !-- Spring -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${org.springframework-version}/version exclusions !-- Exclude Commons Logging in favor of SLF4j -- exclusion ggrroouuppIIddccoommmmoonnss--llooggggiinngg//ggrroouuppIIdd artifactIdcommons-logging/artifactId /exclusion /exclusions /dependency dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${org.springframework-version}/version /dependency med@youssfi.net
  • 66. MMaavveenn DDeeppeennddeenncciieess !-- AspectJ -- dependency groupIdorg.aspectj/groupId artifactIdaspectjrt/artifactId version${org.aspectj-version}/version /dependency !-- Logging -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-api/artifactId vveerrssiioonn$${{oorrgg..ssllff44jj--vveerrssiioonn}}//vveerrssiioonn /dependency dependency groupIdorg.slf4j/groupId artifactIdjcl-over-slf4j/artifactId version${org.slf4j-version}/version scoperuntime/scope /dependency dependency groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId version${org.slf4j-version}/version scoperuntime/scope /dependency med@youssfi.net
  • 67. MMaavveenn DDeeppeennddeenncciieess dependency groupIdlog4j/groupId artifactIdlog4j/artifactId version1.2.15/version exclusions exclusion groupIdjavax.mail/groupId artifactIdmail/artifactId /exclusion exclusion ggrroouuppIIddjjaavvaaxx..jjmmss//ggrroouuppIIdd artifactIdjms/artifactId /exclusion exclusion groupIdcom.sun.jdmk/groupId artifactIdjmxtools/artifactId /exclusion exclusion groupIdcom.sun.jmx/groupId artifactIdjmxri/artifactId /exclusion /exclusions scoperuntime/scope /dependency med@youssfi.net
  • 68. MMaavveenn DDeeppeennddeenncciieess !-- @Inject -- dependency groupIdjavax.inject/groupId artifactIdjavax.inject/artifactId version1/version /dependency !-- Servlet -- dependency groupIdjavax.servlet/groupId artifactIdservlet-api/artifactId vveerrssiioonn22..55//vveerrssiioonn scopeprovided/scope /dependency dependency groupIdjavax.servlet.jsp/groupId artifactIdjsp-api/artifactId version2.1/version scopeprovided/scope /dependency dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency med@youssfi.net
  • 69. MMaavveenn DDeeppeennddeenncciieess !-- Test -- dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.7/version scopetest/scope /dependency !-- Hibernate Validator -- dependency groupIdorg.hibernate/groupId artifactIdhibernate-validator/artifactId version5.0.0.Final/version /dependency med@youssfi.net
  • 71. EEnnttiittéé PPrroodduuiitt package org.miage.sid.dao; import java.io.Serializable; import javax.validation.constraints.DecimalMin; import javax.validation.constraints.Size; import org.hibernate.validator.constraints.NotEmpty; public class Produit implements Serializable { @NotEmpty @@SSiizzee((mmiinn==44,mmaaxx==1122)) private String reference; @NotEmpty private String designation; @DecimalMin(value=100) private double prix; private int quantite; // Constructeurs // Getters et Setters } med@youssfi.net
  • 72. IInntteerrffaaccee IICCaattaalloogguueeDDAAOO package org.miage.sid.dao; import java.util.List; public interface ICatalogueDAO { public void addProduit(Produit p); public ListProduit getAllProduits(); ppuubblliicc LLiissttPPrroodduuiitt ggeettPPrroodduuiittss((SSttrriinngg mmcc));; public Produit getProduit(String reference); public void deleteProduit(String refernce); public void updateProduit(Produit p); } med@youssfi.net
  • 73. IImmpplléémmeennttaattiioonn CCaattaalloogguueeDDAAOOIImmppll package org.miage.sid.dao; import java.util.*; import org.apache.log4j.Logger; public class CatalogueDaoImpl implements ICatalogueDAO { private MapString, Produit produits=new HashMapString, Produit(); Logger logger=Logger.getLogger(CatalogueDaoImpl.class); @Override public void addProduit(Produit p) { pprroodduuiittss..ppuutt((pp..ggeettRReeffeerreennccee(()), pp));; } @Override public ListProduit getAllProduits() { CollectionProduit prods=produits.values(); return new ArrayListProduit(prods); } med@youssfi.net
  • 74. IImmpplléémmeennttaattiioonn CCaattaalloogguueeDDAAOOIImmppll @Override public ListProduit getProduits(String mc) { ListProduit prods=new ArrayListProduit(); for(Produit p:produits.values()) if(p.getDesignation().indexOf(mc)=0) prods.add(p); return prods; } @@OOvveerrrriiddee public Produit getProduit(String reference) { return produits.get(reference); } @Override public void deleteProduit(String refernce) { produits.remove(refernce); } med@youssfi.net
  • 75. IImmpplléémmeennttaattiioonn CCaattaalloogguueeDDAAOOIImmppll @Override public void updateProduit(Produit p) { produits.put(p.getReference(),p); } public void init(){ logger.info(Initialisation du catalogue); this.addProduit(new Produit(HP675,Ordinateur HP, 8000, 5)); tthhiiss..aaddddPPrroodduuiitt((nneeww PPrroodduuiitt((AAEEPP6655,IImmpprriioommaannttee AAEE,776600, 8800))));; this.addProduit(new Produit(AT980,Smart Phone GT, 4500, 8)); } } med@youssfi.net
  • 77. IInntteerrffaaccee IIccaattaalloogguueeMMeettiieerr package org.miage.sid.metier; import java.util.List; import org.miage.sid.dao.Produit; public interface ICatalogueMetier { public void addProduit(Produit p); public ListProduit getAllProduits(); public ListProduit getProduits(String mc); public Produit getProduit(String reference); public void deleteProduit(String refernce); public void updateProduit(Produit p); } med@youssfi.net
  • 78. IImmpplléémmeennttaattiioonn CCaattaalloogguueeMMeettiieerrIImmppll package org.miage.sid.metier; import java.util.List; import org.miage.sid.dao.ICatalogueDAO; import org.miage.sid.dao.Produit; public class CatalogueMetierImpl implements ICatalogueMetier { private ICatalogueDAO dao; /*Setter setDao pour l'injection*/ public void setDao(ICatalogueDAO dao) { tthhiiss..ddaaoo == ddaaoo;; } @Override public void addProduit(Produit p) { dao.addProduit(p); } @Override public ListProduit getAllProduits() { return dao.getAllProduits(); }
  • 79. IImmpplléémmeennttaattiioonn CCaattaalloogguueeMMeettiieerrIImmppll @Override public ListProduit getProduits(String mc) { return dao.getProduits(mc); } @Override public Produit getProduit(String reference) { return dao.getProduit(reference); } @Override public void deleteProduit(String refernce) { dao.deleteProduit(refernce); } @Override public void updateProduit(Produit p) { dao.updateProduit(p); } }
  • 81. aapppplliiccaattiioonnCCoonntteexxtt..xxmmll ?xml version=1.0 encoding=UTF-8? 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.xsd bean id=dao class=org.miage.sid.dao.CatalogueDaoImpl init-method=init/bean bean id=metier class=org.miage.sid.metier.CatalogueMetierImpl pprrooppeerrttyy nnaammee==ddaaoo rreeff==ddaaoo//pprrooppeerrttyy /bean /beans med@youssfi.net
  • 83. wweebb..xxmmll ?xml version=1.0 encoding=UTF-8? web-app version=2.5 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd !-- The definition of the Root Spring Container shared by all Servlets and Filters -- context-param param-namecontextConfigLocation/param-name param-valueclasspath*:applicationContext.xml/param-value /context-param !-- Creates the Spring Container shared by all Servlets and Filters -- listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener med@youssfi.net
  • 84. wweebb..xxmmll !-- Processes application requests -- servlet servlet-nameappServlet/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring/appServlet/servlet-context.xml/param-value /init-param llooaadd--oonn--ssttaarrttuupp11//llooaadd--oonn--ssttaarrttuupp /servlet servlet-mapping servlet-nameappServlet/servlet-name url-pattern//url-pattern /servlet-mapping /web-app med@youssfi.net
  • 85. //WWEEBB-IINNFF//sspprriinngg/aappppSSeerrvvlleett//sseerrvvlleett-ccoonntteexxtt..xxmmll ?xml version=1.0 encoding=UTF-8? beans:beans xmlns=http://www.springframework.org/schema/mvc xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:beans=http://www.springframework.org/schema/beans xmlns:context=http://www.springframework.org/schema/context xsi:schemaLocation=http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans hhttttpp::////wwwwww..sspprriinnggffrraammeewwoorrkk..oorrgg//sscchheemmaa//bbeeaannss//sspprriinngg--bbeeaannss..xxssdd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd med@youssfi.net
  • 86. //WWEEBB-IINNFF//sspprriinngg/aappppSSeerrvvlleett//sseerrvvlleett-ccoonntteexxtt..xxmmll !-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -- !-- Enables the Spring MVC @Controller programming model -- annotation-driven / !-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -- resources mapping=/resources/** location=/resources/ / !-- Resolves views selected for rendering by @Controllers to .jsp rreessoouurrcceess iinn tthhee //WWEEBB--IINNFF//vviieewwss ddiirreeccttoorryy ---- beans:bean class=org.springframework.web.servlet.view.InternalResourceViewResolver beans:property name=prefix value=/WEB-INF/views/ / beans:property name=suffix value=.jsp / /beans:bean context:component-scan base-package=org.miage.sid / /beans:beans med@youssfi.net
  • 87. CCaattaalloogguueeCCoonnttrroolllleerr package org.miage.sid.web; import javax.validation.Valid; import org.miage.sid.dao.Produit; import org.miage.sid.metier.ICatalogueMetier; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; iimmppoorrtt oorrgg..sspprriinnggffrraammeewwoorrkk..vvaalliiddaattiioonn..BBiinnddiinnggRReessuulltt;; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class CatalogueController { @Autowired private ICatalogueMetier metier; med@youssfi.net
  • 88. CCaattaalloogguueeCCoonnttrroolllleerr @RequestMapping(/index) public String index(Model model){ model.addAttribute(produit,new Produit()); model.addAttribute(produits, metier.getAllProduits()); return produits; } @RequestMapping(/saveProduit) public String save(@Valid Produit p,BindingResult bindingResult,Model mmooddeell)){{ if(bindingResult.hasErrors()){ model.addAttribute(produits, metier.getAllProduits()); return produits; } metier.addProduit(p); model.addAttribute(produit,new Produit()); model.addAttribute(produits, metier.getAllProduits()); return produits; } med@youssfi.net
  • 89. CCaattaalloogguueeCCoonnttrroolllleerr @RequestMapping(/deleteProduit) public String delete(@RequestParam String ref,Model model){ metier.deleteProduit(ref); model.addAttribute(produit,new Produit()); model.addAttribute(produits, metier.getAllProduits()); return produits; } @@RReeqquueessttMMaappppiinngg((//eeddiittPPrroodduuiitt)) public String edit(@RequestParam String ref,Model model){ model.addAttribute(produit,metier.getProduit(ref)); model.addAttribute(produits, metier.getAllProduits()); return produits; } } med@youssfi.net
  • 90. LLaa vvuuee pprroodduuiittss..jjsspp %@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c % %@ taglib uri=http://www.springframework.org/tags/form prefix=f % !DOCTYPE html html head meta charset=UTF-8 titleCatalogue de produits/title link rel=stylesheet type=text/css href=%=request.getContextPath() %/resources/css/style.css /head body div id=formProduits f:form modelAttribute=produit method=post action=saveProduit table tr tdRéférence:/td tdf:input path=reference//td tdf:errors path=reference cssClass=error//td /tr
  • 91. LLaa vvuuee pprroodduuiittss..jjsspp tr tdDésignation:/td tdf:input path=designation//td tdf:errors path=designation cssClass=error//td /tr tr tdPrix:/td tdf:input path=prix//td tdf:errors path=prix cssClass=error//td /tr ttrr tdQuantité:/tdtdf:input path=quantite//td tdf:errors path=quantite cssClass=error//td /tr tr tdinput type=submit value=Save/td /tr /table /f:form /div med@youssfi.net
  • 92. LLaa vvuuee pprroodduuiittss..jjsspp div id=listProduits table class=table1 tr thREF/ththDESIGNATION/th thPRIX/ththQUANTITE/th /tr c:forEach items=${produits} var=p tr td${p.reference}/td ttdd$${{pp..ddeessiiggnnaattiioonn}}//ttdd td${p.prix}/td td${p.quantite}/td tda href=deleteProduit?ref=${p.reference}Supprimer/a/td tda href=editProduit?ref=${p.reference}Edit/a/td /tr /c:forEach /table /div /body /html med@youssfi.net
  • 93. LLaa ffeeuuiillllee ddee ssttyyllee ccssss :: ssttyyllee..ccssss div{ padding: 10px; margin: 10px; border: 1px dotted gray; } .table1 th{ border: 1px dotted gray; padding: 10px; margin: 10px; bbaacckkggrroouunndd:: ppiinnkk;; } .table1 td{ border: 1px dotted gray; padding: 10px; margin: 10px; background: white; } .error{ color: red; } med@youssfi.net
  • 94. AApppplliiccaattiioonn On souhait créer une application qui permet de gérer des produits. Chaque produit est défini par son code, son nom et son prix. L’application doit permettre de: ◦ Saisir et ajouter un nouveau produit ◦ Afficher tous les produits ◦ Supprimer un produit ◦ AAjjoouutteerr uunnee lliissttee ddee pprroodduuiittss eennvvooyyééss ppaarr uunn cclliieenntt HHTTTTPP ddaannss un fichier Excel Les fonctionnalités de cette application doivent être accessibles via : ◦ Un client HTTP ( Navigateur Web) ◦ Un client SOAP (Application .Net) ◦ Un client RMI (Client Lourd Swing Java) ◦ Un client Androïde (HTTP, JSON) med@youssfi.net
  • 96. AArrcchhiitteeccttuurree SGBD Spring IOC Container ContextLoaderListner JPATransaction Manager Couche Métier ICatMetier EntityManager FactoryBean Couche DAO ICatDAO SimpleJaxWs ServiceExporter Couche SOAP SimpleJaxWs ServiceExporter Couche RMI ICatRemote dependencies Spring JaxWS Jax RS Jackson persistence.xml JPA Hibernate Web Container RMI Client Java Client SOAP CatMetierImpl CatDAOImpl CatSOAPImpl CatRMIImpl JDBC SOAP Client HTTP Client Mobile DispatcherSevlet CatalController View.jsp HTTP HTML HTTP JSON
  • 97. MMaavveenn ddeeppeennddeenncciieess :: SSpprriinngg pom.xml properties java-version1.6/java-version org.springframework-version 3.2.3.RELEASE /org.springframework-version org.aspectj-version1.6.10/org.aspectj-version org.slf4j-version1.6.6/org.slf4j-version /properties med@youssfi.net
  • 98. MMaavveenn DDeeppeennddeenncciieess !-- @Inject -- dependency groupIdjavax.inject/groupId artifactIdjavax.inject/artifactId version1/version /dependency !-- AspectJ -- dependency groupIdorg.aspectj/groupId artifactIdaspectjrt/artifactId version${org.aspectj-version}/version //ddeeppeennddeennccyy !-- Spring -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${org.springframework-version}/version exclusions !-- Exclude Commons Logging in favor of SLF4j -- exclusion groupIdcommons-logging/groupId artifactIdcommons-logging/artifactId /exclusion /exclusions /dependency med@youssfi.net
  • 99. MMaavveenn DDeeppeennddeenncciieess :: SSpprriinngg !-- Spring -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${org.springframework-version}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-orm/artifactId vveerrssiioonn$${{oorrgg..sspprriinnggffrraammeewwoorrkk--vveerrssiioonn}}//vveerrssiioonn /dependency dependency groupIdorg.springframework/groupId artifactIdspring-beans/artifactId version${org.springframework-version}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-tx/artifactId version3.2.2.RELEASE/version /dependency med@youssfi.net
  • 100. MMaavveenn DDeeppeennddeenncciieess !-- Hibernte JPA -- dependency groupIdorg.hibernate/groupId artifactIdhibernate-commons-annotations/artifactId version3.2.0.Final/version /dependency dependency groupIdorg.hibernate/groupId artifactIdhibernate-entitymanager/artifactId vveerrssiioonn33..66..00..FFiinnaall//vveerrssiioonn /dependency dependency groupIdorg.hibernate/groupId artifactIdhibernate-validator/artifactId version4.1.0.Final/version /dependency dependency groupIdorg.hibernate.javax.persistence/groupId artifactIdhibernate-jpa-2.0-api/artifactId version1.0.0.Final/version /dependency med@youssfi.net
  • 101. MMaavveenn DDeeppeennddeenncciieess :: LLooggggiinngg !-- Logging -- dependency groupIdorg.slf4j/groupId artifactIdslf4j-api/artifactId version${org.slf4j-version}/version /dependency dependency groupIdorg.slf4j/groupId artifactIdjcl-over-slf4j/artifactId version${org.slf4j-version}/version scoperuntime/scope /dependency dependency groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId version${org.slf4j-version}/version scoperuntime/scope /dependency med@youssfi.net
  • 102. MMaavveenn DDeeppeennddeenncciieess :: LLoo44jj dependency groupIdlog4j/groupId artifactIdlog4j/artifactId version1.2.15/version exclusions exclusion groupIdjavax.mail/groupId artifactIdmail/artifactId /exclusion exclusion ggrroouuppIIddjjaavvaaxx..jjmmss//ggrroouuppIIdd artifactIdjms/artifactId /exclusion exclusion groupIdcom.sun.jdmk/groupId artifactIdjmxtools/artifactId /exclusion exclusion groupIdcom.sun.jmx/groupId artifactIdjmxri/artifactId /exclusion /exclusions scoperuntime/scope /dependency med@youssfi.net
  • 103. MMaavveenn DDeeppeennddeenncciieess :: WWeebb !-- Servlet -- dependency groupIdjavax.servlet/groupId artifactIdservlet-api/artifactId version2.5/version scopeprovided/scope /dependency dependency groupIdjavax.servlet.jsp/groupId artifactIdjsp-api/artifactId version2.1/version scopeprovided/scope /dependency dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency med@youssfi.net
  • 104. MMaavveenn DDeeppeennddeenncciieess !-- Test -- dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.7/version scopetest/scope /dependency !– MySQL JDBC Driver -- dependency groupIdmysql/groupId aarrttiiffaaccttIIddmmyyssqqll--ccoonnnneeccttoorr--jjaavvaa//aarrttiiffaaccttIIdd version5.1.6/version /dependency !– To generate JSON with jackson -- dependency groupIdorg.codehaus.jackson/groupId artifactIdjackson-core-asl/artifactId version1.9.10/version /dependency dependency groupIdorg.codehaus.jackson/groupId artifactIdjackson-mapper-asl/artifactId version1.9.10/version /dependency med@youssfi.net
  • 105. MMaavveenn DDeeppeennddeenncciieess :: SSpprriinngg SSeeccuurruuttyy !-- Spring Security -- dependency groupIdorg.springframework.security/groupId artifactIdspring-security-core/artifactId version3.2.0.RELEASE/version /dependency dependency groupIdorg.springframework.security/groupId artifactIdspring-security-config/artifactId version3.2.0.RELEASE/version /dependency dependency groupIdorg.springframework.security/groupId artifactIdspring-security-web/artifactId version3.2.0.RELEASE/version /dependency /dependencies med@youssfi.net
  • 106. MMaavveenn DDeeppeennddeenncciieess :: FFiillee UUppllooaadd eett EExxcceell !-- Apache Commons Upload -- dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version1.2.2/version /dependency dependency groupIdcommons-io/groupId aarrttiiffaaccttIIddccoommmmoonnss--iioo//aarrttiiffaaccttIIdd version1.3.2/version /dependency !-- Apache Excel -- dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version3.7/version /dependency med@youssfi.net
  • 109. EEnnttiittéé :: PPrroodduuiitt package ma.enset.catalogue.entities; import java.io.Serializable;import javax.persistence.*; import javax.validation.constraints.Size; import org.hibernate.validator.constraints.NotEmpty; @Entity public class Produit implements Serializable { @Id @@GGeenneerraatteeddVVaalluuee((ssttrraatteeggyy==GGeenneerraattiioonnTTyyppee..IIDDEENNTTIITTYY)) private Long idProduit; @NotEmpty @Size(max=60,min=3) private String nomProduit; private double prix; // Constructeur sans paramètre // Constructeur avec paramètres (nom, prix) // Getters et Setters } med@youssfi.net
  • 111. IInntteerrffaaccee DDAAOO package ma.enset.catalogue.dao; import java.util.List; import ma.enset.catalogue.entities.Produit; public interface ICatalogueDAO { ppuubblliicc vvooiidd aaddddPPrroodduuiitt((PPrroodduuiitt pp));; public ListProduit listProduits(); public void deleteProduit(Long idP); public Produit editProduit(Long idP); public void updateProduit(Produit p); public ListProduit chercherProduits(String motCle); } med@youssfi.net
  • 112. IImmpplléémmeennttaattiioonn DDAAOO package ma.enset.catalogue.dao; import java.util.List;import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query;import ma.enset.catalogue.entities.Produit; public class CatalogueDaoImpl implements ICatalogueDAO { @PersistenceContext private EntityManager entityManager; @Override public void addProduit(Produit p) { entityManager.persist(p); } @Override public ListProduit listProduits() { Query req=entityManager.createQuery(select p from Produit p); return req.getResultList(); } med@youssfi.net
  • 113. IImmpplléémmeennttaattiioonn DDAAOO @Override public void deleteProduit(Long idP) { Produit p=entityManager.find(Produit.class,idP); entityManager.remove(p); } @Override public Produit editProduit(Long idP) { Produit p=entityManager.find(Produit.class,idP); return p; } @Override public void updateProduit(Produit p) { entityManager.merge(p); } @Override public ListProduit chercherProduits(String motCle) { Query req=entityManager.createQuery(select p from Produit p where p.nomProduit like :x); req.setParameter(x, %+motCle+%); return req.getResultList(); } } med@youssfi.net
  • 115. IInntteerrffaaccee MMééttiieerr package ma.enset.catalogue.metier; import java.util.List; import ma.enset.catalogue.entities.Produit; public interface ICatalogueMetier { public void addProduit(Produit p); ppuubblliicc LLiissttPPrroodduuiitt lliissttPPrroodduuiittss(());; public void deleteProduit(Long idP); public Produit editProduit(Long idP); public void updateProduit(Produit p); public ListProduit chercherProduits(String motCle); } med@youssfi.net
  • 116. IImmpplléémmeennttaattiioonn mmééttiieerr package ma.enset.catalogue.metier; import java.util.List; import org.springframework.transaction.annotation.Transactional; import ma.enset.catalogue.dao.ICatalogueDAO; import ma.enset.catalogue.entities.Produit; public class CatalogueMetierImpl implements ICatalogueMetier { pprriivvaattee IICCaattaalloogguueeDDAAOO ddaaoo;; public void setDao(ICatalogueDAO dao) { this.dao = dao; } @Override @Transactional public void addProduit(Produit p) { dao.addProduit(p); } med@youssfi.net
  • 117. Implémentation mmééttiieerr @Override public ListProduit listProduits() { return dao.listProduits(); } @Override @Transactional public void deleteProduit(Long idP) { dao.deleteProduit(idP); } @Override public Produit editProduit(Long idP) { return dao.editProduit(idP); } @Override @@TTrraannssaaccttiioonnaall public void updateProduit(Produit p) { dao.updateProduit(p); } @Override @Transactional public ListProduit chercherProduits(String motCle) { return dao.chercherProduits(motCle); } } med@youssfi.net
  • 118. WWeebb SSeerrvviiccee SSOOAAPP package ma.enset.catalogue.service; import java.util.List; import javax.jws.WebParam; import javax.jws.WebService; import org.springframework.beans.factory.annotation.Autowired; import ma.enset.catalogue.entities.Produit; import ma.enset.catalogue.metier.ICatalogueMetier; @WebService ppuubblliicc ccllaassss CCaattaalloogguueeSSeerrvviiccee {{ private ICatalogueMetier metier; public void setMetier(ICatalogueMetier metier) { this.metier = metier; } public ListProduit listProduits(){ return metier.listProduits(); } public Produit getProduit(@WebParam(name=idProduit)Long idP){ return metier.editProduit(idP); }} med@youssfi.net
  • 119. Service RRMMII :: IInntteerrffaaccee RReemmoottee package ma.enset.catalogue.rmi; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.List; import ma.enset.catalogue.entities.Produit; ppuubblliicc iinntteerrffaaccee IICCaattaalloogguueeRReemmoottee eexxtteennddss RReemmoottee {{ public void addProduit(Produit p)throws RemoteException;; public ListProduit listProduits()throws RemoteException;; public void deleteProduit(Long idP)throws RemoteException;; public Produit editProduit(Long idP)throws RemoteException;; public void updateProduit(Produit p)throws RemoteException;; } med@youssfi.net
  • 120. Service RMI : Implémentation dduu sseerrvviiccee RRMMII package ma.enset.catalogue.rmi; import java.rmi.RemoteException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import ma.enset.catalogue.entities.Produit; import ma.enset.catalogue.metier.ICatalogueMetier; ppuubblliicc ccllaassss CCaattaalloogguueeRRmmiiSSeerrvviicceeIImmppll iimmpplleemmeennttss IICCaattaalloogguueeRReemmoottee {{ private ICatalogueMetier metier; public void setMetier(ICatalogueMetier metier) { this.metier = metier; } @Override public void addProduit(Produit p) throws RemoteException { metier.addProduit(p); } med@youssfi.net
  • 121. Service RMI : Implémentation dduu sseerrvviiccee RRMMII @Override public ListProduit listProduits() throws RemoteException { return metier.listProduits(); } @Override public void deleteProduit(Long idP) throws RemoteException { metier.deleteProduit(idP); } @Override public Produit editProduit(Long idP) throws RemoteException { return metier.editProduit(idP); } @Override public void updateProduit(Produit p) throws RemoteException { metier.updateProduit(p); } } med@youssfi.net
  • 122. mmaaiinn//jjaavvaa//rreessoouurrcceess//MMEETTAA-IINNFF// ppeerrssiisstteennccee..xxmmll ?xml version=1.0 encoding=UTF-8? persistence xmlns=http://java.sun.com/xml/ns/persistence xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd version=2.0 persistence-unit name=MY_P_U transaction-type=RESOURCE_LOCAL providerorg.hibernate.ejb.HibernatePersistence/provider properties property name=hibernate.show_sql value=true/ property name=hibernate.hbm2ddl.auto value=update/ /properties /persistence-unit /persistence med@youssfi.net
  • 124. Injection ddeess ddééppeennddaanncceess //WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll ?xml version=1.0 encoding=UTF-8? beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:context=http://www.springframework.org/schema/context xmlns:p=http://www.springframework.org/schema/p xmlns:tx=http://www.springframework.org/schema/tx xsi:schemaLocation=http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd hhttttpp::////wwwwww..sspprriinnggffrraammeewwoorrkk..oorrgg//sscchheemmaa//ccoonntteexxtt hhttttpp::////wwwwww..sspprriinnggffrraammeewwoorrkk..oorrgg//sscchheemmaa//ccoonntteexxtt//sspprriinngg--ccoonntteexxtt--33..11..xxssdd !-- Root Context: defines shared resources visible to all other web components -- context:annotation-config/context:annotation-config bean id=dao class=ma.enset.catalogue.dao.CatalogueDaoImpl/bean bean id=metier class=ma.enset.catalogue.metier.CatalogueMetierImpl property name=dao ref=dao/property /bean med@youssfi.net
  • 125. Injection ddeess ddééppeennddaanncceess //WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll bean id=datasource class=org.springframework.jdbc.datasource.DriverManagerDataSource property name=driverClassName value=com.mysql.jdbc.Driver/property property name=url value=jdbc:mysql://locahost:3306/DB_SID_CAT/property property name=username value=root/property property name=password value=/property /bean bean id=persistenceUnitManager class=org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager property name=persistenceXmlLocations list valueclasspath*:META-INF/persistence.xml/value /list /property property name=defaultDataSource ref=dataSource/property /bean med@youssfi.net
  • 126. Injection ddeess ddééppeennddaanncceess //WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll bean id=entityManagerFactory class=org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean property name=persistenceUnitManager ref=persistenceUnitManager/property property name=persistenceUnitName value=MY_P_U/property /bean bbeeaann iidd==ttrraannssaaccttiioonnMMaannaaggeerr class=org.springframework.orm.jpa.JpaTransactionManager property name=entityManagerFactory ref=entityManagerFactory/property /bean tx:annotation-driven transaction-manager=transactionManager/ med@youssfi.net
  • 127. Injection ddeess ddééppeennddaanncceess //WWEEBB-IINNFF//sspprriinngg/rroooott-ccoonntteexxtt..xxmmll bean id=service class=ma.enset.catalogue.service.CatalogueService property name=metier ref=metier/property /bean bean class=org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter property name=baseAddress value=http://localhost:8080/services//property /bean bbeeaann iidd==rrmmiiCCaattaalloogguuee ccllaassss==mmaa..eennsseett..ccaattaalloogguuee..rrmmii..CCaattaalloogguueeRRmmiiSSeerrvviicceeIImmppll property name=metier ref=metier/property /bean bean class=org.springframework.remoting.rmi.RmiServiceExporter property name=serviceName value=catService/property property name=service ref=rmiCatalogue/property property name=serviceInterface value=ma.enset.catalogue.rmi.ICatalogueRemote/property /bean /beans med@youssfi.net
  • 128. Couche WWeebb :: CCoonnttrrôôlleeuurr package ma.enset.catalogue.controllers; import java.util.List; import javax.validation.Valid; import ma.enset.catalogue.entities.Produit; import ma.enset.catalogue.metier.ICatalogueMetier; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @Controller public class CatalogueController { @Autowired private ICatalogueMetier metier; @RequestMapping(value=/index) public String index(Model model){ model.addAttribute(produit, new Produit()); model.addAttribute(produits, metier.listProduits()); return produits; } med@youssfi.net
  • 129. Couche WWeebb :: CCoonnttrrôôlleeuurr @RequestMapping(value=/saveProduit) public String saveProduit(@Valid Produit p,BindingResult bindingResult,Model model){ if(bindingResult.hasErrors()) return produits; if(p.getIdProduit()==null) metier.addProduit(p); else metier.updateProduit(p); model.addAttribute(produit, new Produit()); mmooddeell..aaddddAAttttrriibbuuttee((pprroodduuiittss, mmeettiieerr..lliissttPPrroodduuiittss(())));; return produits; } @RequestMapping(value=/deleteProduit) public String delete(@RequestParam(value=id) Long id, Model model){ metier.deleteProduit(id); model.addAttribute(produit, new Produit()); model.addAttribute(produits, metier.listProduits()); return produits; } med@youssfi.net
  • 130. Couche WWeebb :: CCoonnttrrôôlleeuurr @RequestMapping(value=/editProduit/{id}) public String edit(@PathVariable(value=id) Long id, Model model){ Produit p=metier.editProduit(id); model.addAttribute(produit, p); model.addAttribute(produits, metier.listProduits()); return produits; } @@RReeqquueessttMMaappppiinngg((vvaalluuee==//lliissttPPrroodduuiittss//{{mmcc}})) @ResponseBody public ListProduit listProduits(@PathVariable(value=mc)String mc){ return metier.chercherProduits(mc); } } med@youssfi.net
  • 133. VVuuee :: pprroodduuiittss..jjsspp %@ page language=java contentType=text/html; charset=ISO-8859-1 pageEncoding=ISO-8859-1% %@taglib uri=http://java.sun.com/jsp/jstl/core prefix=c % %@taglib uri=http://www.springframework.org/tags/form prefix=f % !DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd html head mmeettaa hhttttpp--eeqquuiivv==CCoonntteenntt--TTyyppee ccoonntteenntt==tteexxtt//hhttmmll;; cchhaarrsseett==IISSOO--88885599--11 titleInsert title here/title /head body f:form action=saveProduit modelAttribute=produit table tr tdID Produit:f:hidden path=idProduit//td td${produit.idProduit}/td /tr med@youssfi.net
  • 134. VVuuee :: pprroodduuiittss..jjsspp tr tdNom Produit:/td tdf:input path=nomProduit//td tdf:errors path=nomProduit cssClass=error//td /tr tr tdPrix:/td tdf:input path=prix//td tdf:errors path=prix cssClass=error//td /tr tr tdinput type=submit value=Save/td /tr /table /f:form /body med@youssfi.net
  • 135. VVuuee :: pprroodduuiittss..jjsspp table border=1 width=80% tr thID/ththNom/ththPrix/th /tr c:forEach items=${produits} var=p tr td${p.idProduit }/td td${p.nomProduit }/td td${p.prix }/td tda href=deleteProduit?id=${p.idProduit }Supprimer/a/td tda href=editProduit/${p.idProduit }Edit/a/td /tr /c:forEach /table /html med@youssfi.net
  • 136. TTeesstteerr llee wweebb sseerrvviiccee med@youssfi.net
  • 137. Tester lleess mméétthhooddeess aavveecc ooxxyyggeenn med@youssfi.net
  • 138. Requête eett rrééppoonnssee SSOOAAPP SOAP-ENV:Envelope xmlns:SOAP-ENV= http://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV:Header/ SOAP-ENV:Body listProduits xmlns=http://service.catalogue.enset.ma// /SOAP-ENV:Body /SOAP-ENV:Envelope ?xml version=1.0 ? S:Envelope xmlns:S=http://schemas.xmlsoap.org/soap/envelope/ S:Body ns2:listProduitsResponse xmlns:ns2=http://service.catalogue.enset.ma/ return idProduit12/idProduit SGBD Couche DAO Couche Métier med@youssfi.net nomProduitaaaaa/nomProduit prix0.0/prix /return return idProduit13/idProduit nomProduitaaaaa/nomProduit prix0.0/prix /return return idProduit20/idProduit nomProduitpppppp/nomProduit prix0.0/prix /return return idProduit26/idProduit nomProduitHP980900/nomProduit prix9800.0/prix /return /ns2:listProduitsResponse /S:Body /S:Envelope Web Service SOAP OXYGEN
  • 139. Requête eett rrééppoonnssee SSOOAAPP SOAP-ENV:Envelope xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV:Header/ SOAP-ENV:Body getProduit xmlns=http://service.catalogue.enset.ma/ idProduit xmlns=26/idProduit /getProduit /SOAP-ENV:Body /SOAP-ENV:Envelope med@youssfi.net ?xml version=1.0 ? S:Envelope xmlns:S=http://schemas.xmlsoap.org/soap/envelope/ S:Body ns2:getProduitResponse xmlns:ns2=http://service.catalogue.enset.ma/ return idProduit26/idProduit nomProduitHP980900/nomProduit prix9800.0/prix /return /ns2:getProduitResponse /S:Body /S:Envelope
  • 140. CClliieenntt RRMMII import java.rmi.Naming; import java.util.List; import ma.enset.catalogue.entities.Produit; import ma.enset.catalogue.rmi.ICatalogueRemote; public class ClientRMICatalogue { public static void main(String[] args) { try { ICatalogueRemote stub=(ICatalogueRemote) Naming.lookup(rmi://localhost:1099/catService); ListProduit prods=stub.listProduits(); SGBD Couche DAO Couche Métier Service RMI for(Produit p:prods){ System.out.println(p.getNomProduit()); System.out.println(p.getPrix()); } } catch (Exception e) { e.printStackTrace(); } } } med@youssfi.net RMI Client RMI
  • 141. CClliieenntt AAnnddrrooïïddee SGBD Couche DAO Couche Métier Service WEB med@youssfi.net HTTP JSON Client Mobile Androide
  • 143. LL’’aaccttiivviittéé package com.example.catalogue; import java.io.*;import org.apache.http.*;import org.apache.http.client.*; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.*;import android.os.*;import android.app.Activity; import android.view.*;import android.view.View.OnClickListener; import android.widget.*; public class MainActivity extends Activity implements OnClickListener { private EditText editTextMC; private Button buttonOK; private GridView gridViewProduits; @Override pprrootteecctteedd vvooiidd oonnCCrreeaattee((BBuunnddllee ssaavveeddIInnssttaanncceeSSttaattee)) {{ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonOK=(Button) findViewById(R.id.button1); editTextMC=(EditText) findViewById(R.id.editTextMC); gridViewProduits=(GridView) findViewById(R.id.gridView1); buttonOK.setOnClickListener(this); StrictMode.ThreadPolicy threadPolicy=new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(threadPolicy); } med@youssfi.net
  • 144. LL’’aaccttiivviittéé @Override public void onClick(View arg0) { Toast.makeText(getApplicationContext(), Chargement,Toast.LENGTH_LONG).show(); StringBuilder reponseHTTP = new StringBuilder(); HttpClient client = new DefaultHttpClient(); String mc=editTextMC.getText().toString(); HttpGet httpGet = new HttpGet (http://192.168.1.79:8080/catalogue/listProduits/+mc); try { HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream content = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(content)); String line; while ((line = reader.readLine()) != null) { reponseHTTP.append(line); } med@youssfi.net
  • 145. LL’’aaccttiivviittéé JSONArray jsonArray=new JSONArray(reponseHTTP.toString()); String[] produits=new String[(jsonArray.length()+1)*3]; int index=-1; produits[++index]=ID;produits[++index]=NOM;produits[++index]=PRIX; for (int i = 0; i jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); produits[++index]=jsonObject.getString(idProduit); produits[++index]=jsonObject.getString(nomProduit); produits[++index]=jsonObject.getString(prix); } ArrayAdapterString adapter = new ArrayAdapterString (this, android.R.layout.simple_list_item_1, produits); gridViewProduits.setAdapter(adapter); } else { Toast.makeText(getApplicationContext(), Code =+statusCode, Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); }}} med@youssfi.net
  • 146. UUppllooaadd dd’’uunn ffiicchhiieerr FFoorrmmaatt EExxcceell qquuii ccoonnttiieenntt lleess pprroodduuiittss Classeur.x1.xls med@youssfi.net
  • 147. DDééppeennddaanncceess !-- Apache Commons Upload -- dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version1.2.2/version /dependency !-- Apache Commons Upload -- ddeeppeennddeennccyy groupIdcommons-io/groupId artifactIdcommons-io/artifactId version1.3.2/version /dependency !-- Apache Excel -- dependency groupIdorg.apache.poi/groupId artifactIdpoi/artifactId version3.7/version /dependency med@youssfi.net
  • 148. CCllaassssee UUppllooaaddeeddFFiillee package ma.enset.catalogue.controllers; import org.springframework.web.multipart.commons.CommonsMultipartFile; public class UploadedFile { private CommonsMultipartFile file; ppuubblliicc CCoommmmoonnssMMuullttiippaarrttFFiillee ggeettFFiillee(()) {{ return file; } public void setFile(CommonsMultipartFile file) { this.file = file; } } med@youssfi.net
  • 149. CCoonnttrroolleeuurr package ma.enset.catalogue.controllers; import java.io.File;import java.io.FileOutputStream; import java.util.ArrayList;import java.util.HashMap; import java.util.List;import java.util.Map; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import ma.enset.catalogue.entities.Produit; import ma.enset.catalogue.metier.ICatalogueMetier; @Controller public class UploadProduitsController implements HandlerExceptionResolver { @Autowired private ICatalogueMetier metier; @RequestMapping(value=/formUpload) public String formUpload(@ModelAttribute(value=form) UploadedFile form){ return formUpload; } med@youssfi.net
  • 150. Contrôleur : Sauvegarde dduu ffiicchhiieerr @RequestMapping(value=/saveUploadedFile) public String saveUploadedFile( @ModelAttribute(value=form) UploadedFile form, BindingResult bindingResult,Model model){ if(!bindingResult.hasErrors()){ try { // Enregistrement du fichier String filePath= SSyysstteemm..ggeettPPrrooppeerrttyy((jjaavvaa..iioo..ttmmppddiirr))++//++ffoorrmm..ggeettFFiillee(())..ggeettOOrriiggiinnaallFFii lename(); FileOutputStream outputStream=new FileOutputStream(new File(filePath)); outputStream.write(form.getFile().getFileItem().get()); outputStream.close(); System.out.println(form.getFile().getSize()); med@youssfi.net
  • 151. CCoonnttrrôôlleeuurr :: TTrraaiitteemmeett dduu ffiicchhiieerr EExxcceell // Interprétation du fichier Excel HSSFWorkbook workbook=new HSSFWorkbook(form.getFile().getInputStream()); HSSFSheet f1=workbook.getSheet(Feuil1); int l1=f1.getFirstRowNum(); int l2=f1.getLastRowNum(); ListProduit produits=new ArrayListProduit(); for(int i=l1+1;i=l2;i++){ Produit p=new Produit(); HSSFRow r1=f1.getRow(i); int n1=r1.getFirstCellNum(); p.setNomProduit(r1.getCell(n1).getStringCellValue()); p.setPrix(r1.getCell(n1+1).getNumericCellValue()); metier.addProduit(p); produits.add(p); } model.addAttribute(produits, produits); } catch (Exception e) { throw new RuntimeException(e); }} return formUpload; } med@youssfi.net
  • 152. Contrôleur :: GGeessttiioonn ddeess EExxcceeppttiioonnss @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) { MapObject, Object model=new HashMapObject, Object(); model.put(errors, e.getMessage()); model.put(form, new UploadedFile()); return new ModelAndView(formUpload,(Map)model); } } med@youssfi.net
  • 153. Vue :: ffoorrmmUUppllooaadd..jjsspp %@ page language=java contentType=text/html; charset=ISO-8859-1 pageEncoding=ISO-8859-1% %@taglib prefix=c uri=http://java.sun.com/jsp/jstl/core % %@taglib prefix=f uri=http://www.springframework.org/tags/form % html head meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1 titleInsert title here/title /head bbooddyy f:form commandName=form action=saveUploadedFile enctype=multipart/form-data method=post table tr tdFichier Excel (Froamt XLS):/td tdf:input type=file path=file/ tdf:errors path=*/f:errors${errors}/td /tr tr tdinput type=submit value=Upload//td /tr /table /f:form med@youssfi.net
  • 154. Vue :: ffoorrmmUUppllooaadd..jjsspp h3Content/h3 table border=1 tr thNom/ththPrix/th /tr c:forEach items=${produits} var=p tr td${p.nomProduit}/td td${p.prix}/td /tr /c:forEach /table /body /html med@youssfi.net
  • 155. Limitation de la taille ddeess ffiicchhiieerrss uuppllooaaddéé Fichier : /WEB-INF/spring/appServlet/servlet-context.xml beans:bean class=org.springframework.web.multipart.commons.CommonsMultipartResolver id=multipartResolver beans:property name=maxUploadSize value=100000/beans:property /beans:bean med@youssfi.net
  • 157. wweebb..xxmmll Déclarer le filtre DelegatingFilterProxy dans le fichier web.xml Toutes les requêtes HTTP passent par ce filtre. Le nom du filtre est : springSecurityFilterChain Ce nom devrait correspondre au nom d’un bean spring qui sera déployé par ContextLoaderListener et qui contient les règles de sécurité à exécuter. !-- Spring Security -- filter filter-namespringSecurityFilterChain/filter-name filter-class org.springframework.web.filter.DelegatingFilterProxy/filter-class /filter filter-mapping filter-namespringSecurityFilterChain/filter-name url-pattern/*/url-pattern /filter-mapping med@youssfi.net
  • 158. BBaassee ddee ddoonnnnééeess Créer deux tables : ◦ Users : qui contient les utilisateurs autorisés à accéder à l’application ◦ Roles : qui contient les rôles de chaque utilisateur med@youssfi.net
  • 159. Base de ddoonnnnééeess :: TTaabbllee UUsseerrss -- -- Structure de la table `users` -- CREATE TABLE IF NOT EXISTS `users` ( `ID_USER` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(15) NOT NULL, `PASSWORD` varchar(100) NOT NULL, `ACTIVED` tinyint(1) NOT NULL, PRIMARY KEY (`ID_USER`), UUNNIIQQUUEE KKEEYY ``LLOOGGIINN`` ((``uusseerrnnaammee``)) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; -- -- Contenu de la table `users` -- INSERT INTO `users` (`ID_USER`, `username`, `PASSWORD`, `ACTIVED`) VALUES (1, 'admin1', 'e00cf25ad42683b3df678c61f42c6bda', 1), (2, 'admin2', 'c84258e9c39059a89ab77d846ddab909', 1), (3, 'user', 'ee11cbb19052e40b07aac0ca060c23ee', 1); med@youssfi.net
  • 160. Base de ddoonnnnééeess :: TTaabbllee rroolleess -- -- Structure de la table `roles` -- CREATE TABLE IF NOT EXISTS `roles` ( `ID_ROLE` int(11) NOT NULL AUTO_INCREMENT, `ID_USER` int(11) NOT NULL, `ROLE_NAME` varchar(20) NOT NULL, PRIMARY KEY (`ID_ROLE`), KEY `ID_USER` (`ID_USER`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; -- ---- CCoonntteennuu ddee llaa ttaabbllee ``rroolleess`` -- INSERT INTO `roles` (`ID_ROLE`, `ID_USER`, `ROLE_NAME`) VALUES (1, 1, 'ROLE_ADMIN_CAT'), (2, 1, 'ROLE_ADMIN_PROD'), (3, 2, 'ROLE_ADMIN_PROD'), (4, 3, 'ROLE_USER'); -- -- Contraintes pour la table `roles` -- ALTER TABLE `roles` ADD CONSTRAINT `roles_ibfk_1` FOREIGN KEY (`ID_USER`) REFERENCES `users` (`ID_USER`); med@youssfi.net
  • 161. rroooott-ccoonntteexxtt..xxmmll ?xml version=1.0 encoding=UTF-8? beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:tx=http://www.springframework.org/schema/tx xmlns:context=http://www.springframework.org/schema/context xmlns:s=http://www.springframework.org/schema/security xsi:schemaLocation=http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd bean id=datasource class=org.springframework.jdbc.datasource.DriverManagerDataSource property name=driverClassName value=com.mysql.jdbc.Driver/property property name=url value=jdbc:mysql://localhost:3306/DB_SID_CAT/property property name=username value=root/property property name=password value=/property /bean med@youssfi.net
  • 162. rroooott-ccoonntteexxtt..xxmmll s:http s:intercept-url pattern=/produits/** access=ROLE_ADMIN_PROD/ s:intercept-url pattern=/categories/** access=ROLE_ADMIN_CAT/ s:form-login login-page=/login default-target-url=/produits/index authentication-failure-url=/login / s:logout logout-success-url=/logout / /s:http s:authentication-manager s:authentication-provider s:password-encoder hash=md5/s:password-encoder s:jdbc-user-service data-source-ref=datasource users-by-username-query=select username,password, actived from users where username=? authorities-by-username-query=select u.username, r.role_name from users u, roles r where u.id_user = r.id_user and u.username =? / !-- s:user-service s:user name=admin1 password=admin1 authorities=ROLE_ADMIN_PROD/ s:user name=admin2 authorities=ROLE_ADMIN_CAT,ROLE_ADMIN_PROD password=admin2 / /s:user-service -- /s:authentication-provider /s:authentication-manager /beans med@youssfi.net
  • 163. CCoonnttrrôôlleeuurr package org.enset.sid.controllers; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMa pping; @Controller public class LoginController { @RequestMapping(/login) public String login(){ return login; } } med@youssfi.net
  • 164. llooggiinn..jjsspp html head meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1 titleInsert title here/title /head body form action=j_spring_security_check method=post table tr tdLogin/td tdinput type=text name=j_username/td //ttrr tr tdPass word/td tdinput type=password name=j_password/td /tr tr tdinput type=submit value=Login/td /tr /table /form /body /html med@youssfi.net