Java intensif
Programmation Web
Serge Rosmorduc
Premi `ere partie I
Retour sur GET et POST
Usage correct de GET et POST :
GET :bookmarkable, r ´ep ´etable, plus ou moins public :
particuli `erement adapt ´e pour la r ´ecup ´eration d’information ; POST : a priori non r ´ep ´etable, non bookmarkable : adapt ´e pour la modification d’information.
attention aux robots d’indexation : que ferait un robot sur une lien comme
Post et redirection
Probl `eme de r ´ep ´etition d’un POST lors d’un rechargement de page : modification effectu ´ee deux fois ?
Produit command ´e deux fois au lieu d’une, par exemple...
Solution : la page qui affiche le r ´esultat de l’ex ´ecution du POST ne doit pas ˆetre celle qui l’a trait ´e.
Exemple
1 @WebServlet ( name = ” Supprimer ” , u r l P a t t e r n s = { ” / s u p p r i m e r ” } ) 2 p ub li c class S u p p r i m e r P r o d u i t extends H t t p S e r v l e t {
3 @Override
4 protected void doPost ( . . . ) {
5 i n t i d = I n t e g e r . p a r s e I n t ( req . getParameter ( ” i d ” ) ) ; 6 BaseDeDonnee . g e t I n s t a n c e ( ) . s u p p r i m e r ( i d ) ; 7 resp . s e n d R e d i r e c t ( ” messageSuppression& i d = ” + i d ) ; 8 } 9 10 }
On charge la page /supprimer, en passant en mode POST l’id de l’ ´el ´ement `a supprimer (par exemple 144) ;
on supprime l’ ´el ´ement 144 ;
la servlet envoie une redirection : elle demande au navigateur client de charger (en mode GET) une nouvelle page,
/messageSuppression&id=144, qui affichera un message confirmant la suppression.
recharger cette page l `a se contentera d’afficher `a nouveau le message.
Deuxi `eme partie II
Beans
Un bean est un objet d’une classe qui :
I dispose d’un constructeur par d ´efaut (on peut parfois s’en passer) ; I utilise des accesseurs ;
I est s ´erialisable (utile pour les beans sessions et application) ;
un bean a un nom et une port ´ee ;
les beans permettent de partager de l’information entre servlets (et jsps) ;
la port ´ee d ´ecrit la dur ´ee de vie du bean :
I request: le bean est oubli ´e `a la fin de l’ex ´ecution de la requ ˆete (communication entre servlet et jsp) ;
I session: le bean est li ´e `a une session utilisateur avec un
navigateur particulier. Il est oubli ´e au bout d’un certain temps, ou `a la fermeture du navigateur.
I application: le bean a une dur ´ee de vie qui est celle de l’application elle-m ˆeme en m ´emoire.
Beans Request
Permettent `a une Servlet d’envoyer des donn ´ees `a une JSP.
C ˆot ´e Servlet
1 S t r i n g nomBean= . . . ; 2 O b j e c t valeurBean = . . . ;
3 r e q u e s t . s e t A t t r i b u t e ( nomBean , valeurBean ) ;
C ˆot ´e JSP
D ´eclaration optionnelle :
1 <j s p : useBean i d = ” monBean ” class= ” S t r i n g ” scope= ” r e q u e s t ” />
Accessible comme variable monBean dans le code java ou par l’expression language :
Beans Sessions
Permet de conserver des donn ´ees durant toute la dur ´ee de la connexion de l’utilisateur au site (termine lorsque le navigateur est ferm ´e).
les donn ´ees de sessions sont typiquement conserv ´ees en m ´emoire ;
utilisation : login d’utilisateur, panier `a provisions, etc...
conservation de l’ ´etat de l’application pour l’utilisateur courant. n ´ecessite la cr ´eation d’une session.
Beans Session, c ˆot ´e Servlet...
1 @WebServlet ( name = ” DemoCompteur ” , u r l P a t t e r n s = { ” / compteur ” } ) 2 p ub li c class DemoCompteur extends H t t p S e r v l e t {
3
4 @Override
5 protected void doGet ( . . . ) {
6 H t t p S e s s i o n s e s s i o n = req . g e t S e s s i o n ( ) ;
7 Compteur c p t = ( Compteur ) s e s s i o n . g e t A t t r i b u t e ( ” compteur ” ) ; 8 i f ( c p t == n u l l ) {
9 c p t = new Compteur ( ) ;
10 s e s s i o n . s e t A t t r i b u t e ( ” compteur ” , c p t ) ;
11 }
12 c p t . i n c r e m e n t e r ( ) ;
13 req . g e t R e q u e s t D i s p a t c h e r ( ” /WEB−INF / j s p / compteur . j s p ” )
14 . f o r w a r d ( req , resp ) ;
15 }
16 }
getSession()cr ´ee la session si elle n’existe pas ;
Variante de getSession avec un bool ´een comme argument : cr ´ee la session uniquement si l’argument est `a true.
Beans Session, le bean lui-m ˆeme
1 p ub li c class Compteur implements S e r i a l i z a b l e {
2 3 p r i v a t e i n t v a l e u r = 0 ; 4 5 p ub li c void i n c r e m e n t e r ( ) { 6 v a l e u r ++; 7 } 8 9 p ub li c i n t g e t V a l e u r ( ) { 10 r e t u r n v a l e u r ; 11 } 12 }
Beans Session, JSP
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <t i t l e >JSP Page</ t i t l e > 5 </head> 6 <body> 7 <h1>Compteur ${ compteur . v a l e u r } </h1> 8 </body> 9 </ html>Beans Application
Dur ´ee de vie : l’application ;
Usage : pour ´eviter de charger des donn ´ees trop fr ´equemment (catalogue de produits....) ;
Utilisation a priori en multit ˆache : d ´elicate ; utiliser avec pr ´ecaution.
1 @WebServlet ( name = ” CApp ” , u r l P a t t e r n s = { ” / c o m p t e u r A p p l i c a t i o n ” } ) 2 p ub li c class C o m p t e u r A p p l i c a t i o n extends H t t p S e r v l e t {
3
4 @Override
5 protected void doGet ( . . . ) {
6 Compteur c p t = ( Compteur )
7 req . g e t S e r v l e t C o n t e x t ( ) . g e t A t t r i b u t e ( ” cptApp ” ) ; 8 i f ( c p t == n u l l ) {
9 req . g e t S e r v l e t C o n t e x t ( )
10 . s e t A t t r i b u t e ( ” cptApp ” , new Compteur ( ) ) ;
11 }
12 . . .
13 }
Troisi `eme partie III
Expression Language
Dans les JSP, ´ecrites entre ${....}
L’op ´erateura.ba des effets vari ´es selon le type de a.
I si a est une Map, a.b ⇔ a.get(b) I si a est un objet, a.b ⇔ a.getB()
I si a est un tableau a.b ⇔ a[b] (ex. ${tab.3}
On peut utiliser.en cascade :
1 <p> rue ${ f a c t u r e . adresse . rue } . . . .
Le langage d’expression est aussi utilisable pour des calculs :
Expression Language (suite)
Op ´erateursempty: savoir si un bean est d ´efini ou non. ${empty facture}
Leftrightarrow y-a-t-il un bean facture ? op ´erateurs arithm ´etiques :+, -, *, /, % ; op ´erateurs logiques : and, or, not ;
comparaisons : eq (equal), ne (not equal), lt (less than), gt (greater than), ge (greater or equal), le (lesser or equal)
variables pr ´ed ´efinies
param : valeur des param `etres. `A utiliser pour les param `etres mono-valu ´es ; par exemple ${param.nom}
paramValues : valeur des param `etres. `A utiliser pour les param `etres multi-valu ´es (r ´esultat de s ´elections multiples).
JSTL
Java Standard Tags Library ;
jeu de tags pour remplacer la plupart des constructions java dans les JSP ;
travaille de tr `es pr `es avec l’expression language. Utilisation : mettre la ligne
1 <%@ t a g l i b p r e f i x = ” c ” u r i = ” h t t p : / / j a v a . sun . com / j s p / j s t l / core ” %>
vers le d ´ebut du fichier jsp.
Comparez
Sans JSTL1 <% f o r ( i n t i = 0 ; i < f a c t u r e . g e t L i g n e s ( ) . s i z e ( ) ; i ++) { 2 sit eMarch and . d t o . L i g n e F a c t u r e l i g n e =
3 ( si teMarc hand . d t o . L i g n e F a c t u r e ) f a c t u r e . g e t L i g n e s ( ) . g e t ( i ) ; 4 %> 5 <l i > <%= l i g n e . g e t A r t i c l e ( ) . g e t D e s i g n a t i o n ( ) %>, 6 q t ´e : <%= l i g n e . g e t Q u a n t i t e ( ) %> 7 <% 8 } 9 %> Avec JSTL 1 <c : f o r E a c h v a r = ” l i g n e ” i t e m s = ” ${ f a c t u r e . l i g n e s } ”> 2 <l i > ${ l i g n e . a r t i c l e . d e s i g n a t i o n } , q t ´e : ${ l i g n e . q u a n t i t e }</ l i > 3 </c : forEach>
Boucles en JSTL
boucle forEach.
Une variable dont le nom est donn ´e parvar=prend une s ´erie
de valeurs.
1 Parcours d ’ une l i s t e `a p a r t i r de l ’ ´el ´ement num ´ero 4 : 2 3 <u l > 4 <c : f o r E a c h v a r = ” e ” i t e m s = ” ${ p r o m o t i o n } ” beg in = ” 4 ”> 5 <l i > ${e} </ l i > 6 </c : forEach> 7 </ u l > 8
9 Parcours d ’ une map : 10 <u l >
11 <c : f o r E a c h v a r = ” a ” i t e m s = ” ${param}”> 12 <l i > ${a . key } : ${a . v a l u e }</ l i > 13 </c : forEach> 14 </ u l > 15 16 Num ´erique : a f f i c h e 0 3 6 9 12 17 <c : f o r E a c h v a r = ” i ” be gin = ” 0 ” end = ” 1 2 ” s t e p =”3” > 18 ${ i } 19 </c : forEach>
Test en JSTL
If (sans else) 1 <!−− A f f i c h e r s i l e bean ” c a t a l o g u e ” e s t p r ´e s e n t −−> 2 <c :i f t e s t = ” ${ n o t empty c a t a l o g u e } ”> 3 V o i c i l e c a t a l o g u e : 4 . . . 5 </c :i f > choose/when/otherwise Test complet : 1 <c : choose> 2 <c : when t e s t = ” ${ s e c u r i t e eq ’ a d m i n i s t r a t e u r ’ } ”> . . . </c : when> 3 <c : when t e s t = ” ${ s e c u r i t e eq ’ u t i l i s a t e u r ’ } ”> . . . </c : when> 4 <c : when t e s t = ” ${ s e c u r i t e eq ’ i n v i t e ’ } ”> . . . </c : when> 5 <c : o t h e r w i s e> D ´esol ´e </c : o t h e r w i s e>Protection contre le XSS
Pourquoi : ´eviter les injections de Javascript. le code
1 <h1> Message </h1> <p> ${message}</p>
est dangereux :
un utilisateur a entr ´e comme message :
1 <SCRIPT language= ” J a v a s c r i p t ”>
2 document . l o c a t i o n . h r e f = ” h t t p : / / s i t e P i r a t e . com ” 3 </SCRIPT>
le javascript est charg ´e, ex ´ecut ´e, et le lecteur envoy ´e du le site pirate : XSS (Cross Site Scripting).
Protection contre le XSS
Solution : la balise <c:out value="..."> le code devient
1 <h1> Message </h1> <p> <c : o u t v a l u e = ” ${message} ” /></p>
sortie :
1 <h1> Message </h1>
2 & l t ; SCRIPT language =" J a v a s c r i p t "& g t ;
3 document . l o c a t i o n . h r e f =" h t t p : / / www. cnam . f r " ; 4 & l t ; / SCRIPT&g t ;
Gestion d’utilisateur et identification
si l’utilisateur essaie de r ´ealiser une t ˆache interdite, on l’envoie sur le formulaire de login ;
lors du login, si le couple login/password est correct, on place l’objet utilisateur en session ;
pour v ´erifier la connexion, on regarde s’il y a un objet utilisateur dans la session ;
d ´econnexion : on peut utiliser