Professional Documents
Culture Documents
Architectures client/serveur
Master Technologies de l'Internet 1
re
anne
Eric Cariou
Universit de Pau et des Pays de l'Adour
UFR Sciences Pau Dpartement Informatique
Eric.Cariou@univ-pau.fr
2
Tryptique d'une application
ervices !tier
"ersistance
"rsentation
#
Tryptique d'une application
"rsentation
"ersistance
2ase de donnes
i!ple
...
4
Tryptique d'une application
ervices !tier
"artieapplicative
Trois parties
Modle centralis
3rchitecture 2 : tiers
3rchitecture # : tiers
"rsentation
Machine client
3pplicatif = !tier
erveur d'applications
"ersistance
3rchitecture # : tiers
Couche prsentation
Client lger
erveur d'applications
Couche persistance
3rchitecture n : tiers
Co!position horiJontale
Co!position verticale
curit.
Transaction
...
Inconvnients
Ialise par la &'I d'un client lourd * -outons. listes. !enus. ...
Hia interaction plus 8-asi$ue9 * for!ulaires. liens vers des 'I1s ...
1a logi$ue de prsentation
<oit donc e)cuter du code $ui rcupre les donnes retournes par les
services !tiers et gnre d%na!i$ue!ent du code GTM1
1ogi$ue de prsentation peut 5tre e)cute cot client ou cot serveur !ais
se fait gnrale!ent dans un tiers ? part cot serveur
14
Persistance
Couche de persistance
/ichiers 0M1
/onctionne!ent gnral
"rincipe gnral
1'outil fait en interne le lien avec le support ph%si$ue (&2<I ...+ considr
1>
ra!ewor"s globau#
erveur d'application
Technologies intgres
Transactions * PT3
Hersions li-res
Hersions d'diteurs
"articularit * !ulti-langage
Cot Pava. c'est le code Pava $ui tait converti en -%te code e)cut par
la !achine virtuelle Pava (PHM+
Technologies intgres
...
1C
Architecture 3/+ tiers, conte#te %2&&
1ogi$ue applicative
"rsentation
Client lourd
"rsentation
3pplicatif
"ro-l!es
1angages de scripts
"lus prcis!ent * les partie stati$ues e)istent !ais elles sont intgres
dans le code. pas crites directe!ent en GTM1 standard
E)e!ples de technologies
1angages de script
"G"
olutions Microsoft
E)cution de progra!!es
ervlet
"latefor!e d'e)cution
3pache To!cat
P". ervlet
1ogiciel li-re
Microsoft II
"ropritaire
2@
$ervlet
HttpServletRequest request
HttpServletResponse response
response.setContent%ype(&te"t'html(charset)*%+,-&)(
/rint0riter get0riter()
Servlet$utputStream get$utputStream
Ln peut lui associer des donnes via des couples 8cl (chaine+ = o-6et 9
"anier d'un utilisateur sur un site de vente en ligne * conserve les produits
choisis par l'utilisateur pendant son parcours sur le site
E)e!ple d'e)cution
3prs 4 charge!ents
de la servlet
co!pteur passe ? ;
#;
&#e!ple . servlet hello world
Code prcdent
Modification de processRequest()
tr' {
== rcupre la session associe au client
HttpSession session = request$/etSession(true);
== rcupre le co!pteur associ ? la session
"nte/er compteur = ("nte/er)session$/et9ttribute((compteur();
== si valeur null * attri-ut 8co!pteur9 n'e)iste pas. Sa signifie
== $ue c'est la pre!ire e)cution par le client. il faut crer le co!pteur
i8 (compteur==null) {
compteur = ne "nte/er(2);
session$set9ttribute((compteur(, compteur);
== configure pour $u'une session dure 1D secondes !a)
session$set:ax"nactive"nterval(20);
7
($$$)
out$println((0p13ombre d4appels 5 (6compteur6(0)p1();
($$$)
== incr!ente le co!pteur
session$set9ttribute((compteur(, ne "nte/er(compteur$int;alue()62));
#>
&#e!ple . passage de para!1tres
3utre e)e!ple
I!pl!entation
Eote * dans l'e)e!ple. c'est une page P" !ais c'est du GTM1
standard. aucun code Pava n'est inclus dans la page
ervlet
En prati$ue
"eut insrer plusieurs de ces -alises dans une !5!e page P"
"oint i!portant
568 ... 67
Ils seront glo-au) ? tous les appels de la P" pour tous les clients
56 ... 67
56) e"pr 67
E$uivalent de 56 out.print(e"pr) 67
4C
%$P . insertion de code %ava
I!pl!entation
"uis affiche via des 56) ... 67 les valeurs des co!pteurs
;1
&#e!ple . %$P hello world
5html7
5head7
5meta http,equiv)&Content,%ype& content)&te"t'html( charset)*%+,-&7
5title7<S/ Hello0orld5'title7
5'head7
5=ody7
5h37Hello 0orld85'h37
56
int n=>ocal ) ?(
67
568
int n=Glo=al ) ?(
void inc@=Glo=al() A n=Glo=alBB( C
67
56
n=>ocalBB(
inc@=Glo=al()(
67
5p7Compteur local 2 56) n=>ocal 67 5=r '7
Compteur glo=al 2 56) n=Glo=al 675'p7
5'=ody7
5'html7
!ode e"cut localement
!ode dclar glo#alement
$valuation de la valeur
des attri#uts
1gende couleur *
!ode %&'( statique
;2
&#e!ple . %$P hello world
E)e!ple d'e)cution
3prs 4 charge!ents de la servlet
co!pteur glo-al passe ? ;
!ais le local est s%st!ati$ue!ent ? 1
;#
&#e!ple . %$P hello world
1'attri-ut n=>ocal est local et n'est pas connu dans le code glo-al
;4
&#e!ple . %$P rectangle
ervlet
P"
"eut aussi vouloir avoir un tat glo-al ? toutes les pages P" ou
les servlets gres par le serveur GTT"
"er!et de dfinir des attri-uts co!!e pour une session. !ais co!!uns
? toutes les pages P" gres par le serveur GTT"
56
#nteger compteur ) (#nteger)application.getHttri=ute(&compteur&)(
if (compteur))null) A
'' on crIe le compteur qui n;e"istait pas
compteur ) ne #nteger(?)(
application.setHttri=ute(&compteur&, compteur)(
out.println(&5p7CrIation du compteur ...5'p7&)(
C
application.setHttri=ute(&compteur&, BBcompteur)(
out.println(&5p7Compteur glo=al 2 &BcompteurB&5'p7&)(
67
>#
5o!!unication inter6l!ents
ervlet
rd.forard(request, response)(
rd.include(request, response)(
"age P"
51sp2include page);;ma/age.1sp;;75'1sp2include7
51sp2forard page);;ma/age.1sp;;75'1sp2forard7
<ans les 2 cas. peut passer des para!tres ? la page appele via inclusion
<ans erreur.1sp
E)e!ple
Ln s'en sert pour !ettre une valeur par dfaut dans les cha!ps
d'entre des 4 valeurs de coordonnes
>C
7etour sur l'e#e!ple des rectangles
1'attri-ut rect vaut donc null et 56) rect.getX3() 67 lve une e)ception
3ttri-ut
E)e!ple * sessionScope.rectangle."3
Conte)te * sessionScope
3ttri-ut * rectangle
"roprit * "3
((Rectangle)sessionScope.getHttri=ute(;;rectangle;;)).getX3()
attPinde"Q
3vec inde) $ui est soit la cl pour une !ap. soit l'inde) pour un ta-leau
5p7
Fap ,7 &premier& 2 OAsessionScope.mapRectP&premier&Q."3C5=r '7
Fap ,7 ;second; 2 OAsessionScope.mapRectP;second;Q."3C5=r '7
Fap ,7 &troisieme& 2 OAsessionScope.mapRectP&troisieme&Q."3C5=r '7
Hrray ,7 ? 2 OAsessionScope.arrayRectP?Q."3C5=r '7
Hrray ,7 ;3; 2 OAsessionScope.arrayRectP;3;Q."3C5=r '7
Hrray ,7 4 2 OAsessionScope.arrayRectP4Q."3C5=r '7
Hrray ,7 inde" 2 OAsessionScope.arrayRectPsessionScope.inde"Q."3C5=r '7
5'p7
3ffichage rsultant
Fap ,7 &premier& 2 3?
Fap ,7 ;second; 2 .?
Fap ,7 &troisieme& 2
Hrray ,7 ? 2 3?
Hrray ,7 ;3; 2 .?
Hrray ,7 4 2
Hrray ,7 inde" 2 .?
Lprateurs logi$ues
Lprateurs de co!paraison
Lprateurs de calcul
<ivers
_ * choi) conditionnel
Choi) conditionnels
5c2choose7
5c2hen test);;condition1;;7 ... 5'c2hen7
5c2hen test);;condition2;;7 ... 5'c2hen7
...
5c2otherise7 ... 5'c2otherise7
5'c2choose7
@B
%$TL . core
E)e!ple
3ffichage rsultant
ervlet
"age P"
ervlet = P"
En prati$ue
1ogi$ue de prsentation
1ogi$ue !tier
"ur Pava
pu=lic /ersonne get/ersonne(int id) thros #nvalid#d!"ception A
'' si la personne n;e"iste pas, lLve e"ception
if ( 8 (personnes.containsWey(ne #nteger(id))))
thro ne #nvalid#d!"ception(&invalid inde" value 2 &Bid)(
'' sinon, retourne son identifiant
return (personnes.get(ne #nteger(id)))(
C
Cot 2<<
Cot Pava
olution
1e faire ? la !ain
"rincipes
Gi-ernate
Ta-le sport
code M
sport M intitule
,,,,,,6,,,,,,,,,,,
2 M athletisme
@ M sAi
F M natation
Ta-le discipline
code M M code
discipline M intitule M sport
,,,,,,,,,,,6,,,,,,,,,,,,,,,,,,6,,,,,,
2 M 200 metres M 2
@ M @00 metres M 2
F M saut en hauteur M 2
G M saut en lon/ueur M 2
N M 200m G na/es M F
O M 200m papillon M F
P M marathon M 2
C;
/ibernate . e#) con(iguration gnrale
Uhi-ernate-configurationW
Usession-factor%W
Upropert% na!eX^hi-ernate.dialect^Worg.hi-ernate.dialect.Lracle<ialectU=propert%W
Upropert% na!eX^hi-ernate.connection.driveraclass^Woracle.6d-c.Lracle<riverU=propert%W
Upropert% na!eX^hi-ernate.connection.url^W6d-c*oracle*thin*@scinfeDCC*1;21*etud1DU=propert%W
Upropert% na!eX^hi-ernate.connection.userna!e^WecariouU=propert%W
Upropert% na!eX^hi-ernate.connection.passFord^WtotoU=propert%W
Upropert% na!eX^hi-ernate.shoFas$l^WtrueU=propert%W
U!apping classX^data.port^ fileX^^ 6arX^^ pacMageX^^ resourceX^data=port.h-!.)!l^=W
U!apping classX^data.<iscipline^ fileX^^ 6arX^^ pacMageX^^ resourceX^data=<iscipline.h-!.)!l^=W
U=session-factor%W
U=hi-ernate-configurationW
Ln % trouve. nota!!ent
/ichier port.h-!.)!l
Uhi-ernate-!appingW
Uclass na!eX^data.port^ ta-leX^"LIT^ sche!aX^EC3IIL'^W
Uid na!eX^codeport^ t%peX^short^W
Ucolu!n na!eX^CL<Ea"LIT^ precisionX^4^ scaleX^D^ =W
Ugenerator classX^assigned^ =W
U=idW
Upropert% na!eX^intitule^ t%peX^string^W
Ucolu!n na!eX^IETIT'1E^ lengthX^2D^ =W
U=propert%W
Uset na!eX^disciplines^ inverseX^true^W
UMe%W
Ucolu!n na!eX^CL<Ea"LIT^ precisionX^4^ scaleX^D^ =W
U=Me%W
Uone-to-!an% classX^data.<iscipline^ =W
U=setW
U=classW
U=hi-ernate-!appingW
3 ,7 athletisme
3 ,7 3?? metres
4 ,7 4?? metres
[ ,7 marathon
V ,7 saut en longueur
. ,7 saut en hauteur
4 ,7 sKi
. ,7 natation
\ ,7 3??m papillon
] ,7 3??m V nages
"oint intressant
try A
'' ouvre la session et une transaction
session ) (ne Configuration().configure().=uildSession+actory()).openSession()(
trans ) session.=egin%ransaction()(
'' rIcupLre l;instance de sport correpondant Nnatation (requMte en HX>)
query ) session.createXuery(&select sport from Sport sport here sport.intitule);natation;&)(
'' a1out du relais V " 3?? dans le sport natation en rendant l;o=1et persistant
disc ) ne Jiscipline((short)-, sport, &relais V " 3??&)(
session.persist(disc)(
'' commit pour valider physiquement l;a1out
trans.commit()(
C catch (!"ception e) A
System.err.println(&!rreur Hi=ernate 2 & B e)(
'' pro=lLme 2 on annule la transaction
trans.roll=acK()(
C
session.close()(
1D#
/ibernate . e#) acc1s au# donnes
E). en LC1 *
conte"t Sportif def2 n=Jisciplines 2 int ) pratique ,7 siGe()
pratique(code_sporti%! code_discipline)
5hi=ernate,mapping7
5class name)&data.Sportif& ta=le)&sportif& catalog)&sports&7
Ici on dfinit un attri-ut adresse de classe Hdresse $ui contient les attri-uts
rue. code/ostal et ville !appant les colonnes $uivalentes dans la ta-le
sportif (la ta-le de la classe englo-lante+
Classe Sportif
Classe Jiscipline
Uone-to-oneW
'n vers un
Uone-to-!an%W
U!an%-to-oneW
U!an%-to-!an%W
2onne i!pl!entation
query.set/arameter(;;nom/aram;;, valeur)(
E)cution de la re$u5te
3ppel de list() sur l'o-6et re$u5te $ui retourne la liste des rsultats
3ttention T
#terator it ) query.iterate()(
....
1'tat de l'o-6et est li avec le contenu de la 2<< tant $ue la session e)iste
Modifier son contenu via l'appel des setters et autres accs au)
collections
Mthode refresh(o=1)
Collections
2alise 51oin7
Gritage
'ne ta-le par classe logi$ue (!apping pour la classe !re A !appings
pour les classes filles+
'ne ta-le par classe 8concrte9 (pas de !apping pour la classe !re+
12C
5oncurrence 9 per(or!ances
"erfor!ance
"our cha$ue sport. un autre E1ECT est e)cut pour rcuprer la liste des
disciplines $uand on % accde (au !o!ent du sport.getJisciplines()+
&estion de la concurrence
9!ntity
9%a=le(name ) &sport&)
9@amedXueries(A9@amedXuery(name ) &Sport.findHll&, query ) &S!>!C% s +R$F Sport s&),
9@amedXuery(name ) &Sport.find_yCodeSport&, query ) &S!>!C% s +R$F Sport s 0H!R!
s.codeSport ) 2codeSport&), 9@amedXuery(name ) &Sport.find_y#ntitule&, query ) &S!>!C% s
+R$F Sport s 0H!R! s.intitule ) 2intitule&)C)
pu=lic class Sport implements SerialiGa=le A
private static final long serial:ersion*#J ) 3>(
9#d
9_asic(optional ) false)
9Column(name ) &code^sport&)
private #nteger codeSport(
9Column(name ) &intitule&)
private String intitule(
9$ne%oFany(mapped_y ) &codeSport&)
private Collection5Jiscipline7 disciplines(
(...)
1#1
5onclusion sur /ibernate
http*==FFF.hi-ernate.org
http*==FFF.dil.univ-!rs.fr=e!assat=docs=hi-ernate-#.1=reference=fr=ht!l=inde).ht!l
http*==docs.6-oss.org=hi-ernate=core=#.#=reference=fr=ht!l=inde).ht!l
1ivre
"age afficherSports.1sp
5a href)&SportsUoperation)listeSportif& target)&operation&7
Hfficher la liste des sportifs5'a7
Code de SportServlet.1ava