8/7/2019 Java Edition Entreprise-2009_2010
1/114
Java EE
Java Edition Entreprise
8/7/2019 Java Edition Entreprise-2009_2010
2/114
Prsentation du cours
36h sur 12 semaines
Objectifs
Dveloppement dapplications Web robustesutilisation dun framework (standard)
Apprentissage dune partie de Java EEServlet, JSP et EJB
Prrequis
Matrise du langage Java (Java SE)
Matrise du dveloppement Web client XHTML (au moins balises de structure et formulaires)
CSS et XML sont un plus
8/7/2019 Java Edition Entreprise-2009_2010
3/114
Java EE?
Java Enterprise Edition est un framework riche (Java SE + nombreuses API)
ouvert (specs. du Java Community Process)
ddi au dveloppement, au dploiement et lexcutiondapplications Internet modernes (ncessaires auxentreprises)
Favorise la sparation des proccupations Code mtier vs. Proprits non-fonctionnellespersistance (JPA), administration (JMX), scurit,
transaction
(JTS/JTA),
8/7/2019 Java Edition Entreprise-2009_2010
4/114
Le dveloppement Web Le World Wide Web
Un SI public et universel dploy sur Internet Un langage : HTML (ou XHTML) Un modle de communication : client-serveur Un protocole : HTTP
Pages statiques Pages HTML prpares lavance
Le serveur renvoie les pages sans effectuer de traitementParticulier
Pages dynamiques Pages HTML gnres par le serveur Le serveur construit la rponse en fonction de la requte delutilisateur
8/7/2019 Java Edition Entreprise-2009_2010
5/114
Java et le dveloppement Web
Diffrentes technologies Java permettent defaire du
dveloppement Web diffrents niveaux.
DveloppementCt client Ct serveur
applet Servlet
JavaScript JSP
Pages statiques Pages dynamiques
Classe autonome
Java mix avecHTML
8/7/2019 Java Edition Entreprise-2009_2010
6/114
HTML (rappel)
Langage de balisage, non propritaire Conu pour afficher des documents sur le Web
Liens hypertextes possibles entre les documents
XHTML assure maintentant la compatibilit avec XML
Titre de mon document
...
8/7/2019 Java Edition Entreprise-2009_2010
7/114
Quelques balises
8/7/2019 Java Edition Entreprise-2009_2010
8/114
8/7/2019 Java Edition Entreprise-2009_2010
9/114
Limites dun serveur Web seul
Pas de contenu dynamique
Pas de sauvegarde de donnes sur le serveur
Traitemenent de formulaires : besoin dune application daide au serveur Web
pour valuer les paramtres reus
pour gnrer une rponse approprie
8/7/2019 Java Edition Entreprise-2009_2010
10/114
Pages dynamiques
Le serveur Web a besoin daide pour faire du dynamique
Autrefois, les CGI (Common Gateway Interface)
Aujourdhui, un conteneur Java EE avec servlets (ex :Tomcat)
8/7/2019 Java Edition Entreprise-2009_2010
11/114
Introduction aux servlets
8/7/2019 Java Edition Entreprise-2009_2010
12/114
Conteneur La notion de conteneur se retrouve dans de nombreuses
technologies Servlet, Applet, MIDlet, Xlet, (*-let), EJB,
Un conteneur est un composant logiciel systme qui contrledautres composants, dits mtier Tomcat est un exemple de conteneur
Les servlets nont pas de mthode main(), ils sont contrls par leconteneur
Tomcat
Les requtes ne sont pas adresses aux servlets mais au conteneurdans lequel ils sont
dploys
P i ?
8/7/2019 Java Edition Entreprise-2009_2010
13/114
Pourquoi un conteneur ?
Pour oublier le cours de rseau !
Un conteneur fournit pour les Servlets
Un support pour la communication Pas besoin de ServerSocket, Socket, Stream,
La gestion du cycle de vie
Un support pour le Multithreading
Cration automatique des Threads
Un support pour la scurit
Un support pour les JSP
Notion de module Web Un servlet ne peut pas tre dploy directement dans un
conteneur, il doit faire partie dun module Web Un module Web est un ensemble de librairies, de fichiers de
configurations, de code Java (bytecode des servlets),
Le module Web est lunit de dploiement dans le conteneur
8/7/2019 Java Edition Entreprise-2009_2010
14/114
Servlet en 4 tapes (1/4)
Projet
srcWebConten
t
WEB-
INF
Clock.java
Web.xml
Crer larborescence suivante
Impos parla spcificatides servlets
Dynamic web project
8/7/2019 Java Edition Entreprise-2009_2010
15/114
Servlet en 4 tapes (2/4)package ensat.cours.tp;
import java.io.*;
import javax.servlet.http.*;import javax.servlet.*;
public class Clock extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse reponse)
throws IOException, ServletException{
String title = "Clock";String doctype ="";
reponse.setContentType("text/html");
PrintWriter out = reponse.getWriter();
out.println(doctype +
""+title+""+"Time On Server"+"
"+
new java.util.Date() +"");
out.close();
}
}
Ecrire servlet Clock et le mettre danssrc
Redfinitionde la
mthodedoGet
Code
htmlincorpordans du
java
8/7/2019 Java Edition Entreprise-2009_2010
16/114
Servlet en 4 tapes (3/4)
WebModule1
index.html
The Clock
ensat.cours.tp.Clock
The Clock
/Serv1
Servlet-name permet de lieret
nom utilis parlutilisateur dans sa
requte
Crer un descripteur de dploiement etle mettre dans WEB-INF
8/7/2019 Java Edition Entreprise-2009_2010
17/114
Servlet en 4 tapes (4/4)
Dmarrer le serveur (Tomcat) Compiler la servlet
Lancer un navigateur et taper http://localhost:8080/Projet/Serv1
http://localhost:8080/Projet/Serv1http://localhost:8080/Projet/Serv18/7/2019 Java Edition Entreprise-2009_2010
18/114
C l d i d l t
8/7/2019 Java Edition Entreprise-2009_2010
19/114
Cycle de vie dun servlet
1. Chargement de la classe
2. Instanciation du servlet
constructeur par dfaut
3. Appel de init()
4. Appel(s) de service() 1 thread parrequte
5. Appel de destroy()
8/7/2019 Java Edition Entreprise-2009_2010
20/114
La mthode service() Lors de la rception dune requte, le conteneur cre
un objet ServletRequest (la requte), et
un objet ServletResponse (la rponse)
Le conteneur appelle ensuite la mthode service() avec ces deux objets en paramtres pourpermettre au servlet de rpondre la requte du client
Requtes HTTP (rappel) Deux mthodes principales : GET et POST
Servlets HTTP
8/7/2019 Java Edition Entreprise-2009_2010
21/114
Servlets HTTP
Requtes et Rponses HTTP
8/7/2019 Java Edition Entreprise-2009_2010
22/114
Requtes et Rponses HTTP
Enttes dune requte GET
8/7/2019 Java Edition Entreprise-2009_2010
23/114
Enttes d une requte GETpublic class ShowRequestHeaders extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
IOException {
//...
out.println(doctype +
"\n" + title + "\n" +
"\n" + title + "\n" +
"Request Method: " + request.getMethod() + "
\n" +
"Request URI: " + request.getRequestURI() + "
\n" +
"Request Protocol: " + request.getProtocol() + "
)
out.println("\n" +"Header NameHeader Value");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
out.println("" + headerName + "");
out.println("" + request.getHeader(headerName) +"");
}
out.println("\n");
out.close();
}}
h
8/7/2019 Java Edition Entreprise-2009_2010
24/114
changer
Enttes dune requte POST
8/7/2019 Java Edition Entreprise-2009_2010
25/114
Enttes d une requte POST
public class ShowRequestHeaders extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponseresponse) throws IOException {
doGet(request,response);
}
}
Formulaire GET
8/7/2019 Java Edition Entreprise-2009_2010
26/114
Formulaire GET
Nom: Prnom:
8/7/2019 Java Edition Entreprise-2009_2010
27/114
Traitement formulaire GET
public class LogServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException {
String login =request.getParameter("nom") ;String password =request.getParameter("prenom");
//WhatYouWantif (checkUserAndPassword(login, password)) {grantAccessTo(login);} else {
sendAuthentificationFailure(login);}
}
}
GET
Get http://localhost:8080/WebModule1/Serv2?nom=houda&prenom=Belmokadem HTTP/1.1
host:localhost:8080user-agent:Mozilla/4.0accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*accept-language:fr
...
F l i POST
8/7/2019 Java Edition Entreprise-2009_2010
28/114
Formulaire POST
Nom: Prnom:
8/7/2019 Java Edition Entreprise-2009_2010
29/114
Traitement formulaire Post
public class LogServlet extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse
response) throws IOException {doGet(request, reponse);
}
}
GET
Post http://localhost:8080/WebModule1/Serv2 HTTP/1.1host:localhost:8080
user-agent:Mozilla/4.0accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*accept-language:fr...
content-type:application/x-www-form-urlencodedcontent-length:27
Paramtres de formulaires
8/7/2019 Java Edition Entreprise-2009_2010
30/114
Paramtres de formulairespublic class ParametresFormulaire extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse reponse) throws IOException,ServletException{
out.println(doctype+ ""+title+""+ "");
Enumeration paramtres = request.getParameterNames();
if(!paramtres.hasMoreElements())
out.println("il n'existe pas de paramtre dans la requte du client" +"+");
else{
out.println(request.getQueryString()+
"
ParamtreValeur");
while(paramtres.hasMoreElements()){String param = (String) paramtres.nextElement();
out.println(""+param+"");
String[] paramValues = request.getParameterValues(param);
for(int i=0; i
8/7/2019 Java Edition Entreprise-2009_2010
31/114
Vrification de donnesmanquantes
Champ manquant dans le formulaire
getParameter retourne null
Champ renvoy vide
getParameter retourne une chaine vide (ou une chaine avec desespacements)
String param = request.getParameter("someName");
if ((param == null) || (param.trim().equals(""))) {
doSomethingForMissingValues(...);
} else {
doSomethingWithParameter(param);
}
8/7/2019 Java Edition Entreprise-2009_2010
32/114
8/7/2019 Java Edition Entreprise-2009_2010
33/114
Exemple : Upload simple ()
//Tlcharger un fichier txt et lafficher dans la rponse de la servlet
if ( ServletFileUpload.isMultipartContent(request) ) {
// create a factory for disk-based (large) file items
FileItemFactory fileItemFactory = new DiskFileItemFactory() ;
((DiskFileItemFactory) fileItemFactory).setSizeThreshold(40960); //the unit isbytes
// create a new file upload handler
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
servletFileUpload.setSizeMax(81920); // the unit is bytes
8/7/2019 Java Edition Entreprise-2009_2010
34/114
Rponse HTTP (rappel)
8/7/2019 Java Edition Entreprise-2009_2010
35/114
Rponse HTTP (rappel)
Une rponse HTTP peut contenir du HTML
HTTP rajoute des (meta)informations en entte du contenu de la
rponse
Status Codes
8/7/2019 Java Edition Entreprise-2009_2010
36/114
Status Codes
response.setStatus(int statusCode)
Utiliser les constantes, pas dentiers directement
Noms drivs du message standard Ex : SC_OK, SC_NOT_FOUND, etc
response.sendError(int code, String msg) Englobe le message dans un petit document HTML
response.sendRedirect(String url)
Le code de status est alors 301 Lattribut Location est galement gnr dans
lentte de la rponse
8/7/2019 Java Edition Entreprise-2009_2010
37/114
Exemple sendErrorpublic class LogServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {String login = request.getParameter("param1") ;
String password = request.getParameter("param2") ;
if ((login == null) || (login.trim().equals(""))) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,champslogin
vide");
return;
}
if (checkUserAndPassword(login, password)) {
grantAccessTo(login);
} else {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, accsrefuser
au compte" + login);
}
}
}
Exemple sendRedirect
8/7/2019 Java Edition Entreprise-2009_2010
38/114
Exemple sendRedirectpublic class WrongDestination extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse
response)throws ServletException, IOException {
String userAgent = request.getHeader("User-Agent");
if ((userAgent != null) &&(userAgent.contains("MSIE")) {
response.sendRedirect("http://home.netscape.com");
}
else {
response.sendRedirect("http://www.microsoft.com");
}
}
}
Mme URL de dpart ensuite une redirection ...
Gnrer un fichier Excel
8/7/2019 Java Edition Entreprise-2009_2010
39/114
Gnrer un fichier Excel
public class FichierExcel extends HttpServlet {
public void doGet(HttpServletRequest requete, HttpServletResponse
reponse) throws IOException,ServletException{reponse.setContentType("application/vnd.ms-excel");
PrintWriter out = reponse.getWriter();
out.println("\tQ1\tQ2\tQ3\tQ4\tTotal");
out.println("Apples\t78\t87\t92\t29\t=SOMME(B2:E2)");
out.println("Oranges\t77\t86\t93\t30\t=SOMME(B3:E3)");
}
}
8/7/2019 Java Edition Entreprise-2009_2010
40/114
TP: introductions auxServlets
8/7/2019 Java Edition Entreprise-2009_2010
41/114
JSP: Java Server Pages
Introduction aux JSP
Problme : HTML dans Java
8/7/2019 Java Edition Entreprise-2009_2010
42/114
Problme : HTML dans Java Cest laid !
out.println(docType);out.println("");
out.println("\nClock\n");
out.println("\n" +
"Time on server\n" +
"
" + today + "
\n" +"");
out.println("");
Les ingnieurs connaissent Java, mais lesdveloppeurs Web, NON !!
Difficile de sparer les diffrentes tches dudveloppement(code Web vs. code mtier)
Solution : Java dans HTML
8/7/2019 Java Edition Entreprise-2009_2010
43/114
Solution : Java dans HTML
Une JSP est identique une page HTML sauf
que lon peut rajouter du Java dedans
Clock
Time on server
8/7/2019 Java Edition Entreprise-2009_2010
44/114
8/7/2019 Java Edition Entreprise-2009_2010
45/114
Cycle de vie dune JSP
8/7/2019 Java Edition Entreprise-2009_2010
46/114
Cycle de vie d une JSP
Correspondance JSP/Servlet
8/7/2019 Java Edition Entreprise-2009_2010
47/114
Correspondance JSP/Servlet JSP dorigine
Servlet gnre par Tomcat $ECLIPSEWORKDIR\.metadata\.plugins\org.eclipse.wst.server.core\tmpX\
work\Catalina\localhost\MonProjet\org\apache\jsp
Stratgie de conception :
8/7/2019 Java Edition Entreprise-2009_2010
48/114
Stratgie de conception :Limiter le code Java dans les JSP
Deux options Ecrire 25 lignes de code directement dans une JSP
Ecrire ces 25 lignes dans une classe Java part et1 ligne dansune JSP
pour linvoquer
Pourquoi la 2e option est vraiment meilleure ? Dveloppement. Ecriture de la classe dans un environnement
Java et pas HTML
Dbogage. Sil y a des erreurs, elles sont visibles lacompilation
Test. Laccs la classe Java facilite le test
Rutilisation. Utilisation de la mme classe dans diffrentespages JSP
Syntaxe de base
8/7/2019 Java Edition Entreprise-2009_2010
49/114
Syntaxe de base
Texte HTML
Blah
Pass au client. Rellement traduit en servlet par le codeout.print("Blah");
Commentaires HTML
Pareil que les autres lments HTML : passs au client Commentaires JSP
Ne sont pas envoys au client
Pour obtenir
8/7/2019 Java Edition Entreprise-2009_2010
50/114
Types des lments de scripts Expressions
Format :
Evalue et insre dans la sortie du servlet se traduit parout.print(expression)
Scriptlets Format :
Insr tel quel dans la mthode _jspService du servlet
(appele parservice)
Dclarations Format :
Insre telle quelle dans le corps de la classe servlet, en
dehors
de toute mthode existante
Syntaxe XMLVoir la fin des transparents pour la compatibilit avec XML
8/7/2019 Java Edition Entreprise-2009_2010
51/114
Expressions JSP
8/7/2019 Java Edition Entreprise-2009_2010
52/114
Expressions JSP
Format
Rsultat Expression value, convertie en String, et place dans la page
HTML la place quelle occupe dans la JSP Lexpression est place dans _jspService en paramtre du
out.print()
Exemples Heure courante : Hostname:
Syntaxe compatible XML Java Expression
On ne peut pas mixer les deux versions dans une mme page. Ilfaut
utiliser XML pour la page entire si on utilise jsp:expression (Voir
les
Correspondance JSP/Servlet
8/7/2019 Java Edition Entreprise-2009_2010
53/114
Correspondance JSP/Servlet
JSP dorigine
Un nombre alatoire
Code du servlet rsultant de la traduction
public void _jspService(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {response.setContentType("text/html");JspWriter out = response.getWriter();out.println("Un nombre alatoire");
out.println(Math.random());...}
Expressions JSP : Exemple
8/7/2019 Java Edition Entreprise-2009_2010
54/114
Expressions JSP : Exemple
JSP Expressions
Current time: Server: The testParam form parameter:
8/7/2019 Java Edition Entreprise-2009_2010
55/114
Exemple : Lire 3 paramtres (JSP)
8/7/2019 Java Edition Entreprise-2009_2010
56/114
Exemple : Lire 3 paramtres (JSP)
Reading Three Request Parameters
Reading Three Request Parameters
param1:
param2:
param3:
8/7/2019 Java Edition Entreprise-2009_2010
57/114
Scriptlets JSP
8/7/2019 Java Edition Entreprise-2009_2010
58/114
p Format
Rsultat
Code insr tel quel dans _jspService()
Exemple
Syntaxe XML
Code Java
8/7/2019 Java Edition Entreprise-2009_2010
59/114
Scriptlets JSP: Exemple
8/7/2019 Java Edition Entreprise-2009_2010
60/114
p p On veut permettre lutilisateurde choisir la couleur de fond de la page
HTML
Color Testing
Testing a Background of "".
Utilisation des scriptlets pour
8/7/2019 Java Edition Entreprise-2009_2010
61/114
p pcrer des parties conditionnelles Postulat
Les scriplets sont insrs tels quels dans le servlet Pas besoin davoirdes expressions Java compltes Cependant, les expressions compltes sont la plupart du temps plus
claires et faciles
maintenir
Exemple
Vous avez gagn !
Vous avez perdu !
Code du servlet rsultant de la traductionif (Math.random() < 0.5) {out.println("Vous avez gagn !");
} else {
out.println("Vous avez perdu !");}
8/7/2019 Java Edition Entreprise-2009_2010
62/114
Dclaration JSP
8/7/2019 Java Edition Entreprise-2009_2010
63/114
Correspondance JSP/Servlet
8/7/2019 Java Edition Entreprise-2009_2010
64/114
p
JSP dorigine
Some Heading
(Alternative : crer randomHeading en mthode
statique dansune classe Java spare)
Correspondance JSP/Servlet
8/7/2019 Java Edition Entreprise-2009_2010
65/114
p Code du servlet rsultant de la traduction
public class MyJSP_jsp implements HttpJspPage {private String randomHeading() {return("" + Math.random() + "");}
public void _jspService(HttpServletRequest request,HttpServletResponse
response) throws ServletException, IOException {response.setContentType("text/html");HttpSession session = request.getSession();JspWriter out = response.getWriter();out.println("Some Heading");out.println(randomHeading());
}
}
Dclarations JSP : Exemple
8/7/2019 Java Edition Entreprise-2009_2010
66/114
p
JSP Declarations
JSP Declarations
Accesses to page since server reboot:
Mthodes jspInit et jspDestroy
8/7/2019 Java Edition Entreprise-2009_2010
67/114
j p j p y
Les mthodes jspInit() and jspDestroy() sont dfinir par lauteurde la page JSP, contrairement la mthode _jspService() qui est gnreautomatiquement par le conteneur.
jspDestroy() est excut la fin de cycle de laJSP.
jspInit() est excut lors du premier appel de laJSP.
La servlet auto-gnre garantie que ces deuxmthodes seront appeles depuis init et destroy.
Dclarations JSP et variables
8/7/2019 Java Edition Entreprise-2009_2010
68/114
prdfinies Rq1: Problme
Les variables prdfines (request, response, out, session,etc.)sont locales la mthode _jspService.Ainsi, elles ne sont pas disponibles pour les mthodes dfinies
pardes dclarations JSP et les mthodes des classes externes.
Que peut-on faire ? Solution : les passer en paramtres. Ex :
Rq 2 : println de JSPWriter lance une IOException Utiliser throws IOException pour les mthodes qui utilisent
println
8/7/2019 Java Edition Entreprise-2009_2010
69/114
Lattribut import
8/7/2019 Java Edition Entreprise-2009_2010
70/114
p
Format
But
Gnrer les instructions dimportation
RemarqueBien que les pages JSP peuvent tre nimporte o sur le
serveur, les classes
utilises par les pages JSP doivent tre dans le rpertoire desclasses de
lapplication Web
Cest--dire : /WEB-INF/classes
Les attributs contentType et
8/7/2019 Java Edition Entreprise-2009_2010
71/114
y pageEncoding
Format
But
Spcifier le type MIME de la page gnre par le servletrsultant de la page JSP
8/7/2019 Java Edition Entreprise-2009_2010
72/114
Intgration
des servlets et des JSP :
Application du design pattern
Model-View-Controller (MVC)
Pourquoi combiner Servlets & JSP?
8/7/2019 Java Edition Entreprise-2009_2010
73/114
Classiquement : utilisation des JSP pour faciliter ledveloppement et la maintenance du contenu HTML
Pour du code dynamique simple, appel du codedun servlet
partir de scripts JSP
Pour des applications un peu plus complexes,utilisation de
classes appeles partir de scripts JSP
Mais a nest pas suffisant Pour des traitements complexes, dmarrer avec
des JSP nest
pas pratique du tout
ourquo com ner erv ets
8/7/2019 Java Edition Entreprise-2009_2010
74/114
Servlet seuls. Marche bien quand : Loutput est de type binaire. Ex : une image
Il ny a pas doutput. Ex : redirections
La forme/prsentation est variable. Ex : portail
JSP seules. Marche bien quand : Loutput est de type caractre. Ex : HTML
La forme/prsentation est stable.
Architecture MVC. Ncessaire qd: Une mme requte peut donner des rsultats visuels
rellement
diffrents
On dispose dune quipe de dveloppementconsquente avec
une partie pour le dev. Web et une autre pour la logiquemtier
On a un traitement complexe des donnes mais uneprsentation relativement fixe.
Design-pattern: MVC
8/7/2019 Java Edition Entreprise-2009_2010
75/114
Design-pattern: MVC
MVC model 2:Application dans le
8/7/2019 Java Edition Entreprise-2009_2010
76/114
cadre dInternet
Exemple: liste de promotion
8/7/2019 Java Edition Entreprise-2009_2010
77/114
Exemple: liste de promotion
MVC : tape 1
8/7/2019 Java Edition Entreprise-2009_2010
78/114
Le client rcupre un formulaire (form.html) pourpasser une requte avec paramtres (1, 2 puis3).
Formulaire : form.html
8/7/2019 Java Edition Entreprise-2009_2010
79/114
L'cole virtuelle de L'ENSAT
Slectionner la promo afficherinfo3gstr3gsea3
MVC : tape 2
8/7/2019 Java Edition Entreprise-2009_2010
80/114
1. Le client envoie son formulaire (GET/POST avec paramtres)
2. Le conteneur transmet au servlet correspondant (le controller)
Controller : SelectPromo.java
8/7/2019 Java Edition Entreprise-2009_2010
81/114
import javax.servlet.http.HttpServletResponse;
import ensat.cours.logiquemetier.Promo;
public class SelectPromo extends HttpServlet {
public void doGet(HttpServletRequest re,HttpServletResponse pe)
throws IOException, ServletException{
...String param = re.getParameter("promo");
...
}
}
MVC : tape 3
8/7/2019 Java Edition Entreprise-2009_2010
82/114
3. La servlet controller interroge le model sur info3
4. Le model retourne au controller le rsultatcorrespondant
Model: une classe Java
8/7/2019 Java Edition Entreprise-2009_2010
83/114
public class Promo {
public List getPromo(String param){
List reponse = new ArrayList();
if(param.equals("info3")){
reponse.add("Houda");
reponse.add("Rachida");
}
else if(param.equals("gsea3")){reponse.add("Saida");
reponse.add("Ahmed");
}
else
reponse = null;return reponse;
}
}
8/7/2019 Java Edition Entreprise-2009_2010
84/114
Controller : SelectPromo.java
8/7/2019 Java Edition Entreprise-2009_2010
85/114
String param = request.getParameter("fonction");//Promo retourn la liste correpondante au controleur
Promo ob = new Promo();
List list = ob.getPromo(param);
System.out.println(" " + (list == null));
//construit la requte puis l'envoie la vue
request.setAttribute("liste", list);
request.getRequestDispatcher("reponse.jsp").forward(request,reponse);
8/7/2019 Java Edition Entreprise-2009_2010
86/114
View: resultat.jsp
8/7/2019 Java Edition Entreprise-2009_2010
87/114
j p
8/7/2019 Java Edition Entreprise-2009_2010
88/114
Architecture Web JEE: model2
8/7/2019 Java Edition Entreprise-2009_2010
89/114
(MVC)
Relation indirecte
Architecture Web JEE: model1
8/7/2019 Java Edition Entreprise-2009_2010
90/114
(pas MVC)
JavaBeans ?
8/7/2019 Java Edition Entreprise-2009_2010
91/114
Les JavaBeans sont des classes Java (POJO) quisuivent certaines conventions :
Doivent avoir un constructeur vide (zero argument) On peut satisfaire cette contrainte soit en dfinissantexplicitement un tel
constructeur, soit en ne spcifiant aucun constructeur
Ne doivent pas avoir dattributs publics
Une bonne pratique rutilisable par ailleurs La valeur des attributs doit tre manipule travers des
mthodes getXxx et setXxx Si une classe possde une mthode getTitle qui retourne une
String, on dit que le bean possde une proprit String nomme
title Les proprits Boolean utilisent isXxx la place de getXxx
Rfrence sur les beans, cf.http://java.sun.com/beans/docs/
Pourquoi faut-il utiliser des?
8/7/2019 Java Edition Entreprise-2009_2010
92/114
accesseurs ? Dans un bean, on ne peut pas avoir de champs
publics
Donc, il faut remplacerpublic String prenom;
parprivate String prenom;
public String getPrenom () {
return(prenom);
}
public void setprenom (String prenom) {This.prenom = prenom ;
}
Pourquoi faut-il faire cela pour tout code Java ?
ourquo aut- ut ser esaccesseurs ?
8/7/2019 Java Edition Entreprise-2009_2010
93/114
accesseurs ?1. On peut imposer des contraintes sur les donnes
2. On peut rajouter du code annexe
public void setPrenom(String prenom) {
this.prenom = prenom.substring(0, 1).toUpperCase()
+ prenom.substring(1, prenom.length()).toLowerCase();
enregistrerBD();
}
3. On peut changer de reprsentation interne sans changer dinterface
public void setPrenom(String prenom) {
this.prenom = prenom.toUpperCase()enregistrerBD();
}
t sat on as que es eans
8/7/2019 Java Edition Entreprise-2009_2010
94/114
jsp:useBean Cet lment permet de rendre un JavaBean accessible
dans la page JSP.
Utilisation :
jsp:setProperty Cet lment modifie une proprit dun bean (i.e., appel
dune mthode setXxx).
Utilisation :
jsp:getProperty
Cet lment lit et retourne la valeur dune proprit dunbean.Utilisation :
Approche gnrale avec des JSPet les tags jsp:useBean
8/7/2019 Java Edition Entreprise-2009_2010
95/114
et les tags jsp:useBean
Dans les pages JSP, il est toujours trs difficile de lire
le mlange la fois de code HTML et de code Java. Lapproche la plus judicieuse est d'utiliser une
criture plus proche du HTML en utilisant la syntaxedu XML tout en faisant rfrence, malgr tout, desclasses Java.Ex:
Le webmaster s'occuperait alors des balises mettreen place sur ces diffrentes pages Web dynamiques,alors que le dveloppeur s'occuperait essentiellementde mettre en place toutes les classes ncessaires l'application Web.
LesJavaBeanspermettent de composer une structureparticulire sur ces classes respectant un schmasstandard afin qu'ils puissent tre utiliss par lewebmaster au moyen de balises spcifiques etdoncsans code Java.
Approche gnrale avec des JSPet les tags jsp:useBean
8/7/2019 Java Edition Entreprise-2009_2010
96/114
et les tags jsp:useBean
Lutilisateursoumet un formulaire vers une JSP
La page JSP instancie un bean
On passe des donnes de la requte au bean
On affiche des valeurs issues des donnes de larequte
8/7/2019 Java Edition Entreprise-2009_2010
97/114
o cat on e propr t s e ean :jsp:setProperty
8/7/2019 Java Edition Entreprise-2009_2010
98/114
jsp:setProperty Format
But
Permettre de modifier les proprites dun bean
properties (i.e.,appel de mthodes setXxx) sans programmation
Java explicite
Remarques
est quivalent au scriptlet :
8/7/2019 Java Edition Entreprise-2009_2010
99/114
jsp:getProperty Format
But Permettre daccderproprits dun bean (i.e., appel
de mthodes getXxx) sans programmation Javaexplicite
Remarques
est quivalent lexpression JSP :
Exemple dutilisation: tape 1
8/7/2019 Java Edition Entreprise-2009_2010
100/114
package serverbeans;
public class StringBean {private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
Les Beans doivent tre dploys dans le mme rpertoire
que les autresclasses Java
WEB-INF/classes/serverbeans
Les Beans doivent toujours tre dans des packages !
Exemple dutilisation: tape 2
8/7/2019 Java Edition Entreprise-2009_2010
101/114
Initial value (from jsp:getProperty):
8/7/2019 Java Edition Entreprise-2009_2010
102/114
jsp:setProperty (cas1) :conversion explicite & affectation (type int)
8/7/2019 Java Edition Entreprise-2009_2010
103/114
conversion explicite & affectation (type int)
8/7/2019 Java Edition Entreprise-2009_2010
104/114
conversion explicite & affectation (type double)
8/7/2019 Java Edition Entreprise-2009_2010
105/114
association proprit/paramtre Utilisation de lattribut param de jsp:setProperty
On indique que la valeur doit provenir du paramtrede requte spcifi
Une conversion automatique de type est oprepour les valeurs de types standardboolean, Boolean, byte, Byte, char, Character, double,
Double, int, Integer,
float, Float, long, ou Long.
jsp:setProperty (cas2) :association proprit/paramtre
8/7/2019 Java Edition Entreprise-2009_2010
106/114
association proprit/paramtre
...
...
jsp:setProperty (cas3) : associertoutes les proprits aux paramtres
8/7/2019 Java Edition Entreprise-2009_2010
107/114
toutes les proprits aux paramtres Utilisation de "*" pour la valeur de lattribut property de
jsp:setProperty
On indique que la valeur doit provenir des paramtres de requtequi correspondent aux noms des proprits
Un conversion automatique de type est galement opre
Particulirement pratique pour raliser des Beans formulaires -- objets dont les proprits sont remplies par les donnes dunformulaire
Ce processus peut mme tre dcompos entre diffrentsformulaires, chaque soumission remplissant une partie de lobjet
Implmentation du MVC avecRequestDispatcher
8/7/2019 Java Edition Entreprise-2009_2010
108/114
q p
1. Dfinir les beans pour reprsenter les donnes
2. Utiliser une servlet pour grer les requtes La servlet lit les paramtres de requtes, vrifie les
donnes
manquantes ou malformes, appelle le code mtier, etc.
3. Crer les beans La servlet invoque le code mtier (spcifique
lapplication) ou
accde une base de donnes pour obtenir lesrsultats. Les rsultats
sont dans les beans dfinis ltape 1
4. Placer le bean dans la requte, la session, ou leservlet context
La servlet appelle setAttribute sur la requte, la
session, ou le
Implmentation du MVC avecRequestDispatcher
8/7/2019 Java Edition Entreprise-2009_2010
109/114
RequestDispatcher5. Transmettre la requte la JSP (forward)
La servlet dtermine quelle JSP est approprie lasituation et
utilise la mthode forward du RequestDispatcherpour
transfrer le contrle la JSP
6. Extraire les donnes des beans JSP 1.2: la JSP accde aux beans avec
jsp:useBean et lattribut
scope correspondant au choix de ltape 4. La JSP
utiliseensuite jsp:getProperty pour afficher les proprits
des beans
JSP 2.0: la JSP utilise
${nameFromServlet.property} pour
Utilisation de jsp:useBean : MVC
8/7/2019 Java Edition Entreprise-2009_2010
110/114
La JSP ne doit pas crer les objets
La servlet, pas la JSP, doit crer tous les objets-
donnes. Donc,pour guarantir quune JSP ne crera pas dobjets, il
faut utiliser
au lieu de
La JSP ne doit pas modifier les objets Il faut donc utiliser jsp:getProperty mais pasjsp:setProperty.
8/7/2019 Java Edition Entreprise-2009_2010
111/114
Exemple : Partage de donnes surrequte
8/7/2019 Java Edition Entreprise-2009_2010
112/114
requte
ServletValueObject value = new ValueObject(...);
request.setAttribute("key", value);
RequestDispatcher dispatcher =
request.getRequestDispatcher("SomePage.jsp");
dispatcher.forward(request, response); JSP 1.2
JSP 2.0
${key.someProperty}
Partage de donnes sur requte :exemple simple
8/7/2019 Java Edition Entreprise-2009_2010
113/114
exemple simple Servlet
Customer myCustomer = newCustomer(request.getParameter("customerID"));
request.setAttribute("customer", myCustomer);
RequestDispatcher dispatcher =
request.getRequestDispatcher("SomePage.jsp");
dispatcher.forward(request, response);
JSP 1.2
JSP 2.0
${customer.firstName}
8/7/2019 Java Edition Entreprise-2009_2010
114/114
Top Related