WWW - Cours Gratuit - Com Id 10332

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 23

Java intensif

Programmation Web

Serge Rosmorduc

2013-2014

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 1 / 23


Première partie I

Compléments

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 2 / 23


Retour sur GET et POST

Usage correct de GET et POST :


GET :  bookmarkable , répétable, plus ou moins public :
particulièrement adapté pour la récupération d’information ;
POST : a priori non répétable, non bookmarkable : adapté pour la
modification d’information.
attention aux robots d’indexation : que ferait un robot sur une lien
comme
<a href="supprimer&id=6">detruire</a>

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 3 / 23


Post et redirection

Problème de répétition d’un POST lors d’un rechargement de


page : modification effectuée deux fois ?
Produit commandé deux fois au lieu d’une, par exemple...
Solution : la page qui affiche le résultat de l’exécution du POST ne
doit pas être celle qui l’a traité.
Utilisation de request.sendRedirect(...)

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 4 / 23


Exemple
1 @WebServlet ( name = ” Supprimer ” , u r l P a t t e r n s = { ” / supprimer ” } )
2 public 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 ( ) . supprimer ( i d ) ;
7 resp . s e n d R e d i r e c t ( ” messageSuppression& i d = ” + i d ) ;
8 }
9
0 }

On charge la page /supprimer, en passant en mode POST l’id


de l’élément à supprimer (par exemple 144) ;
on supprime l’élément 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à se contentera d’afficher à nouveau le
message.
Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 5 / 23
Deuxième partie II

Beans

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 6 / 23


Beans

Un bean est un objet d’une classe qui :


I dispose d’un constructeur par défaut (on peut parfois s’en passer) ;
I utilise des accesseurs ;
I est sérialisable (utile pour les beans sessions et application) ;
un bean a un nom et une portée ;
les beans permettent de partager de l’information entre servlets
(et jsps) ;
la portée décrit la durée de vie du bean :
I request : le bean est oublié à la fin de l’exécution de la requête
(communication entre servlet et jsp) ;
I session : le bean est lié à une session utilisateur avec un
navigateur particulier. Il est oublié au bout d’un certain temps, ou à
la fermeture du navigateur.
I application : le bean a une durée de vie qui est celle de
l’application elle-même en mémoire.

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 7 / 23


Beans Request
Permettent à une Servlet d’envoyer des données à une JSP.

Côté 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ôté JSP
Déclaration 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 :
1 ${monBean}

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 8 / 23


Beans Sessions

Permet de conserver des données durant toute la durée de la


connexion de l’utilisateur au site (termine lorsque le navigateur est
fermé).
les données de sessions sont typiquement conservées en
mémoire ;
utilisation : login d’utilisateur, panier à provisions, etc...
conservation de l’état de l’application pour l’utilisateur courant.
nécessite la création d’une session.

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 9 / 23


Beans Session, côté Servlet...
1 @WebServlet ( name = ” DemoCompteur ” , u r l P a t t e r n s = { ” / compteur ” } )
2 public 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 . getSession ( ) ;
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 ( ) ;
0 s e s s i o n . s e t A t t r i b u t e ( ” compteur ” , c p t ) ;
1 }
2 cpt . incrementer ( ) ;
3 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 ” )
4 . f o r w a r d ( req , resp ) ;
5 }
6 }

getSession() crée la session si elle n’existe pas ;


Variante de getSession avec un booléen comme argument :
crée la session uniquement si l’argument est à true.

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 10 / 23


Beans Session, le bean lui-même

1 public class Compteur implements S e r i a l i z a b l e {


2
3 private int valeur = 0;
4
5 public void i n c r e m e n t e r ( ) {
6 v a l e u r ++;
7 }
8
9 public i n t g e t V a l e u r ( ) {
0 return valeur ;
1 }
2 }

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 11 / 23


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>

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 12 / 23


Beans Application
Durée de vie : l’application ;
Usage : pour éviter de charger des données trop fréquemment
(catalogue de produits....) ;
Utilisation a priori en multitâche : délicate ;
utiliser avec précaution.
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 public 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 ( )
0 . s e t A t t r i b u t e ( ” cptApp ” , new Compteur ( ) ) ;
1 }
2 ...
3 }
4 }

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 13 / 23


Troisième partie III

Suppression du Java dans les JSP

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 14 / 23


Expression Language

Dans les JSP, écrites entre ${....}


L’opérateur  a.b  a des effets variés 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 :


1 p r i x TTC : ${ f a c t u r e . montant ∗ 19.6}

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 15 / 23


Expression Language (suite)
Opérateurs
empty : savoir si un bean est défini ou non. ${empty facture}
Leftrightarrow y-a-t-il un bean facture ?
opérateurs arithmétiques :+, -, *, /, % ;
opérateurs 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édéfinies
param : valeur des paramètres. À utiliser pour les paramètres
mono-valués ; par exemple ${param.nom}
paramValues : valeur des paramètres. À utiliser pour les paramètres
multi-valués (résultat de sélections multiples).
cookie : permet l’accès aux cookies.

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 16 / 23


JSTL

Java Standard Tags Library ;


jeu de tags pour remplacer la plupart des constructions java dans
les JSP ;
travaille de très près 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ébut du fichier jsp.


éventuellement ajouter la bibliothèque JSTL 1.1 à votre projet.

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 17 / 23


Comparez

Sans JSTL
1 <% 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 siteMarchand . d t o . L i g n e F a c t u r e l i g n e =
3 ( siteMarchand . 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 é : <%= l i g n e . g e t Q u a n t i t e ( ) %>
7 <%
8 }
9 %>

Avec JSTL
1 <c : forEach 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 é : ${ l i g n e . q u a n t i t e }</ l i >
3 </c : forEach>

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 18 / 23


Boucles en JSTL
boucle forEach.
Une variable dont le nom est donné par  var=  prend une série
de valeurs.
1 Parcours d ’ une l i s t e à p a r t i r de l ’ él ément numéro 4 :
2
3 <u l>
4 <c : forEach v a r = ” e ” i t e m s = ” ${ promotion } ” begin = ” 4 ”>
5 < l i > ${e} </ l i >
6 </c : forEach>
7 </ u l>
8
9 Parcours d ’ une map :
0 <u l>
1 <c : forEach v a r =” a ” i t e m s =” ${param}”>
2 < l i > ${a . key} : ${a . v a l u e }</ l i >
3 </c : forEach>
4 </ u l>
5
6 Num érique : a f f i c h e 0 3 6 9 12
7 <c : forEach v a r =” i ” begin = ” 0 ” end = ” 1 2 ” s t e p =”3” >
8 ${ i }
9 </c : forEach>

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 19 / 23


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 é 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 catalogue :
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 ésol é </c : o t h e r w i s e>
6 </c : choose>

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 20 / 23


Protection contre le XSS

Pourquoi : éviter les injections de Javascript.


le code
1 <h1> Message </h1> <p> ${message}</p>

est dangereux :
un utilisateur a entré 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é, exécuté, et le lecteur envoyé du le site


pirate : XSS (Cross Site Scripting).
solution : transformer les < et > en caractères normaux.

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 21 / 23


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 =&#034; J a v a s c r i p t &#034;& g t ;
3 document . l o c a t i o n . h r e f =&#034; h t t p : / / www. cnam . f r &#034; ;
4 & l t ; / SCRIPT&g t ;

Très laid à l’affichage, mais inoffensif.

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 22 / 23


Gestion d’utilisateur et identification

si l’utilisateur essaie de réaliser une tâche 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érifier la connexion, on regarde s’il y a un objet utilisateur
dans la session ;
déconnexion : on peut utiliser
session.removeAttribute("utilisateur") ;

Serge Rosmorduc () Java intensifProgrammation Web 2013-2014 23 / 23

Vous aimerez peut-être aussi