Java EE Approfondi
Cours 1
Cours de 2e année ingénieur
Spécialisation « Génie Informatique »
Présentation du cours
• Pôle GL-I2« Génie logiciel avancé»
– 20h sur 8 semaines
• Objectifs
– Initiation aux frameworks Java EE
• Semaine 1 : Framework MVC : Struts
• Semaine 2 : Framework Persistance : Hibernate
– Etude et apprentissage de nouveaux frameworks
• Semaine 3-8 : Projet en mini-groupes pendant les créneaux
• Prérequis
– Java SE, Java EE (Servlet, JSP, EL/JSTL, MVC),
XML, SQL
2
Frameworks MVC
• Struts 1 ( [Link] )
• Struts 2 ( [Link] )
• Stripes( [Link] )
• Spring ( [Link] )
• JavaServer Faces ( [Link] )
• Tapestry ( [Link] )
• Seam ( [Link] )
• LifeRay ( [Link] )
• JetSpeed ( [Link] )
• SiteMesh( [Link] )
3
Frameworks persistance/XML
• Hibernate ( [Link] )
• JAXB( [Link] )
• iBATIS ( [Link] )
• TopLink ([Link]
products/ias/toplink/[Link] )
• Cayenne ( [Link] )
• XStream( [Link] )
4
Rappel MVC
Ex : AREL V6 – liste des promos
6
Ex : AREL V6 – liste des promos
7
MVC : étape 1
Le client récupère un formulaire ([Link])
pour passer une requête avec paramètres (1, 2, puis 3)
Client 1 Conteneur
Controller
Servlet
<html>
2 SelectPromo
...
3 ...
...
</html> <html>
...
[Link] JSP
... POJO
...
</html> View Model
[Link] [Link]
8
Formulaire : [Link]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"[Link]
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html;charset=ISO-8859-1">
<title>AREL V6.0</title>
</head>
<body>
<h1align="center">AREL: L'école virtuelle de l'EISTI</ h1>
<form method="GET" action="[Link]
Sélectionner la promo à afficher:
<select name="promo" size="1">
<option>ing1</option>
<option>ing2</option>
</select><input type="SUBMIT" />
</form>
</body>
</html>
9
MVC : étape 2
1. Le client envoie son formulaire (GET/POST avec paramètres)
2. Le conteneur transmet au servlet correspondant (le controller)
GET …?promo=ing2
doGet(Rq,Rp)
1
2 Controller
Servlet
SelectPromo
<html>
...
JSP
... POJO
...
</html> View Model
[Link] [Link]
10
Controller : [Link]
package arel;
import ...;
public class SelectPromo extends [Link]
implements [Link]{
//...
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
String promoName = [Link]( "promo" );
//...
}
}
11
Configuration : [Link]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="[Link]
xmlns="[Link]
xmlns:web="[Link]
xsi:schemaLocation="[Link]
[Link]
id="WebApp_ID" version="2.5">
<display-name>MVC</display-name>
<welcome-file-list>
<welcome-file>[Link]</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>SelectPromo</display-name>
<servlet-name>SelectPromo</servlet-name>
<servlet-class>[Link]</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SelectPromo</servlet-name>
<url-pattern>/SelectPromo</url-pattern>
</servlet-mapping>
</web-app> 12
MVC : étape3
3. Le servlet controller interroge le model sur « ing2 »
4. Le model retourne au controller le résultat correspondant
GET …?promo=ing2
doGet(Rq,Rp)
1 new Promo();
2 3 getPromo("ing2")
Servlet
result:List
4
<html>
...
JSP
... POJO
...
</html>
13
Model : [Link]
package arel;
import ...;
public class Promo{
public List<String> getPromo(String promo){
List<String> promoList = new ArrayList<String>();
if([Link]("ing1")){
[Link]("Donald Duck");
[Link]("Minnie Mouse");
[Link]("Pluto"); //...
} else if ([Link]("ing2")){
[Link]("Mickey Mouse");
[Link]("Daisy Duck");
[Link]("Goofy"); //...
} else{ return null;}
return promoList;
}
}
14
MVC : étape 4
5. Le controller utilise les données du model pour sa réponse
6. Le controller transmet sa réponse à la view (JSP)
GET …?promo=ing2
doGet(Rq,Rp)
1 new Promo();
2 3 getPromo("ing2")
Servlet
setAttribute5 result:List
("promo",result) 4
<html>
...
JSP
... Rq POJO
... 6
</html>
forward(Rq,Rp)
15
Controller : [Link]
package arel;
import ...;
public class SelectPromo extends [Link]
implements [Link]{
//...
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
String promoName = [Link]("promo");
Promo promo = new Promo();
List<String> result = [Link](promoName);
[Link]("promo", result);
RequestDispatcher view=
[Link]("[Link]");
[Link](request, response);
}
}
16
MVC : étape5
7. La JSP (view) traite la réponse transmise par le controller
8. La page HTML résultante est reçue par le client
GET …?promo=ing2
doGet(Rq,Rp)
1 new Promo();
2 3 getPromo("ing2")
Servlet
8
setAttribute5 result:List
("promo",result) 4
<html>
7 ...
JSP
... Rq POJO
getAttribute("promo") ... 6
</html>
forward(Rq,Rp)
17
View : [Link]
<%@ page import="[Link].*" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"[Link]
<html>
<head>
<meta http-equiv="Content-Type«
content="text/html; charset=ISO-8859-1">
<title>Result</title>
</head>
<body>
<%
List<String> promoList=(List<String>)[Link]("promo");
Iteratorit= [Link]();
while([Link]()){
[Link]("<br />"+[Link]());
}
%>
</body>
</html>
18
Struts
[Link]
Une composition de patterns
• Mise en œuvre d’un design pattern pour
Java EE : «Front Controller»
– Un seul servlet pour traiter toutes les requêtes
– Cf.
[Link]
• Le Front Controller, appelé ActionServlet,
permet de mettre en œuvre le pattern
MVC de façon générique
22
Architecture Struts
[Link] <xml> [Link]
<mapping>
...
</mapping>
</xml>
Form
Bean
1. Envoi d’une requête
[Link] .do 2. Traitement de 3. Récupère
l’action« MyAction» et traite les paramètres
[Link]
Action Action
Servlet object
6. Envoi de la 4. Invoque le traitement
5. Expédie le résultat
réponse au client du modèle
à la vue
<html>
...
JSP
...
POJO
...
</html>
[Link]
23
Configuration : [Link]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC…>
<web-app>
<display-name>Struts Blank Application</display-name>
<!-- Standard Action Servlet Configuration -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>[Link]
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/[Link]</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern> *.do </url-pattern>
</servlet-mapping>
</web-app> 24
Étapes 1 & 2
[Link] <xml> [Link]
<mapping>
...
</mapping>
</xml>
Form
Bean
GET [Link]?promo=ing2
[Link]
doGet(Rq,Rp)
1
2
Action Action
Servlet object
<html>
...
JSP
...
POJO
...
</html>
[Link]
25
Configuration : [Link]
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC… struts-config_1_3.dtd">
<struts-config>
<!-- Form Bean Definitions -->
<form-beans>
<form-bean
name="selectPromoForm"
type="[Link]" />
</form-beans>
<!-- Action Mapping Definitions -->
<action-mappings>
<action path="/SelectPromo"
type="[Link]" name="selectPromoForm"
scope="request" validate="true" input="/[Link]">
< forward name="show_results" path="/pages/[Link]" />
</action>
</action-mappings>
<!-- Other Definitions… -->
</struts-config> 26
Étape 3
[Link] <xml> [Link]
<mapping>
...
</mapping>
</xml>
Form
Auto set() Bean
3.a + validate()
GET [Link]?promo=ing2 3.b
[Link]
doGet(Rq,Rp)
1
2
Action Action
Servlet object
<html>
...
JSP
...
POJO
...
</html>
[Link]
27
Form bean :
[Link]
package arel; import ...;
public class SelectPromoForm extends ActionForm{
private String promoName;
public void setPromoName(String pN) {promoName=pN;}
public String getPromoName (){ return promoName;}
private static final String VALID_PROMOS = "ing1,ing2";
public ActionErrors validate (ActionMapping mapping,
HttpServletRequest request){
ActionErrors errors = new ActionErrors();
if(VALID_PROMOS.indexOf(promoName) == -1){
[Link]("promo",
new ActionMessage("[Link]"));
}
return errors;
}
}
28
Formulaire : [Link]
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="[Link] prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"[Link]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>ARELV6.0</title>
</head>
<body>
<h1 align="center">AREL:L'école virtuelle de l'EISTI</h1>
<html:errors/>
<form method="GET" action="[Link]">Sélectionner la promo à
afficher:<select name="promoName" size="1">
<option>ing1</option>
<option>ing2</option>
</select><input type="SUBMIT"/></form>
</body>
</html>
29
Étape 4
[Link] <xml> [Link]
<mapping>
...
</mapping>
</xml>
Form
Auto set() Bean
3.a + validate()
4.a getPromoName()
GET [Link]?promo=ing2 3.b
5.a
[Link]
doGet(Rq,Rp) 4.b
1 execute()
2
Action Action
Servlet object
4.d
setAttribute("promo")
return ActionMapping 4.c
getPromo()
<html>
...
JSP
...
POJO
...
</html>
[Link]
30
Action object:
[Link]
package arel;
import ...;
public class SelectPromoAction extends Action{
public ActionForward execute( ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
SelectPromoForm myForm=(SelectPromoForm)form;
Promo promo = new Promo();
List<String> result=[Link]( [Link]() );
[Link]("promo", result);
return [Link]("show_results");
} 31
Étapes 5 & 6
[Link] <xml> [Link]
<mapping>
...
</mapping>
</xml>
Form
Auto set() Bean
3.a + validate()
4.a getPromoName()
GET [Link]?promo=ing2 3.b
5.a
[Link]
doGet(Rq,Rp) 4.b
1 execute()
2
Action Action
Servlet object
6 4.d
setAttribute("promo")
return ActionMapping 4.c
5.b getPromo()
<html>
5.c ...
JSP
...
POJO
getAttribute("promo") ...
</html>
[Link]
32
Notion supplémentaire
Les fichiers properties
Localisation : les fichiers properties
• Struts supporte nativement le mécanisme d'internationalisation et de localisation
offert par la plateforme Java : Le ResourceBundle et la Locale.
•Un fichier .properties permet de stocker des informations sous la forme
Parametre = Valeur
• Avec Struts, ils sont chargés automatiquement en fonction de la langue préférée
définie dans le browser (elles sont définies par ordre de préférence => cf. Mozilla ou
IE).
• Si cette locale (le fichier .properties associé à cette langue) n‘est pas présente, c‘est
la suivante (dans l‘ordre des préférences ) qui est choisie, etc… Si aucune n‘est
présente, on utilise le fichier .properties par défaut.
• Exemple :
[Link] (fichier par défaut)
[Link]=Invalid promo entered.
MessageResources_fr.properties (fichier pour la locale _fr)
20
[Link]=La promo entrée est invalide.
Localisation : les fichiers properties
• Il en sera de même pour toutes les langues et vous aurez autant de
fichiers .properties que de langues que vous supporterez.
• Il vous faudra ensuite déclarer ces ressources dans le descripteur de
configuration de votre application ([Link]) :
<message-resources parameter="MessageResources" />
• Pour l’utiliser dans une JSP :
<bean:message key="[Link]"/>
20