Vous êtes sur la page 1sur 192

Dveloppement WEB avec ASP.NET 1.

1
- Volume 1 -
serge.tahe@sta.unv-angers.!r
avrl "##$
Anne%es 1&1'"
(ntro)ucton
*e )ocument est un support )e cours + ce n,est pas un cours complet. Des appro!on)ssements ncesstent l,a)e ),un ensegnant et
par alleurs un certan nom-re )e th.mes n,ont pas t a-or)s. Son crture a t n!luence par le pass )e l,auteur /u avat crt
auparavant )eu% )ocuments sur le )veloppement 0e-1 en 2ava tout ),a-or) pus en P3P. *es )eu% )ocuments ont une structure
analogue permettant )e comparer les )eu% technologes sur les m4mes e%emples. (l a t c !at )e m4me pour le )veloppement en
ASP.NET. *ela )onne un )ocument asse5 )!!rent )e ce /u,on trouve en l-rare o6 /uasment tous les lvres nsstent sur le !at
/u,ASP.NET permet )e )velopper une applcaton 0e- comme on )veloppe une applcaton 0n)o0s. 7,nter!ace /u est
prsente )ans le navgateur )u clent peut 4tre construte comme une nter!ace 0n)o0s +
avec )es (DE tels /ue Vsual Stu)o.NET ou We-8atr%1 l,nter!ace utlsateur est construte avec )es o-9ets graph/ues
/ue l,on )pose )ans la !en4tre )e concepton
ces o-9ets ont )es proprts1 mtho)es et gn.rent )es vnements
(c1 on )t le strct mnmum sur ces concepts cons)rs comme les plus novateurs )e ASP.NET... *es concepts mportants mas
non !on)amentau% sont prsents )ans le volume " )e ce cours. Dans ce volume 11 l a sem-l plus mportant ),nsster sur les
!on)ements )u )veloppement 0e- /u,on retrouvera /uel/ue sot la technologe utlse :2ava1 P3P1 ASP.NET;. 7es e%tensons
proprtares )e ASP.NET /u permettent une melleure pro)uctvt seront vues ultreurement. Nous nsstons -eaucoup )ans
notre prsentaton )u )veloppement 0e- sur l,archtecture 8V* :8o).le1 Vue1 *ontr<leur; souvent prconse pour construre
)es applcatons 0e-. *e concept est n)pen)ant )e la technologe utlse. (l se trouve /u,l ca)re mal avec celu )e concevor une
applcaton 0e- comme une applcaton 0n)o0s prcons par la technologe ASP.NET. *,est l,autre rason /u a !at /ue ce
concept tant vant )ans la lttrature ASP.NET a t relgu )ans le volume ".
Parce /ue ce )ocument est )estn = )es tu)ants1 nous n,utlsons pour nos e%emples /ue )es outls l-rement )spon-les sur
nternet. 7e lecteur pourra ans se les procurer et tester les e%emples sur sa machne personnelle. 7,anne%e >7es outls )u 0e->
)onne )es n)catons pour rcuprer et nstaller ces outls.
*e )ocument comporte peut-4tre encore )es erreurs + toute suggeston constructve est la -envenue = l,a)resse serge.tahe@istia.univ-
angers.fr.
Serge Tah
Avrl "##$
Anne%es "&1'"
1 Les bases
Dans ce chaptre1 nous prsentons les -ases )e la programmaton We-. (l a pour -ut essentel )e !are )couvrr les gran)s
prncpes )e la programmaton We- /u sont n)pen)ants )e la technologe partcul.re utlse pour les mettre en oeuvre. (l
prsente )e nom-reu% e%emples /u,l est consell )e tester a!n )e >s,mprgner> peu = peu )e la phlosophe )u )veloppement
0e-. 7es outls gratuts ncessares = leurs tests sont prsents en !n )e )ocument )ans l,anne%e nttule >7es outls )u 0e->.
1.1Les composantes d'une application Web
Numro Rle Exemples courants
1
?S Serveur 7nu%1 Wn)o0s
2
Serveur We- Apache :7nu%1 Wn)o0s;
((S :NT;1 PWS:Wn'%;1 *assn
:Wn)o0s@plate-!orme .NET;
3
Scrpts e%cuts c<t serveur. (ls peuvent l,4tre par )es mo)ules )u serveur
ou par )es programmes e%ternes au serveur :*A(;.
PEB7 :Apache1 ((S1 PWS;
VBS*B(PT :((S1PWS;
2AVAS*B(PT :((S1PWS;
P3P :Apache1 ((S1 PWS;
2AVA :Apache1 ((S1 PWS;
*C1 VB.NET :((S;
4
Base )e )onnes - *elle-c peut 4tre sur la m4me machne /ue le programme
/u l,e%plote ou sur une autre va (nternet.
?racle :7nu%1 Wn)o0s;
8DSE7 :7nu%1 Wn)o0s;
Postgres :7nu%1 Wn)o0s;
Access :Wn)o0s;
SE7 Server :Wn)o0s;
5
?S *lent 7nu%1 Wn)o0s
6
Navgateur We- Netscape1 (nternet E%plorer1 8o5lla1
?pera
7
Scrpts e%cuts c<t clent au sen )u navgateur. Ces scripts n'ont aucun
accs aux disques du poste client.
VBscrpt :(E;
2avascrpt :(E1 Netscape;
Perlscrpt :(E;
7es -ases F&1'"
8achne *lente
Page WEB
Scrpts
Navgateur
1
"
F
$ G
H
I
Base )e
)onnes
$
rseau
8achne J
8achne Serveur
Base )e
)onnes
serveur 0e-
Ktlsateur
rseau
Scrpts
Serveur
navgateur
Applets 2AVA
1.1 Les chanes de donnes dans une application !eb a"ec #ormulaire
Numro Rle
1
7e navgateur )eman)e une KB7 pour la 1.re !os (http://machine/url). Auncun param.tre n,est pass.
2
7e serveur We- lu envoe la page We- )e cette KB7. Elle peut 4tre stat/ue ou -en )Dnam/uement gnre par un
scrpt serveur :SA; /u a pu utlser le contenu )e -ases )e )onnes :SB1 S*;. (c1 le scrpt )tectera /ue l,KB7 a t
)eman)e sans passage )e param.tres et gn.rera la page WEB ntale.
7e navgateur reLot la page et l,a!!che :*A;. Des scrpts c<t navgateur :*B; ont pu mo)!er la page ntale envoDe
par le serveur. Ensute par )es nteractons entre l,utlsateur :*D; et les scrpts :*B; la page We- va 4tre mo)!e. 7es
!ormulares vont notamment 4tre rempls.
3
7,utlsateur val)e les )onnes )u !ormulare /u )ovent alors 4tre envoDes au serveur 0e-. 7e navgateur re)eman)e
l,KB7 ntale ou une autre selon les cas et transmet en m4me temps au serveur les valeurs )u !ormulare. (l peut utlser
pour ce !are )eu% mtho)es appeles AET et P?ST. A rcepton )e la )eman)e )u clent1 le serveur )clenche le
scrpt :SA; assoc = l,KB7 )eman)e1 scrpt /u va )tecter les param.tres et les trater.
4
7e serveur )lvre la page WEB construte par programme :SA1 SB1 S*;. *ette tape est )ent/ue = l,tape "
prc)ente. 7es changes se !ont )sormas selon les tapes " et F.
1.$ Notations
Dans la sute1 nous supposerons /u,un certan nom-re ),outls ont t nstalls et a)opterons les notatons suvantes +
notation sini#ication
<apache>
racne )e l,ar-orescence )u serveur apache
<apache-DocumentRoot>
racne )es pages We- )lvres par Apache. *,est sous cette racne /ue )ovent se trouver les pages
We-. Ans l,KB7 http://localhost/page1.htm correspon) au !cher <apache-DocumentRoot>\page1.htm.
<apache-cgi-bin>
racne )e l,ar-orescence l = l,alas cgi-bin et o6 l,on peut placer )es scrpts *A( pour Apache. Ans
7es -ases $&1'"
%achine &er"eur
Base )e
)onnes
serveur
0e-
Scrpts
Serveur
%achine Cliente
Page WEB
navgateur
Scrpts
Navgateur
Base )e
)onnes
8achne J
"
utlsateur
*A
*B
*D
F
$
SA
SB
S*
1
l,KB7 http://localhost/cgi-bin/test1.pl correspon) au !cher <apache-cgi-bin>\test1.pl.
<IIS-DocumentRoot>
racne )es pages We- )lvres par ((S1 PWS ou *assn. *,est sous cette racne /ue )ovent se trouver
les pages We-. Ans l,KB7 http://localhost/page1.htm correspon) au !cher <!-
DocumentRoot>\page1.htm.
<perl>
racne )e l,ar-orescence )u langage Perl. 7,e%cuta-le perl.e"e se trouve en gnral )ans <perl>\bin.
<php>
racne )e l,ar-orescence )u langage P3P. 7,e%cuta-le php.e"e se trouve en gnral )ans <php>.
<java>
racne )e l,ar-orescence )e 9ava. 7es e%cuta-les ls = 9ava se trouvent )ans <#ava>\bin.
<tomcat>
racne )u serveur Tomcat. ?n trouve )es e%emples )e servlets )ans <tomcat>\$ebapps\e"amples\servlets
et )es e%emples )e pages 2SP )ans <tomcat>\$ebbapps\e"amples\#sp
?n se reportera pour chacun )e ces outls = l,anne%e /u )onne une a)e pour leur nstallaton.
1.' (aes Web statiques) (aes Web d*namiques
Kne page stat/ue est reprsente par un !cher 3T87. Kne page )Dnam/ue est1 elle1 gnre >= la vole> par le serveur 0e-.
Nous vous proposons )ans ce paragraphe )vers tests avec )!!rents serveurs 0e- et )!!rents langages )e programmaton a!n )e
montrer l,unversalt )u concept 0e-. Nous utlserons )eu% serveurs 0e- nots Apache et ((S. S ((S est un pro)ut commercal1 l
est cepen)ant )cln en )eu% versons plus lmtes mas gratutes +
PWS pour les machnes Wn'%
*assn pour les machnes Wn)o0s "### et JP
7e )osser M((S-DocumentBootN est ha-tuellement le )osser Olecteur+Pnetpu-P000rootQ o6 OlecteurQ est le )s/ue :*1 D1 ...; o6 a
t nstall ((S. (l en est )e m4me pour PWS. Pour *assn1 le )osser M((S-DocumentBootN )pen) )e la !aLon )ont le serveur a
t lanc. Dans l,anne%e1 l est montr /ue le serveur *assn peut 4tre lanc )ans une !en4tre Dos :ou par un raccourc; )e la !aLon
suvante +
dos>webserver /port:N /path:"P" /vpath:"/V"
7,applcaton OWe-ServerQ appele galement serveur 0e- *assn a)met tros param.tres +
+port + nR )e port )u servce 0e-. Peut-4tre /uelcon/ue. A par )!aut la valeur S#
&path + chemn phDs/ue ),un )osser )u )s/ue
&"path + )osser vrtuel assoc au )osser phDs/ue prc)ent. ?n pr4tera attenton au !at /ue la sDnta%e n,est pas
&pathTchemn mas &vpath+chemn1 contrarement = ce /ue )t le panneau ),a)e )e *assn.
S *assn est lanc )e la !aLon suvante +
dos>webserver /port:N /path:"P" /vpath:"/"
alors le )osser P est la racne )e l,ar-orescence 0e- )u serveur *assn. *,est )onc ce )osser /u est )sgn par M((S-
DocumentBootN. Ans )ans l,e%emple suvant +
dos>webserver /path:"d:\data\devel\webmatrix" /vpath:"/"
le serveur *assn travallera sur le port S# et la racne )e son ar-orescence M((S-DocumentBootN est le )osser
O)+P)ataP)evelP0e-matr%Q. 7es pages We- = tester )evront se trouver sous cette racne.
Dans la sute1 cha/ue applcaton 0e- sera reprsente par un un/ue !cher /u,on pourra construre avec n,mporte /uel )teur )e
te%te. Aucun (DE n,est re/us.
1.3.1 Page statique HTML (HyperText Markup Language)
*ons)rons le co)e 3T87 suvant +
<html>
<head>
<title>essai 1 : une page statique</title>
</head>
<body>
<center>
<h1>Une page statique...</h1>
</body>
7es -ases H&1'"
</html>
/u pro)ut la page 0e- suvante +
7es tests
- lancer le serveur Apache
- mettre le scrpt essai1.html )ans <apache-DocumentRoot>
- vsualser lUKB7 http://localhost/essai1.html avec un navgateur
- arr4ter le serveur Apache
- lancer le serveur ((S&PWS&*assn
- mettre le scrpt essai1.html )ans <!-DocumentRoot>
- vsualser lUKB7 http://localhost/essai1.html avec un navgateur
1.3.2 Une page ASP (Active Server Pages)
7e scrpt essa".asp +
<html>
<head>
<title>essai 1 : une page asp</title>
</head>
<body>
<center>
<h1>Une page asp gnre dynamiquement par le serveur PWS</h1>
<h2>Il est <% =time %></h2>
<br>
A chaque fois que vous rafrachissez la page, l'heure change.
</body>
</html>
pro)ut la page 0e- suvante +
7e test
- lancer le serveur ((S&PWS
- mettre le scrpt essai&.asp )ans <!-DocumentRoot>
- )eman)er lUKB7 http://localhost/essai&.asp avec un navgateur
1.3.3 Un script P!L (Practica" xtracting an# !ep$rting Language)
7e scrpt essaF.pl +
#!d:\perl\bin\perl.exe
($secondes,$minutes,$heure)=localtime(time);
print <<HTML
Content-type: text/html
7es -ases I&1'"
<html>
<head>
<title>essai 1 : un script Perl</title>
</head>
<body>
<center>
<h1>Une page gnre dynamiquement par un script Perl</h1>
<h2>Il est $heure:$minutes:$secondes</h2>
<br>
A chaque fois que vous rafrachissez la page, l'heure change.
</body>
</html>
HTML
;
7a prem.re lgne est le chemn )e l,e%cuta-le perl.e"e. (l !aut l,a)apter s -eson est. Kne !os e%cut par un serveur We-1 le scrpt
pro)ut la page suvante +
7e test
- serveur We- + Apache
- pour n!ormaton1 vsualse5 le !cher )e con!guraton srm.conf ou http'.conf selon la verson ),Apache )ans <apache>\confs et
rechercher la lgne parlant )e cgi-bin a!n )e connaVtre le rpertore <apache-cgi-bin> )ans le/uel placer essai(.pl.
- mettre le scrpt essai(.pl )ans <apache-cgi-bin>
- )eman)er lUurl http://localhost/cgi-bin/essai(.pl
A noter /uUl !aut )avantage )e temps pour avor la page perl /ue la page asp. *ec parce /ue le scrpt Perl est e%cut par un
nterprteur Perl /uUl !aut charger avant /uUl pusse e%cuter le scrpt. (l ne reste pas en permanence en mmore.
1.3.% Un script PHP (HyperText Pr$cess$r)
7e scrpt essa$.php
<html>
<head>
<title>essai 4 : une page php</title>
</head>
<body>
<center>
<h1>Une page PHP gnre dynamiquement</h1>
<h2>
<?
$maintenant=time();
echo date("j/m/y, h:i:s",$maintenant);
?>
</h2>
<br>
A chaque fois que vous rafrachissez la page, l'heure change.
</body>
</html>
7e scrpt prc)ent pro)ut la page 0e- suvante +
7es -ases G&1'"
7es tests
- consulter le !cher )e con!guraton srm.conf ou http'.conf ),Apache )ans <)pache>\confs
- pour n!ormaton1 vr!er les lgnes )e con!guraton )e php
- lancer le serveur Apache
- mettre essai*.php )ans <apache-DocumentRoot>
- )eman)er lUKB7 http://localhost/essai*.php
- lancer le serveur ((S&PWS
- pour n!ormaton1 vr!er la con!guraton )e PWS = propos )e php
- mettre essai*.php )ans <!-DocumentRoot>\php
- )eman)er l,KB7 http://localhost/essai*.php
1.3.& Un script 'SP ('ava Server Pages)
7e scrpt heure.9sp
<% //programme Java affichant l'heure %>
<%@ page import="java.util.*" %>
<%
// code JAVA pour calculer l'heure
Calendar calendrier=Calendar.getInstance();
int heures=calendrier.get(Calendar.HOUR_OF_DAY);
int minutes=calendrier.get(Calendar.MINUTE);
int secondes=calendrier.get(Calendar.SECOND);
// heures, minutes, secondes sont des variables globales
// qui pourront tre utilises dans le code HTML
%>
<% // code HTML %>
<html>
<head>
<title>Page JSP affichant l'heure</title>
</head>
<body>
<center>
<h1>Une page JSP gnre dynamiquement</h1>
<h2>Il est <%=heures%>:<%=minutes%>:<%=secondes%></h2>
<br>
<h3>A chaque fois que vous rechargez la page, l'heure change</h3>
</body>
</html>
Kne !os e%cut par le serveur 0e-1 ce scrpt pro)ut la page suvante +
7es -ases S&1'"
7es tests
mettre le scrpt heure.#sp )ans <tomcat>\#a+arta-tomcat\$ebapps\e"amples\#sp :Tomcat F.%; ou )ans <tomcat>\$ebapps\e"amples\#sp
:Tomcat $.%;
lancer le serveur Tomcat
)eman)er l,KB7 http://localhost:,-,-/e"amples/#sp/heure.#sp
1.3.( Une page ASP.)T
7e scrpt heure1.asp% +
<html>
<head>
<title>Dmo asp.net </title>
</head>
<body>
Il est <% =Date.Now.ToString("hh:mm:ss") %>
</body>
</html>
Kne !os e%cut par le serveur 0e-1 ce scrpt pro)ut la page suvante +
*e test ncesste ),avor une machne 0n)o0s o6 la plate-!orme .NET a t nstalle :c! anne%e;.
mettre le scrpt heure1.asp" )ans <!-DocumentRoot>
lancer le serveur ((S&*ASS(N(
)eman)er l,KB7 http://localhost/heure1.asp"
1.3.* +$nc"usi$n
7es e%emples prc)ents ont montr /ue +
une page 3T87 pouvat 4tre gnre )Dnam/uement par un programme. *,est tout le sens )e la programmaton We-.
/ue les langages et les serveurs 0e- utlss pouvaent 4tre )vers. Actuellement on o-serve les gran)es ten)ances suvantes
+
o les tan)ems Apache&P3P :Wn)o0s1 7nu%; et ((S&P3P :Wn)o0s;
o la technologe ASP.NET sur les plate-!ormes Wn)o0s /u assocent le serveur ((S = un langage .NET :*C1
VB.NET1 ...;
o la technologe )es servlets 2ava et pages 2SP !onctonnant avec )!!rents serveurs :Tomcat1 Apache1 ((S; et sur
)!!rentes plate-!ormes :Wn)o0s1 7nu%;.
1., &cripts ct na"iateur
Kne page 3T87 peut contenr )es scrpts /u seront e%cuts par le navgateur. 7es langages )e scrpt c<t navgateur sont
nom-reu%. En voc /uel/ues-uns +
Lanae Na"iateurs utilisables
V-scrpt (E
2avascrpt (E1 Netscape
PerlScrpt (E
2ava (E1 Netscape
Prenons /uel/ues e%emples.
7es -ases '&1'"
1.%.1 Une page ,e- avec un script .-script/ c0t1 navigateur
7a page v-s1.html
<html>
<head>
<title>essai : une page web avec un script vb</title>
<script language="vbscript">
function reagir
alert "Vous avez cliqu sur le bouton OK"
end function
</script>
</head>

<body>
<center>
<h1>Une page Web avec un script VB</h1>
<table>
<tr>
<td>Cliquez sur le bouton</td>
<td><input type="button" value="OK" name="cmdOK" onclic="reagir"></td>
</tr>
</table>
</body>
</html>
7a page 3T87 c-)essus ne content pas smplement )u co)e 3T87 mas galement un programme )estn = 4tre e%cut par le
navgateur /u aura charg cette page. 7e co)e est le suvant +
<script language="vbscript">
function reagir
alert "Vous avez cliqu sur le bouton OK"
end function
</script>
7es -alses <script></script> servent = )lmter les scrpts )ans la page 3T87. *es scrpts peuvent 4tre crts )ans )!!rents
langages et c,est l,opton language )e la -alse <script> /u n)/ue le langage utls. (c c,est VBScrpt. Nous ne chercherons pas =
)taller ce langage. 7e scrpt c-)essus )!nt une !oncton appele r.agir /u a!!che un message. Euan) cette !oncton est-elle
appele W *,est la lgne )e co)e 3T87 suvante /u nous l,n)/ue +
<input type="button" value="OK" name="cmdOK" onclick="reagir">
7,attr-ut onclic+ n)/ue le nom )e la !oncton = appeler lors/ue l,utlsateur cl/uera sur le -outon ?X. 7ors/ue le navgateur aura
charg cette page et /ue l,utlsateur cl/uera sur le -outon ?X1 on aura la page suvante +
7es tests
Seul le navgateur (E est capa-le ),e%cuter )es scrpts VBScrpt. Netscape ncesste )es complments logcels pour le !are. ?n
pourra !are les tests suvants +
- serveur Apache
- scrpt vbs1.html )ans <apache-DocumentRoot>
- )eman)er lUurl http://localhost/vbs1.html avec le navgateur (E
- serveur ((S&PWS
7es -ases 1#&1'"
- scrpt vbs1.html )ans <p$s-DocumentRoot>
- )eman)er lUurl http://localhost/vbs1.html avec le navgateur (E
1.%.2 Une page ,e- avec un script 'avascript/ c0t1 navigateur
7a page + 9s1.html
<html>
<head>
<title>essai 4 : une page web avec un script Javascript</title>
<script language="!avascript">
function reagir"#$
alert ""Vous avez cliqu sur le bouton OK"#%
&
</script>
</head>

<body>
<center>
<h1>Une page Web avec un script Javascript</h1>
<table>
<tr>
<td>Cliquez sur le bouton</td>
<td><input type="button" value="OK" name="cmdOK" onclic="reagir"#"></td>
</tr>
</table>
</body>
</html>
?n a l= /uel/ue chose ),)ent/ue = la page prc)ente s ce n,est /u,on a remplac le langage VBScrpt par le langage 2avascrpt.
*elu-c prsente l,avantage ),4tre accept par les )eu% navgateurs (E et Netscape. Son e%cuton )onne les m4mes rsultats +
7es tests
- serveur Apache
- scrpt #s1.html )ans <apache-DocumentRoot>
- )eman)er lUurl http://localhost/#s1.html avec le navgateur (E ou Netscape
- serveur ((S&PWS
- scrpt #s1.html )ans <p$s-DocumentRoot>
- )eman)er lUurl http://localhost/#s1.html avec le navgateur (E ou Netscape
1.- Les chanes client.ser"eur
Bevenons = notre schma )e )part /u llustrat les acteurs ),une applcaton 0e- +
7es -ases 11&1'"
Nous nous ntressons c au% changes entre la machne clente et la machne serveur. *eu%-c se !ont au travers ),un rseau et l
est -on )e rappeler la structure gnrale )es changes entre )eu% machnes )stantes.
1.&.1 Le 2$#3"e 4S5
7e mo).le )e rseau ouvert appel /&0 :/pen &Dstems 0nterconnecton Be!erence 8o)el; )!n par l,0&/ :0nternatonal
&tan)ar)s /rgansaton; )crt un rseau )al o6 la communcaton entre machnes peut 4tre reprsente par un mo).le = sept
couches +
|-------------------------------------|
7 | Application |
|-------------------------------------|
6 | Prsentation |
|-------------------------------------|
5 | Session |
|-------------------------------------|
4 | Transport |
|-------------------------------------|
3 | Rseau |
|-------------------------------------|
2 | Liaison |
|-------------------------------------|
1 | Physique |
|-------------------------------------|
*ha/ue couche reLot )es servces )e la couche n!reure et o!!re les sens = la couche supreure. Supposons /ue )eu% applcatons
stues sur )es machnes A et B )!!rentes veulent commun/uer + elles le !ont au nveau )e la couche )pplication. Elles n,ont pas
-eson )e connaVtre tous les )tals )u !onctonnement )u rseau + cha/ue applcaton remet l,n!ormaton /u,elle souhate
transmettre = la couche )u )essous + la couche /r.sentation. 7,applcaton n,a )onc = connaVtre /ue les r.gles ),nter!aLage avec la
couche /r.sentation. Kne !os l,n!ormaton )ans la couche /r.sentation1 elle est passe selon ),autres r.gles = la couche !ession et ans
)e sute1 9us/u,= ce /ue l,n!ormaton arrve sur le support phDs/ue et sot transmse phDs/uement = la machne )estnaton. 7=1 elle
su-ra le tratement nverse )e celu /u,elle a su- sur la machne e%p)teur.
A cha/ue couche1 le processus e%p)teur charg ),envoDer l,n!ormaton1 l,envoe = un processus rcepteur sur l,autre machne
apartenant = la m4me couche /ue lu. (l le !at selon certanes r.gles /ue l,on appelle le protocole )e la couche. ?n a )onc le
schma )e communcaton !nal suvant +
7es -ases 1"&1'"
8achne Serveur
Base )e
)onnes
serveur 0e-
rseau
Scrpts
Serveur
8achne *lente
Page WEB
navgateur
Scrpts
Navgateur
1
"
F
$ G
H
I
Base )e
)onnes
$
rseau
8achne J
Machine A Machine B
+-------------------------------------+ +----------------------------+
7 Application v ^ Application
+------------------------------------ +---------------------------
6 Prsentation v ^ Prsentation
+------------------------------------ +---------------------------
5 Session v ^ Session
+------------------------------------ +---------------------------
4 Transport v ^ Transport
+------------------------------------ +---------------------------
3 Rseau v ^ Rseau
+------------------------------------ +---------------------------
2 Liaison v ^ Liaison
+------------------------------------ +---------------------------
1 Physique v ^ Physique
+------------------------------------+ +---------------------------+
^
+-->------->------>-----+
7e r<le )es )!!rentes couches est le suvant +
Physique
Assure la transmsson )e -ts sur un support phDs/ue. ?n trouve )ans cette couche )es /upements
termnau% )e tratement )es )onnes :E.T.T.D.; tels /ue termnal ou or)nateur1 ans /ue )es /upements
)e termnason )e crcuts )e )onnes :E.T.*.D.; tels /ue mo)ulateur&)mo)ulateur1 multple%eur1
concentrateur. 7es ponts ),ntr4t = ce nveau sont +
. le cho% )u co)age )e l,n!ormaton :analog/ue ou numr/ue;
. le cho% )u mo)e )e transmsson :sDnchrone ou asDnchrone;.
Liaison de
donnes
8as/ue les partcularts phDs/ues )e la couche PhDs/ue. Dtecte et corrge les erreurs )e transmsson.
Rseau
A.re le chemn /ue )ovent suvre les n!ormatons envoDes sur le rseau. ?n appelle cela le routage +
)termner la route = suvre par une n!ormaton pour /u,elle arrve = son )estnatare.
Transport
Permet la communcaton entre )eu% applcatons alors /ue les couches prc)entes ne permettaent /ue la
communcaton entre machnes. Kn servce !ourn par cette couche peut 4tre le multple%age + la couche
transport pourra utlser une m4me conne%on rseau :)e machne = machne; pour transmettre )es
n!ormatons appartenant = pluseurs applcatons.
Session
?n va trouver )ans cette couche )es servces permettant = une applcaton ),ouvrr et )e mantenr une
sesson )e traval sur une machne )stante.
Prsentation
Elle vse = un!ormser la reprsentaton )es )onnes sur les )!!rentes machnes. Ans )es )onnes
provenant ),une machne A1 vont 4tre >ha-lles> par la couche /r.sentation )e la machne A1 selon un !ormat
stan)ar) avant ),4tre envoDes sur le rseau. Parvenues = la couche /r.sentation )e la machne )estnatrce B
/u les reconnaVtra grYce = leur !ormat stan)ar)1 elles seront ha-lles ),une autre !aLon a!n /ue l,applcaton
)e la machne B les reconnasse.
Application
A ce nveau1 on trouve les applcatons gnralement proches )e l,utlsateur telles /ue la messagere
lectron/ue ou le trans!ert )e !chers.
1.&.2 Le 2$#3"e T+P65P
7e mo).le ?S( est un mo).le )al. 7a sute )e protocoles T*P&(P s,en approche sous la !orme suvante +
7es -ases 1F&1'"
+----------------+ +---------------------------+
Application Application
+----------------+ +---------------------------+
<----------- messages ou streams ---------->
+----------------+ +---------------------------+
Transport Transport
(Udp/Tcp) (Udp/tcp)
+----------------+ +---------------------------+
<----------- datagrammes (UDP) ----------->
+----------------+ ou +---------------------------+
Rseau (IP) segments (TCP) Rseau (IP)
+----------------+ +---------------------------+
<----------- datagrammes IP -------------->
+----------------+ +----------------------------+
Interface rseau Interface rseau
+---------------+ +----------------------------+
<---------- trames rseau ------------->
+----------------------------------------------+
rseau physique
l,inter#ace rseau :la carte rseau )e l,or)nateur; assure les !onctons )es couches 1 et " )u mo).le ?S(
la couche 0( :(nternet Protocol; assure les !onctons )e la couche F :rseau;
la couche 1C( :Trans!er *ontrol Protocol; ou 23( :Kser Datagram Protocol; assure les !onctons )e la couche $
:transport;. 7e protocole T*P s,assure /ue les pa/uets )e )onnes changs par les machnes arrvent -en = )estnaton.
S ce n,est pas les cas1 l renvoe les pa/uets /u se sont gars. 7e protocole KDP ne !at pas ce traval et c,est alors au
)veloppeur ),applcatons )e le !are. *,est pour/uo sur l,nternet /u n,est pas un rseau !a-le = 1##Z1 c,est le protocole
T*P /u est le plus utls. ?n parle alors )e rseau 1C(.0(.
la couche 4pplication recouvre les !onctons )es nveau% H = G )u mo).le ?S(.
7es applcatons 0e- se trouvent )ans la couche )pplication et s,appuent )onc sur les protocoles T*P-(P. 7es couches )pplication
)es machnes clentes et serveur s,changent )es messages /u sont con!es au% couches 1 = $ )u mo).le pour 4tre achemnes =
)estnaton. Pour se compren)re1 les couches applcaton )es )eu% machnes )ovent >parler> un m4me langage ou protocole. *elu
)es applcatons We- s,appelle 511( :3DperTe%t Trans!er Protocol;. *,est un protocole )e tDpe te%te1 c.a.). /ue les machnes
changent )es lgnes )e te%te sur le rseau pour se compren)re. *es changes sont normalss1 c.a.). /ue le clent )spose ),un
certan nom-re )e messages pour n)/uer e%actement ce /u,l veut au serveur et ce )erner )spose galement ),un certan nom-re
)e messages pour )onner au clent sa rponse. *et change )e messages a la !orme suvante +
*lent --N Serveur
7ors/ue le clent !at sa )eman)e au serveur 0e-1 l envoe
1. )es lgnes )e te%te au !ormat 3TTP pour n)/uer ce /u,l veut
". une lgne v)e
F. optonnellement un )ocument
Serveur --N *lent
7ors/ue le serveur !at sa rponse au clent1 l envoe
1. )es lgnes )e te%te au !ormat 3TTP pour n)/uer ce /u,l envoe
". une lgne v)e
F. optonnellement un )ocument
7es changes ont )onc la m4me !orme )ans les )eu% sens. Dans les )eu% cas1 l peut D avor envo ),un )ocument m4me s,l est rare
/u,un clent envoe un )ocument au serveur. 8as le protocole 3TTP le prvot. *,est ce /u permet par e%emple au% a-onns ),un
!ournsseur ),acc.s )e tlcharger )es )ocuments )vers sur leur ste personnel h-erg che5 ce !ournsseur ),acc.s. 7es )ocuments
changs peuvent 4tre /uelcon/ues. Prenons un navgateur )eman)ant une page 0e- contenant )es mages +
7es -ases 1$&1'"
Document
Ent4tes 3TTP
lgne v)e
1. le navgateur se connecte au serveur 0e- et )eman)e la page /u,l souhate. 7es ressources )eman)es sont )sgnes )e
!aLon un/ue par )es KB7 :Kn!orm Besource 7ocator;. 7e navgateur n,envoe /ue )es ent4tes 3TTP et aucun
)ocument.
". le serveur lu rpon). (l envoe tout ),a-or) )es ent4tes 3TTP n)/uant /uel tDpe )e rponse l envoe. *e peut 4tre une
erreur s la page )eman)e n,e%ste pas. S la page e%ste1 le serveur )ra )ans les ent4tes 3TTP )e sa rponse /u,apr.s
ceu%-c l va envoDer un )ocument 51%L :3DperTe%t 8ar[up 7anguage;. *e )ocument est une sute )e lgnes )e te%te
au !ormat 3T87. Kn te%te 3T87 content )es -alses :mar/ueurs; )onnant au navgateur )es n)catons sur la !aLon
),a!!cher le te%te.
F. le clent sat ),apr.s les ent4tes 3TTP )u serveur /u,l va recevor un )ocument 3T87. (l va analDser celu-c et
s,apercevor peut-4tre /u,l content )es r!rences ),mages. *es )ern.res ne sont pas )ans le )ocument 3T87. (l !at
)onc une nouvelle )eman)e au m4me serveur 0e- pour )eman)er la prem.re mage )ont l a -eson. *ette )eman)e est
)ent/ue = celle !ate en 11 s ce n,est /ue la resource )eman)e est )!!rente. 7e serveur va trater cette )eman)e en
envoDant = son clent l,mage )eman)e. *ette !os-c1 )ans sa rponse1 les ent4tes 3TTP prcseront /ue le )ocument
envoD est une mage et non un )ocument 3T87.
$. le clent rcup.re l,mage envoDe. 7es tapes F et $ vont 4tre rptes 9us/u,= ce /ue le clent :un navgateur en gnral; at
tous les )ocuments lu permettant ),a!!cher l,ntgralt )e la page.
1.&.3 Le pr$t$c$"e HTTP
Dcouvrons le protocole 3TTP sur )es e%emples. Eue s,changent un navgateur et un serveur 0e- W
1.5.3.1 La rponse d'un serveur HTTP
Nous allons )couvrr c comment un serveur 0e- rpon) au% )eman)es )e ses clents. 7e servce We- ou servce 3TTP est un
servce T*P-(P /u travalle ha-tuellement sur le port S#. (l pourrat travaller sur un autre port. Dans ce cas1 le navgateur clent
serat o-lg )e prcser ce port )ans l,KB7 /u,l )eman)e. Kne KB7 a la !orme gnrale suvante +
protocole6++machine76port8+chemin+in#os
avec
protocole http pour le servce 0e-. Kn navgateur peut galement servr )e clent = )es servces !tp1 ne0s1 telnet1 ..
machine nom )e la machne o6 o!!ce le servce 0e-
port port )u servce 0e-. S c,est S#1 on peut omettre le nR )u port. *,est le cas le plus !r/uent
chemin chemn )sgnant la ressource )eman)e
in#os n!ormatons complmentares )onnes au serveur pour prcser la )eman)e )u clent
Eue !at un navgateur lors/u,un utlsateur )eman)e le chargement ),une KB7 W
1. l ouvre une communcaton T*P-(P avec la machne et le port n)/us )ans la parte machine76port8 )e l,KB7. ?uvrr
une communcaton T*P-(P1 c,est crer un >tuDau> )e communcaton entre )eu% machnes. Kne !os ce tuDau cr1 toutes
les n!ormatons changes entre les )eu% machnes vont passer )e)ans. 7a craton )e ce tuDau T*P-(P n,mpl/ue pas
encore le protocole 3TTP )u We-.
". le tuDau T*P-(P cr1 le clent va !are sa )eman)e au serveur We- et l va la !are en lu envoDant )es lgnes )e te%te :)es
comman)es; au !ormat 3TTP. (l va envoDer au serveur la parte chemin+in#os )e l,KB7
F. le serveur lu rpon)ra )e la m4me !aLon et )ans le m4me tuDau
$. l,un )es )eu% partenares pren)ra la )cson )e !ermer le tuDau. *ela )pen) )u protocole 3TTP utls. Avec le
protocole 3TTP 1.#1 le serveur !erme la conne%on apr.s chacune )e ses rponses. *ela o-lge un clent /u )ot !are
pluseurs )eman)es pour o-tenr les )!!rents )ocuments consttuant une page 0e- = ouvrr une nouvelle conne%on =
cha/ue )eman)e1 ce /u a un co\t. Avec le protocole 3TTP&1.11 le clent peut )re au serveur )e gar)er la conne%on
ouverte 9us/u,= ce /u,l lu )se )e la !ermer. (l peut )onc rcuprer tous les )ocuments ),une page 0e- avec une seule
conne%on et !ermer lu-m4me la conne%on une !os le )erner )ocument o-tenu. 7e serveur )tectera cette !ermeture et
!ermera lu auss la conne%on.
Pour )couvrr les changes entre un clent et un serveur 0e-1 nous allons utlser un outl appel curl. *url est une applcaton
D?S permettant ),4tre clent )e servces (nternet supportant )!!rents protocoles :3TTP1 ]TP1 TE7NET1 A?P3EB1 ...;. curl est
)spon-le = l,KB7 http6++curl.haxx.se+. ?n tlchargera c )e pr!rence la verson Wn)o0s 0nF"-nossl1 la verson 0nF"-ssl
ncesstant )es )ll supplmentares non )lvres )ans le pa/uetage curl. *elu-c content un ensem-le )e !chers /u,l su!!t )e
)compresser )ans un )osser /ue nous apellerons )sormas McurlN. *e )osser content un e%cuta-le appel Ocurl.e%eQ. *e sera
notre clent pour nterroger )es serveurs 0e-. ?uvrons une !en4tre Dos et plaLons-nous )ans le )osser McurlN +
dos>dir curl.exe
22/03/2004 13:29 299 008 curl.exe
E:\curl2>curl
curl: try 'curl --help' for more information
7es -ases 1H&1'"
dos>curl --help | more
Usage: curl [options...] <url>
Options: (H) means HTTP/HTTPS only, (F) means FTP only
-a/--append Append to target file when uploading (F)
-A/--user-agent <string> User-Agent to send to server (H)
--anyauth Tell curl to choose authentication method (H)
-b/--cookie <name=string/file> Cookie string or file to read cookies from (H)
--basic Enable HTTP Basic Authentication (H)
-B/--use-ascii Use ASCII/text transfer
-c/--cookie-jar <file> Write cookies to this file after operation (H)
....
Ktlsons cette applcaton pour nterroger un serveur 0e- et )couvrr les changes entre le clent et le serveur. Nous serons )ans la
stuaton suvante +
7e serveur 0e- pourra 4tre /uelcon/ue. Nous cherchons c = )couvrr les changes /u vont se pro)ure entre le clent 0e- OcurlQ
et le serveur 0e-. Prc)emment1 nous avons cr la page 3T87 stat/ue suvante +

<html>
<head>
<title>essai 1 : une page statique</title>
</head>
<body>
<center>
<h1>Une page statique...</h1>
</body>
</html>
/ue nous vsualsons )ans un navgateur +
?n vot /ue l,KB7 )eman)e est + http://localhost/aspnet/chap1/stati0ue1.html. 7a machne )u servce 0e- est )onc localhost
:Tmachne locale; et le port S#. S on )eman)e = vor le te%te 3T87 )e cette page We- :A!!chage&Source; on retrouve le te%te
3T87 ntalement cr +
7es -ases 1I&1'"
serveur 0e-
rseau
Scrpts
Serveur
8achne *lente
*KB7
8achne Serveur
Pages
stat/ues
8antenant utlsons notre clent *KB7 pour )eman)er la m4me KB7 +
dos>curl http://localhost/aspnet/chap1/statique1.html
<html>
<head>
<title>essai 1 : une page statique</title>
</head>
<body>
<center>
<h1>Une page statique...</h1>
</body>
</html>
Nous voDons /ue le serveur 0e- lu a envoD un ensem-le )e lgnes )e te%te /u reprsente le co)e 3T87 )e la page )eman)e.
Nous avons )t prc)emment /ue la rponse ),un serveur 0e- se !asat sous la !orme +
?r c1 nous n,avons pas vu les ent4tes 3TTP. *ec parce /ue OcurlQ par )!aut ne les a!!che pas. 7,opton ..include permet )e les
a!!cher +
E:\curl2>curl --include http://localhost/aspnet/chap1/statique1.html
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Mon, 22 Mar 2004 16:51:00 GMT
X-AspNet-Version: 1.1.4322
Cache-Control: public
ETag: "1C4102CEE8C6400:1C4102CFBBE2250"
Content-Type: text/html
Content-Length: 161
Connection: Close
<html>
<head>
<title>essai 1 : une page statique</title>
</head>
<body>
<center>
<h1>Une page statique...</h1>
</body>
</html>
7e serveur a -en envoD une sre ),ent4tes 3TTP suve ),une lgne v)e +
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Mon, 22 Mar 2004 16:51:00 GMT
X-AspNet-Version: 1.1.4322
Cache-Control: public
ETag: "1C4102CEE8C6400:1C4102CFBBE2250"
Content-Type: text/html
Content-Length: 161
Connection: Close
HTTP/1.1 200 OK
le serveur )t
7es -ases 1G&1'"
Document
Ent4tes 3TTP
lgne v)e
/u,l compren) le protocole 3TTP verson 1.1
/u,l a la ressource )eman)e :co)e "##1 message ?X;
Server:
le serveur s,)ent!e. (c c,est un serveur *assn
Date: ...
la )ate&heure )e la rponse
X-ASPNet-Version: ...
ent4te spc!/ue au serveur *assn
Cache-Control: public
)onne )es n)caton au clent sur la poss-lt )e mettre en cache la rponse /u lu est envoDe.
7,attr-ut Opu-lcQ n)/ue au clent /u,l peut mettre la page en cache. Kn attr-ut Ono-cacheQ aurat
n)/u au clent /u,l ne )evat pas mettre en cache la page.
ETag:
...
Content-type: text/html
le serveur )t /u,l va envoDer )u te%te :te%t; au !ormat 3T87 :html;.
Content-Length: 161
nom-re )e -Dtes )u )ocument /u va 4tre envoD apr.s les ent4tes 3TTP. *e nom-re est en !at la
talle en octets )u !cher essai1.html +
dos>dir essai1.html
08/07/2002 10:00 161 essai1.html
Connection: close
le serveur )t /u,l !ermera la conne%on une !os le )ocument envoD
7e clent reLot ces ent4tes 3TTP et sat mantenant /u,l va recevor 1I1 octets reprsentant un )ocument 3T87. 7e serveur
envoe ces 1I1 octets mm)atement )err.re la lgne v)e /u sgnalat la !n )es ent4tes 3TTP +
<html>
<head>
<title>essai 1 : une page statique</title>
</head>
<body>
<center>
<h1>Une page statique...</h1>
</body>
</html>
?n reconnaVt l=1 le !cher 3T87 construt ntalement. S notre clent tat un navgateur1 apr.s rcepton )e ces lgnes )e te%te1 l
les nterprterat pour prsenter = l,utlsateur au claver la page suvante +
Ktlsons une nouvelle !os notre clent OcurlQ pour )eman)er la m4me ressource mas cette !os-c en )eman)ant seulement les
ent4tes )e la rponse avec l,opton ..head +
dos>curl --head http://localhost/aspnet/chap1/statique1.html
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Tue, 23 Mar 2004 07:11:54 GMT
Cache-Control: public
ETag: "1C410A504D60680:1C410A58621AD3E"
Content-Type: text/html
Content-Length: 161
Connection: Close
Nous o-tenons le m4me rsultat /ue prc)emment sans le )ocument 3T87. 8antenant )eman)ons une mage auss -en avec
un navgateur /u,avec le clent T*P gnr/ue. Tout ),a-or) avec un navgateur +
7es -ases 1S&1'"
7e !cher univ-1.gif a $#H" octets +
dos>dir univ01.gif
23/03/2004 08:14 4 052 univ01.gif
Ktlsons mantenant le clent OcurlQ +
dos>curl --head http://localhost/aspnet/chap1/univ01.gif
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Tue, 23 Mar 2004 07:18:44 GMT
Cache-Control: public
ETag: "1C410A6795D7500:1C410A6868B1476"
Content-Type: image/gif
Content-Length: 4052
Connection: Close
?n notera les ponts suvants )ans le cDcle )eman)e- rponse c-)essus +
--head
nous ne )eman)ons /ue les ent4tes 3TTP )e la ressource. En e!!et1 une mage est un
!cher -nare et non un !cher te%te et son a!!chage = l,cran en tant /ue te%te ne
)onne ren )e ls-le.
Content-Length: 4052
c,est la talle )u !cher univ-1.gif
Content-Type: image/gif
le serveur n)/ue = son clent /u,l va lu envoDer un )ocument )e tDpe image/gif1 c.a.).
une mage au !ormat A(]. S l,mage avat t au !ormat 2PEA1 le tDpe )u )ocument
aurat t image/#peg. 7es tDpes )es )ocuments sont stan)ar)ss et sont appels )es
tDpes 8(8E :8ult-purpose (nternet 8al E%tenson;.
1.5.3.2 La demande d'un client HTTP
8antenant1 posons-nous la /ueston suvante + s nous voulons crre un programme /u >parle> = un serveur 0e-1 /uelles
comman)es )ot-l envoDer au serveur 0e- pour o-tenr une ressource )onne W Nous avons )ans les e%emples prc)ents vu ce
/ue recevat le clent mas pas ce /ue le clent envoDat. Nous allons emploDer l,opton O--ver-oseQ )e curl pour vor galement ce
/u,envoe le clent au serveur. *ommenLons par )eman)er la page stat/ue +

dos>curl --verbose http://localhost/aspnet/chap1/statique1.html
* About to connect() to localhost:80
* Connected to portable1_tahe (127.0.0.1) port 80
> GET /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
< HTTP/1.1 200 OK
< Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
< Date: Tue, 23 Mar 2004 07:37:06 GMT
< Cache-Control: public
< ETag: "1C410A504D60680:1C410A58621AD3E"
< Content-Type: text/html
< Content-Length: 161
< Connection: Close
<html>
<head>
<title>essai 1 : une page statique</title>
</head>
<body>
7es -ases 1'&1'"
<center>
<h1>Une page statique...</h1>
</body>
</html>
* Closing connection #0
Tout ),a-or)1 le clent OcurlQ ta-lt une conne%on tcp&p avec le port S# )e la machne localhost :T1"G.#.#.1;
* About to connect() to localhost:80
* Connected to portable1_tahe (127.0.0.1) port 80
Kne !os la conne%on ta-le1 l envoe sa )eman)e 3TTP. *elle-c est une sute )e lgnes )e te%te termne par une lgne v)e +
GET /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
7a re/u4te 3TTP ),un clent We- a )eu% !onctons +
n)/uer la ressource )sre. *,est le r<le c )e la 1.re lgne AET
)onner )es n!ormatons sur le clent /u !at la re/u4te pour /ue le serveur pusse ventuellement a)apter sa rponse = ce
tDpe )e clent partculer.
7a sgn!caton )es lgnes envoDes c-)essus par le clent OcurlQ est la suvante +
GET ressource protocole
pour )eman)er une ressource )onne selon une verson )onne )u protocole 3TTP. 7e serveur
envoe une rponse au !ormat 3TTP suve ),une lgne v)e suve )e la ressource )eman)e
User-Agent
pour n)/uer /u est le clent
host: machine:port
pour prcser :protocole 3TTP 1.1; la machne et le port )u serveur 0e- nterrog
Pargma
c pour prcser /ue le clent ne g.re pas )e cache.
Accept
tDpes 8(8E prcsant les tDpes )e !chers /ue le clent sat grer
BecommenLons l,opraton avec l,opton --hea) )e OcurlQ +
dos>curl --verbose --head --output reponse.txt http://localhost/aspnet/chap1/statique1.html
* About to connect() to localhost:80
* Connected to portable1_tahe (127.0.0.1) port 80
> HEAD /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
< HTTP/1.1 200 OK
< Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
< Date: Tue, 23 Mar 2004 07:54:22 GMT
< Cache-Control: public
< ETag: "1C410A504D60680:1C410A58621AD3E"
< Content-Type: text/html
< Content-Length: 161
< Connection: Close
Nous ne nous attar)ons /ue sur les ent4tes 3TTP envoDs par le clent +
HEAD /aspnet/chap1/statique1.html HTTP/1.1
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
Host: localhost
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Seule la comman)e )eman)ant la ressource a chang. Au leu ),une comman)e AET on a mantenant une comman)e 3EAD.
*ette comman)e )eman)e = ce /ue la rponse )u serveur se lmte au% ent4tes 3TTP et /u,l n,envoe pas la ressource )eman)e.
7a cope cran c-)essus n,a!!che pas les ent4tes 3TTP reLus. *eu%-c ont t placs )ans un !cher = cause )e l,opton O--output
reponse.t%tQ )e la comman)e OcurlQ +
dos>more reponse.txt
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Tue, 23 Mar 2004 07:54:22 GMT
7es -ases "#&1'"
Cache-Control: public
ETag: "1C410A504D60680:1C410A58621AD3E"
Content-Type: text/html
Content-Length: 161
Connection: Close
1.&.% +$nc"usi$n
Nous avons )couvert la structure )e la )eman)e ),un clent 0e- et celle )e la rponse /u lu est !ate par le serveur 0e- sur
/uel/ues e%emples. 7e )alogue se !at = l,a)e )u protocole 3TTP1 un ensem-le )e comman)es au !ormat te%te changes par les
)eu% partenares. 7a re/u4te )u clent et la rponse )u serveur ont la m4me structure suvante +
Dans le cas ),une )eman)e :appele souvent re/u4te; )u clent1 la parte ODocumentQ est le plus souvent a-sente. Nanmons1 l est
poss-le pour un clent ),envoDer un )ocument au serveur. (l le !at avec une comman)e appele PKT. 7es )eu% comman)es
usuelles pour )eman)er une ressource sont AET et P?ST. *ette )ern.re sera prsente un peu plus lon. 7a comman)e 3EAD
permet )e )eman)er seulement les ent4tes 3TTP. 7es comman)es AET et P?ST sont les plus utlses par les clents 0e- )e tDpe
navgateur.
A la )eman)e ),un clent1 le serveur envoe une rponse /u a la m4me structure. 7a ressource )eman)e est transmse )ans la
parte ODocumentQ sau! s la comman)e )u clent tat 3EAD1 au/uel cas seuls les ent4tes 3TTP sont envoDs.
1.9 Le lanae 51%L
Kn navgateur We- peut a!!cher )vers )ocuments1 le plus courant tant le )ocument 3T87 :3DperTe%t 8ar[up 7anguage;.
*elu-c est un te%te !ormat avec )es -alses )e la !orme <balise>te"te</balise>. Ans le te%te <1>important</1> a!!chera le te%te
mportant en gras. (l e%ste )es -alses seules telles /ue la -alse <hr> /u a!!che une lgne hor5ontale. Nous ne passerons pas en
revue les -alses /ue l,on peut trouver )ans un te%te 3T87. (l e%ste )e nom-reu% logcels W^S(W^A permettant )e construre
une page 0e- sans crre une lgne )e co)e 3T87. *es outls gn.rent automat/uement le co)e 3T87 ),une mse en page !ate =
l,a)e )e la sours et )e contr<les pr)!ns. ?n peut ans nsrer :avec la sours; )ans la page un ta-leau pus consulter le co)e
3T87 gnr par le logcel pour )couvrr les -alses = utlser pour )!nr un ta-leau )ans une page We-. *e n,est pas plus
compl/u /ue cela. Par alleurs1 la connassance )u langage 3T87 est n)spensa-le pus/ue les applcatons 0e- )Dnam/ues
)ovent gnrer elles-m4mes le co)e 3T87 = envoDer au% clents 0e-. *e co)e est gnr par programme et l !aut -en s\r savor
ce /u,l !aut gnrer pour /ue le clent at la page 0e- /u,l )sre.
Pour rsumer1 l n,est nul -eson )e connaVtre la totalt )u langage 3T87 pour )marrer la programmaton We-. *epen)ant cette
connassance est ncessare et peut 4tre ac/use au travers )e l,utlsaton )e logcels W^S(W^A )e constructon )e pages We- tels
/ue Wor)1 ]rontPage1 DreamWeaver et )es )5anes ),autres. Kne autre !aLon )e )couvrr les su-tlts )u langage 3T87 est )e
parcourr le 0e- et ),a!!cher le co)e source )es pages /u prsentent )es caractrst/ues ntressantes et encore nconnues pour
vous.
1.(.1 Un exe2p"e
*ons)rons l,e%emple suvant1 cr avec ]rontPage E%press1 un outl gratut lvr avec (nternet E%plorer. 7e co)e gnr par
]rontpage a t c pur. *et e%emple prsente /uel/ues lments /u,on peut trouver )ans un )ocument 0e- tels /ue +
un ta-leau
une mage
un len
7es -ases "1&1'"
Document
Ent4tes 3TTP
lgne v)e
Kn )ocument 3T87 a la !orme gnrale suvante +
<html>
<head>
<title>Un titre</title>
...
</head>
<body attributs>
...
</body>
</html>
7,ensem-le )u )ocument est enca)r par les -alses :html;...:+html;. (l est !orm )e )eu% partes +
1. :head;...:+head; + c,est la parte non a!!cha-le )u )ocument. Elle )onne )es rensegnements au navgateur /u va
a!!cher le )ocument. ?n D trouve souvent la -alse :title;...:+title; /u !%e le te%te /u sera a!!ch )ans la -arre )e
ttre )u navgateur. ?n peut D trouver ),autres -alses notamment )es -alses )!nssant les mots cls )u )ocument1 mot
cls utlss ensute par les moteurs )e recherche. ?n peut trouver galement )ans cette parte )es scrpts1 crts le plus
souvent en 9avascrpt ou v-scrpt et /u seront e%cuts par le navgateur.
". :bod* attributs;...:+bod*; + c,est la parte /u sera a!!che par le navgateur. 7es -alses 3T87 contenues )ans cette
parte n)/uent au navgateur la !orme vsuelle >souhate> pour le )ocument. *ha/ue navgateur va nterprter ces -alses
= sa !aLon. Deu% navgateurs peuvent alors vsualser )!!remment un m4me )ocument 0e-. *,est gnralement l,un )es
casse-t4tes )es concepteurs 0e-.
7e co)e 3T87 )e notre )ocument e%emple est le suvant +
<html>
<head>
<title>balises</title>
</head>

<body background="/images/standard.jpg">
<center>
<h1>Les balises HTML</h1>
<hr>
</center>
<table border="1">
<tr>
<td>cellule(1,1)</td>
<td valign="middle" align="center" width="150">cellule(1,2)</td>
<td>cellule(1,3)</td>
</tr>
<tr>
<td>cellule(2,1)</td>
<td>cellule(2,2)</td>
<td>cellule(2,3</td>
7es -ases ""&1'"
</tr>
</table>
<table border="0">
<tr>
<td>Une image</td>
<td><img border="0" src="/images/univ01.gif" width="80" height="95"></td>
</tr>
<tr>
<td>le site de l'ISTIA</td>
<td><a href="http://istia.univ-angers.fr">ici</a></td>
</tr>
</table>
</body>
</html>
?nt t ms en rele! )ans le co)e les seuls ponts /u nous ntressent +
Elment balises et exemples 51%L
titre du
document
<title>balises</title>
balises apparaVtra )ans la -arre )e ttre )u navgateur /u a!!chera le )ocument
barre
horizontale
<hr> + a!!che un trat hor5ontal
tableau
<table attributs>....</table> + pour )!nr le ta-leau
<tr attributs>...</tr> + pour )!nr une lgne
<t' attributs>...</t'> + pour )!nr une cellule
exemples 6
<table bor'er2313>...</table> + l,attr-ut -or)er )!nt l,passeur )e la -or)ure )u ta-leau
<t' valign23mi''le3 align23center3 $i'th2314-3>cellule(15&)</t'> + )!nt une cellule )ont le contenu sera
cellule:11";. *e contenu sera centr vertcalement :valgnT>m))le>; et hor5ontalement :algnT>center>;. 7a
cellule aura une largeur )e 1H# p%els :0)thT>1H#>;
image
<img bor'er23-3 src23/images/univ-1.gif3 $i'th23,-3 height23643> + )!nt une mage sans -or)ure :-or)erT#>;1
)e hauteur 'H p%els :heghtT>'H>;1 )e largeur S# p%els :0)thT>S#>; et )ont le !cher source est
/images/univ-1.gif sur le serveur 0e- :srcT>&mages&unv#1.g!>;. *e len se trouve sur un )ocument 0e- /u a
t o-tenu avec l,KB7 http://localhost:,1/html/balises.htm. Auss1 le navgateur )eman)era-t-l l,KB7
http://localhost:,1/images/univ-1.gif pour avor l,mage r!rence c.
lien
<a href23http://istia.univ-angers.fr3>ici</a> + !at /ue le te%te ici sert )e len vers l,KB7 http://istia.univ-angers.fr.
fond de page
<bo'7 bac+groun'23/images/stan'ar'.#pg3> + n)/ue /ue l,mage /u )ot servr )e !on) )e page se trouve = l,KB7
/images/stan'ar'.#pg )u serveur 0e-. Dans le conte%te )e notre e%emple1 le navgateur )eman)era l,KB7
http://localhost:,1/images/stan'ar'.#pg pour o-tenr cette mage )e !on).
?n vot )ans ce smple e%emple /ue pour construre l,ntralt )u )ocument1 le navgateur )ot !are tros re/u4tes au serveur +
1. http://localhost:,1/html/balises.htm pour avor le source 3T87 )u )ocument
". http://localhost:,1/images/univ-1.gif pour avor l,mage univ-1.gif
F. http://localhost:,1/images/stan'ar'.#pg pour o-tenr l,mage )e !on) stan'ar'.#pg
7,e%emple suvant prsente un !ormulare We- cr lu auss avec ]rontPage.
7es -ases "F&1'"
7e co)e 3T87 gnr par ]rontPage et un peu pur est le suvant +
<html>
<head>
<title>balises</title>
<script language="JavaScript">
function effacer(){
alert("Vous avez cliqu sur le bouton Effacer");
}//effacer
</script>
</head>

<body background="/images/standard.jpg">
<form method="POST" >
<table border="0">
<tr>
<td>Etes-vous mari(e)</td>
<td>
<input type="radio" value="Oui" name="R1">Oui
<input type="radio" name="R1" value="non" checked>Non
</td>
</tr>
<tr>
<td>Cases cocher</td>
<td>
<input type="checkbox" name="C1" value="un">1
<input type="checkbox" name="C2" value="deux" checked>2
<input type="checkbox" name="C3" value="trois">3
</td>
</tr>
<tr>
<td>Champ de saisie</td>
<td>
<input type="text" name="txtSaisie" size="20" value="qqs mots">
</td>
</tr>
<tr>
<td>Mot de passe</td>
<td>
<input type="password" name="txtMdp" size="20" value="unMotDePasse">
</td>
</tr>
<tr>
<td>Bote de saisie</td>
<td>
<textarea rows="2" name="areaSaisie" cols="20">
ligne1
ligne2
ligne3
</textarea>
</td>
</tr>
<tr>
7es -ases "$&1'"
<td>combo</td>
<td>
<select size="1" name="cmbValeurs">
<option>choix1</option>
<option selected>choix2</option>
<option>choix3</option>
</select>
</td>
</tr>
<tr>
<td>liste choix simple</td>
<td>
<select size="3" name="lst1">
<option selected>liste1</option>
<option>liste2</option>
<option>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>
</td>
</tr>
<tr>
<td>liste choix multiple</td>
<td>
<select size="3" name="lst2" multiple>
<option>liste1</option>
<option>liste2</option>
<option selected>liste3</option>
<option>liste4</option>
<option>liste5</option>
</select>
</td>
</tr>
<tr>
<td>bouton</td>
<td>
<input type="button" value="Effacer" name="cmdEffacer" onclick="effacer()">
</td>
</tr>
<tr>
<td>envoyer</td>
<td>
<input type="submit" value="Envoyer" name="cmdRenvoyer">
</td>
</tr>
<tr>
<td>rtablir</td>
<td>
<input type="reset" value="Rtablir" name="cmdRtablir">
</td>
</tr>
</table>
<input type="hidden" name="secret" value="uneValeur">
</form>
</body>
</html>
7,assocaton contr<le vsuel M--N -alse 3T87 est le suvant +
Contrle balise 51%L
formulaire
M!orm metho)T>P?ST> N
champ de
saisie
Mnput tDpeT>te%t> nameT>t%tSase> s5eT>"#> valueT>//s mots>N
champ de
saisie cache
Mnput tDpeT>pass0or)> nameT>t%t8)p> s5eT>"#> valueT>un8otDePasse>N
champ de
saisie
multilignes
Mte%tarea ro0sT>"> nameT>areaSase> colsT>"#>N
lgne1
lgne"
lgneF
M&te%tareaN
boutons radio
Mnput tDpeT>ra)o> valueT>?u> nameT>B1>N?u
Mnput tDpeT>ra)o> nameT>B1> valueT>non> chec[e)NNon
cases cocher
Mnput tDpeT>chec[-o%> nameT>*1> valueT>un>N1
7es -ases "H&1'"
Mnput tDpeT>chec[-o%> nameT>*"> valueT>)eu%> chec[e)N"
Mnput tDpeT>chec[-o%> nameT>*F> valueT>tros>NF
Combo
Mselect s5eT>1> nameT>cm-Valeurs>N
MoptonNcho%1M&optonN
Mopton selecte)Ncho%"M&optonN
MoptonNcho%FM&optonN
M&selectN
liste
slection
unique
Mselect s5eT>F> nameT>lst1>N
Mopton selecte)Nlste1M&optonN
MoptonNlste"M&optonN
MoptonNlsteFM&optonN
MoptonNlste$M&optonN
MoptonNlsteHM&optonN
M&selectN
liste
slection
multiple
Mselect s5eT>F> nameT>lst"> multpleN
MoptonNlste1M&optonN
MoptonNlste"M&optonN
Mopton selecte)NlsteFM&optonN
MoptonNlste$M&optonN
MoptonNlsteHM&optonN
M&selectN
bouton de
type submit
Mnput tDpeT>su-mt> valueT>EnvoDer> nameT>cm)BenvoDer>N
bouton de
type reset
Mnput tDpeT>reset> valueT>Bta-lr> nameT>cm)Bta-lr>N
bouton de
type button
Mnput tDpeT>-utton> valueT>E!!acer> nameT>cm)E!!acer> onclc[T>e!!acer:;>N
Passons en revue ces )!!rents contr<les.
1.6.1.1 Le formulaire
formulaire
<form metho'23/8!93 >
balise HTML
:#orm name<=...= method<=...= action<=...=;...:+#orm;
attributs
name<=#rmexemple= + nom )u !ormulare
method<=...= + mtho)e utlse par le navgateur pour envoDer au serveur 0e- les valeurs rcoltes )ans le
!ormulare
action<=...= + KB7 = la/uelle seront envoDes les valeurs rcoltes )ans le !ormulare.
Kn !ormulare 0e- est entour )es -alses <form>...</form>. 7e !ormulare peut avor un nom :name23""3;. *,est
le cas pour tous les contr<les /u,on peut trouver )ans un !ormulare. *e nom est utle s le )ocument 0e- content
)es scrpts /u )ovent r!rencer )es lments )u !ormulare. 7e -ut ),un !ormulare est )e rassem-ler )es
n!ormatons )onnes par l,utlsateur au claver&sours et ),envoDer celles-c = une KB7 )e serveur 0e-. 7a/uelle W
*elle r!rence )ans l,attr-ut action23:R;3. S cet attr-ut est a-sent1 les n!ormatons seront envoDes = l,KB7
)u )ocument )ans le/uel se trouve le !ormulare. *e serat le cas )ans l,e%emple c-)essus. 2us/u,= mantenant1
nous avons tou9ours vu le clent 0e- comme >)eman)ant> )es n!ormatons = un serveur 0e-1 9amas lu
>)onnant> )es n!ormatons. *omment un clent 0e- !at-l pour )onner )es n!ormatons :celles contenues )ans
le !ormulare; = un serveur 0e- W Nous D reven)rons )ans le )tal un peu plus lon. (l peut utlser )eu% mtho)es
)!!rentes appeles P?ST et AET. 7,attr-ut metho'23m.tho'e31 avec mtho)e gale = AET ou P?ST1 )e la -alse
<form> n)/ue au navgateur la mtho)e = utlser pour envoDer les n!ormatons recuelles )ans le !ormulare =
l,KB7 prcse par l,attr-ut action23:R;3. 7ors/ue l,attr-ut metho' n,est pas prcs1 c,est la mtho)e AET /u est
prse par )!aut.
1.6.1.2 Champ de saisie
7es -ases "I&1'"
champ de
saisie
<input t7pe23te"t3 name23t"t!aisie3 si<e23&-3 value2300s mots3>
<input t7pe23pass$or'3 name23t"t='p3 si<e23&-3 value23un=otDe/asse3>
balise HTML
:input t*pe<=...= name<=...= si>e<=..= "alue<=..=;
7a -alse input e%ste pour )vers contr<les. *,est l,attr-ut t7pe /u permet )e )!!renter ces )!!rents contr<les
entre eu%.
attributs
t*pe<=text= + prcse /ue c,est un champ )e sase
t*pe<=pass!ord= + les caract.res prsents )ans le champ )e sase sont remplacs par )es caract.res _. *,est la
seule )!!rence avec le champ )e sase normal. *e tDpe )e contr<le convent pour la sase )es mots )e passe.
si>e<=$?= + nom-re )e caract.res vs-les )ans le champ - n,emp4che pas la sase )e )avantage )e caract.res
name<=txt&aisie= + nom )u contr<le
"alue<=qqs mots= + te%te /u sera a!!ch )ans le champ )e sase.
1.6.1.3 Champ de saisie multilines
champ de
saisie
multilignes
<te"tarea ro$s23&3 name23area!aisie3 cols23&-3>
ligne1
ligne&
ligne(
</te"tarea>
balise HTML
:textarea ...;texte:+textarea;
a!!che une 5one )e sase multlgnes avec au )part texte )e)ans
attributs
ro!s<=$= + nom-re )e lgnes
cols<='$?= + nom-re )e colonnes
name<=area&aisie= + nom )u contr<le
1.6.1.! "outons radio
boutons radio
<input t7pe23ra'io3 value238ui3 name23R13>8ui
<input t7pe23ra'io3 name23R13 value23non3 chec+e'>>on
balise HTML
:input t*pe<=radio= attribut$<="aleur$= ....;texte
a!!che un -outon ra)o avec texte = c<t.
attributs
name<=radio= + nom )u contr<le. 7es -outons ra)o portant le m4me nom !orment un groupe )e -outons
e%clus!s les uns )es autres + on ne peut cocher /ue l,un ),eu%.
"alue<="aleur= + valeur a!!ecte au -outon ra)o. (l ne !aut pas con!on)re cette valeur avec le te%te a!!ch = c<t
)u -outon ra)o. *elu-c n,est )estn /u,= l,a!!chage.
chec@ed + s ce mot cl est prsent1 le -outon ra)o est coch1 snon l ne l,est pas.
1.6.1.5 Cases # cocher
cases cocher
<input t7pe23chec+bo"3 name23?13 value23un3>1
<input t7pe23chec+bo"3 name23?&3 value23'eu"3 chec+e'>&
<input t7pe23chec+bo"3 name23?(3 value23trois3>(
7es -ases "G&1'"
balise HTML
:input t*pe<=chec@box= attribut$<="aleur$= ....;texte
a!!che une case = cocher avec texte = c<t.
attributs
name<=C1= + nom )u contr<le. 7es cases = cocher peuvent porter ou non le m4me nom. 7es cases portant le
m4me nom !orment un groupe )e cases assoces.
"alue<="aleur= + valeur a!!ecte = la case = cocher. (l ne !aut pas con!on)re cette valeur avec le te%te a!!ch =
c<t )u -outon ra)o. *elu-c n,est )estn /u,= l,a!!chage.
chec@ed + s ce mot cl est prsent1 le -outon ra)o est coch1 snon l ne l,est pas.
1.6.1.6 Liste droulante $com%o&
Combo
<select si<e2313 name23cmb@aleurs3>
<option>choi"1</option>
<option selecte'>choi"&</option>
<option>choi"(</option>
</select>
balise HTML
:select si>e<=..= name<=..=;
:option 7selected8;...:+option;
...
:+select;
a!!che )ans une lste les te%tes comprs entre les -alses MoptonN...M&optonN
attributs
name<=cmbAaleurs= + nom )u contr<le.
si>e<=1= + nom-re ),lments )e lste vs-les. si<e2313 !at )e la lste l,/uvalent ),un com-o-o%.
selected + s ce mot cl est prsent pour un lment )e lste1 ce )erner apparaVt slectonn )ans la lste. Dans
notre e%emple c-)essus1 l,lment )e lste choi"& apparaVt comme l,lment slectonn )u com-o lors/ue celu-c
est a!!ch pour la prem.re !os.
1.6.1.' Liste # slection uni(ue
liste
slection
unique
<select si<e23(3 name23lst13>
<option selecte'>liste1</option>
<option>liste&</option>
<option>liste(</option>
<option>liste*</option>
<option>liste4</option>
</select>
balise HTML
:select si>e<=..= name<=..=;
:option 7selected8;...:+option;
...
:+select;
a!!che )ans une lste les te%tes comprs entre les -alses <option>...</option>
attributs
les m4mes /ue pour la lste )roulante n,a!!chant /u,un lment. *e contr<le ne )!!.re )e la lste )roulante
prc)ente /ue par son attr-ut s5eN1.
1.6.1.) Liste # slection multiple
liste
slection
unique
<select si<e23(3 name23lst&3 multiple>
<option selecte'>liste1</option>
<option>liste&</option>
7es -ases "S&1'"
<option selecte'>liste(</option>
<option>liste*</option>
<option>liste4</option>
</select>
balise HTML
:select si>e<=..= name<=..= multiple;
:option 7selected8;...:+option;
...
:+select;
a!!che )ans une lste les te%tes comprs entre les -alses <option>...</option>
attributs
multiple + permet la slecton )e pluseurs lments )ans la lste. Dans l,e%emple c-)essus1 les lments liste1 et
liste( sont tous )eu% slectonns.
1.6.1.* "outon de t+pe %utton
bouton de
type button
<input t7pe23button3 value23Affacer3 name23cm'Affacer3 onclic+23effacer()3>
balise HTML
:input t*pe<=button= "alue<=...= name<=...= onclic@<=e##acerBC= ....;
attributs
t*pe<=button= + )!nt un contr<le -outon. (l e%ste )eu% autres tDpes )e -outon1 les tDpes submit et reset.
"alue<=E##acer= + le te%te a!!ch sur le -outon
onclic@<=#onctionBC= + permet )e )!nr une !oncton = e%cuter lors/ue l,utlsateur cl/ue sur le -outon. *ette
!oncton !at parte )es scrpts )!ns )ans le )ocument 0e- a!!ch. 7a sDnta%e prc)ente est une sDnta%e
#avascript. S les scrpts sont crts en v-scrpt1 l !au)rat crre onclic@<=#onction= sans les parenth.ses. 7a
sDnta%e )event )ent/ue s,l !aut passer )es param.tres = la !oncton + onclic@<=#onctionB"al1) "al$)...C=
Dans notre e%emple1 un clc sur le -outon Affacer appelle la !oncton 9avascrpt effacer suvante +
<script language="JavaScript">
function effacer(){
alert("Vous avez cliqu sur le bouton Effacer");
}//effacer
</script>
7a !oncton effacer a!!che un message +
1.6.1.1,"outon de t+pe su%mit
bouton de
type submit
<input t7pe23submit3 value23Anvo7er3 name23cm'Renvo7er3>
balise HTML
:input t*pe<=submit= "alue<=En"o*er= name<=cmdRen"o*er=;
attributs
t*pe<=submit= + )!nt le -outon comme un -outon ),envo )es )onnes )u !ormulare au serveur 0e-.
7es -ases "'&1'"
7ors/ue le clent va cl/uer sur ce -outon1 le navgateur va envoDer les )onnes )u !ormulare = l,KB7 )!ne )ans
l,attr-ut action )e la -alse :#orm; selon la mtho)e )!ne par l,attr-ut method )e cette m4me -alse.
"alue<=En"o*er= + le te%te a!!ch sur le -outon
1.6.1.11"outon de t+pe reset
bouton de
type reset
<input t7pe23reset3 value23R.tablir3 name23cm'R.tablir3>
balise HTML
:input t*pe<=reset= "alue<=Rtablir= name<=cmdRtablir=;
attributs
t*pe<=reset= + )!nt le -outon comme un -outon )e rntalsaton )u !ormulare. 7ors/ue le clent va cl/uer
sur ce -outon1 le navgateur va remettre le !ormulare )ans l,tat o6 l l,a reLu.
"alue<=Rtablir= + le te%te a!!ch sur le -outon
1.6.1.12Champ cach
champ cach
<input t7pe23hi''en3 name23secret3 value23une@aleur3>
balise HTML
:input t*pe<=hidden= name<=...= "alue<=...=;
attributs
t*pe<=hidden= + prcse /ue c,est un champ cach. Kn champ cach !at parte )u !ormulare mas n,est pas
prsent = l,utlsateur. *epen)ant1 s celu-c )eman)at = son navgateur l,a!!chage )u co)e source1 l verrat la
prsence )e la -alse Mnput tDpeT>h))en> valueT>...>N et )onc la valeur )u champ cach.
"alue<=uneAaleur= + valeur )u champ cach.
Euel est l,ntr4t )u champ cach W *ela peut permettre au serveur 0e- )e gar)er )es n!ormatons au !l )es
re/u4tes ),un clent. *ons)rons une applcaton ),achats sur le 0e-. 7e clent ach.te un premer artcle art1 en
/uantt 01 sur une prem.re page ),un catalogue pus passe = une nouvelle page )u catalogue. Pour se souvenr
/ue le clent a achet 01 artcles art11 le serveur peut mettre ces )eu% n!ormatons )ans un champ cach )u
!ormulare 0e- )e la nouvelle page. Sur cette nouvelle page1 le clent ach.te 0& artcles art&. 7ors/ue les )onnes )e
ce secon) !ormulare vont 4tre envoDes au serveur :su-mt;1 celu-c va non seulement recevor l,n!ormaton
:0&1art&; mas auss :011art1; /u !at parte galement parte )u !ormulare en tant /ue champ cach non mo)!a-le
par l,utlsateur. 7e serveur 0e- va alors mettre )ans un nouveau champ cach les n!ormatons :011art1; et :0&1art&;
et envoDer une nouvelle page )e catalogue. Et ans )e sute.
1.(.2 nv$i 7 un serveur 8e- par un c"ient 8e- #es va"eurs #9un :$r2u"aire
Nous avons )t )ans l,tu)e prc)ente /ue le clent 0e- )sposat )e )eu% mtho)es pour envoDer = un serveur 0e- les valeurs
),un !ormulare /u,l a a!!ch + les mtho)es AET et P?ST. VoDons sur un e%emple la )!!rence entre les )eu% mtho)es. 7a page
tu)e prc)emment est une page stat/ue. A!n ),avor acc.s au% ent4tes 3TTP envoDs par le navgateur /u va )eman)er ce
)ocument1 nous la trans!ormons en page )Dnam/ue pour un serveur 0e- .NET :((S ou *assn;. (l ne s,agt pas c )e s,ntresser =
la technologe .NET /u sera a-or)e )ans le chaptre suvant mas au% changes clent-serveur. 7e co)e )e la page ASP.NET est la
suvante +
<%@ Page Language="vb" CodeBehind="params.aspx.vb" AutoEventWireup="false"
Inherits="ConsoleApplication1.params" %>
<script runat="server">
Private Sub Page_Init(Byval Sender as Object, Byval e as System.EventArgs)
' on sauvegarde la requte
saveRequest
end sub
Private Sub saveRequest
' sauve la requte courante dans request.txt du dossier de la page
dim requestFileName as String=Me.MapPath(Me.TemplateSourceDirectory)+"\request.txt"
Me.Request.SaveAs(requestFileName,true)
end sub
7es -ases F#&1'"
</script>
<html>
<head>
<title>balises</title>
<script language="JavaScript">
function effacer(){
alert("Vous avez cliqu sur le bouton Effacer");
}//effacer
</script>
</head>
<body background="/images/standard.jpg">
....
</body>
</html>
Au contenu 3T87 )e la page tu)e1 nous a9outons une parte co)e en VB.NET. Nous ne commenterons pas ce co)e1 s ce n,est
pour )re /u,= cha/ue appel )u )ocument c-)essus1 le serveur 0e- va sauvegar)er la re/u4te )u clent We- )ans le !cher
Ore/uest.t%tQ )ans le )osser )u )ocument appel.
1.6.2.1 -thode ./T
]asons un premer test1 o6 )ans le co)e 3T87 )u )ocument1 la -alse ]?B8 est )!nt )e la !aLon suvante +
<form method="get">
7e )ocument prc)ent :3T87@co)e VB; est appel Oparams.asp%Q. (l est plac )ans l,ar-orescence ),un serveur We- .NET
:((S&*assn; et appel avec l,url http+&&localhost&aspnet&chap1&params.asp% +
7e navgateur vent )e !are une re/u4te et nous savons /ue celle-c a t enregstre )ans le !cher Ore/uest.t%tQ. Begar)ons le
contenu )e celu-c +
GET /aspnet/chap1/params.aspx HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Accept: application/x-shockwave-
flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg
,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113
Nous retrouvons )es lments )9= rencontrs avec le clent OcurlQ. D,autres apparassent pour la prem.re !os +
Connection: keep-
le clent )eman)e au serveur )e ne pas !ermer la conne%on apr.s sa rponse. *ela lu permettra ),utlser
7es -ases F1&1'"
alive
la m4me conne%on pour une )eman)e ultreure. 7a conne%on ne reste pas ouverte n)!nment. 7e
serveur la !ermera apr.s un trop long )la ),nutlsaton.
Keep-Alive
)ure en secon)es pen)ant la/uelle la conne%on OXeep-AlveQ restera ouverte
Accept-Charset
*atgore )e caract.res /ue le clent sat grer
Accept-Language
lste )e langues pr!res par le clent.
Nous remplssons le !ormulare est rempl )e la !aLon suvante +
Nous utlsons le -outon OEnvoDerQ c-)essus. Son co)e 3T87 est le suvant +
<form method="get">
...
<input type="submit" value="Envoyer">
...
</form>
Sur l,actvaton ),un -outon )e tDpe OSu-mtQ1 le navgateur envoe les param.tres )u !ormulare :-alse M!ormN; = l,KB7 n)/ue
)ans l,attr-ut OactonQ )e la -alse M!orm actonT>KB7>N s,l e%ste. S cet attr-ut n,e%ste pas1 les param.tres ) !ormulare sont
envoDs = l,KB7 /u a )lvr le !ormulare. *,est le cas c. 7e -outon OEnvoDerQ )evrat )onc entraVner une re/u4te )u navgateur =
l,KB7 Ohttp+&&localhost&aspnet&chap1&params.asp%Q avec un trans!ert )es param.tres )u !ormulare. *omme la page Oparams.asp%Q
mmorse la re/u4te reLue1 nous )evrons savor comment le clent a trans!r ces param.tres. EssaDons. Nous cl/uons sur le
-outon OEnvoDerQ. Nous recevons la rponse suvante )u navgateur +
7es -ases F"&1'"
*,est la page ntale mas on peut remar/uer /ue l,KB7 a chang )ans le champ OA)resseQ )u navgateur. Elle est )evenue la
suvante +
http://localhost/aspnet/chap1/params.aspx?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=cecies
tsecret&areaSaisie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2
=liste3&cmdRenvoyer=Envoyer&secret=uneValeur
?n constate /ue les cho% !ats )ans le !ormulare se retrouvent )ans l,KB7. Begar)ons le contenu )u !cher Ore/uest.t%tQ /u a
mmors la re/u4te )u clent +
GET
/aspnet/chap1/params.aspx?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecret&areaSais
ie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&cmdRenvo
yer=Envoyer&secret=uneValeur HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Accept: application/x-shockwave-
flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jp
eg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
Referer: http://localhost/aspnet/chap1/params.aspx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113
?n retrouve une re/u4te 3TTP asse5 sem-la-le = celle /u avat t !ate ntalement par le navgateur lors/u,l avat )eman) le
)ocument sans transmettre )e param.tres. (l D a )eu% )!!rences +
GET URL HTTP/1.1
7es param.tres )u !ormulare ont t a9outs )err.re l,KB7 )u )ocument sous la !orme W
param1Tval1`param"Tval"`...
Referer
le clent n)/ue par cet ent4te 3TTP l,KB7 )u )ocument /u,l a!!chat lors/u,l a !at la re/u4te
E%amnons )e plus pr.s comment les param.tres ont t passs )ans la comman)e BA9 :R;Cparam12valeur1Dparam&2valeur&D...
E99//1.1 o6 les parami sont les noms )es contr<les )u !ormulare 0e- et valeur les valeurs /u leur sont assoces. Nous
prsentons c-)essous un ta-leau = tros colonnes +
colonne 1 + repren) la )!nton ),un contr<le 3T87 )e l,e%emple
colonne " + )onne l,a!!chage )e ce contr<le )ans un navgateur
colonne F + )onne la valeur envoDe au serveur par le navgateur pour le contr<le )e la colonne 1 sous la !orme /u,elle a
)ans la re/u4te AET )e l,e%emple
contrle 51%L "isuel "aleurBsC ren"o*eBsC
7es -ases FF&1'"
Mnput tDpeT>ra)o> valueT>?u>
nameT>B1>N?u
Mnput tDpeT>ra)o> nameT>B1>
valueT>non> chec[e)NNon
R1</ui
- la valeur )e l,attr-ut value )u -outon
ra)o coch par l,utlsateur.
Mnput tDpeT>chec[-o%> nameT>*1>
valueT>un>N1
Mnput tDpeT>chec[-o%> nameT>*">
valueT>)eu%> chec[e)N"
Mnput tDpeT>chec[-o%> nameT>*F>
valueT>tros>NF
C1<un
C$<deux
- valeurs )es attr-uts value )es cases
coches par l,utlsateur
Mnput tDpeT>te%t> nameT>t%tSase>
s5eT>"#> valueT>//s mots>N
txt&aisie<prorammationD!eb
- te%te tap par l,utlsateur )ans le champ
)e sase. 7es espaces ont t remplacs
par le sgne @
Mnput tDpeT>pass0or)> nameT>t%t8)p>
s5eT>"#> valueT>un8otDePasse>N
txt%dp<ceciestsecret
- te%te tap par l,utlsateur )ans le champ
)e sase
Mte%tarea ro0sT>"> nameT>areaSase>
colsT>"#>N
lgne1
lgne"
lgneF
M&te%tareaN
area&aisie<lesDbasesDdeDlaE?3E?4
prorammationD!eb
- te%te tap par l,utlsateur )ans le champ
)e sase. Z?DZ?A est la mar/ue )e !n
)e lgne. 7es espaces ont t remplacs
par le sgne @
Mselect s5eT>1> nameT>cm-Valeurs>N
MoptonNcho%1M&optonN
Mopton selecte)Ncho%"M&optonN
MoptonNcho%FM&optonN
M&selectN
cmbAaleurs<choix'
- valeur chose par l,utlsateur )ans la
lste = slecton un/ue
Mselect s5eT>F> nameT>lst1>N
Mopton selecte)Nlste1M&optonN
MoptonNlste"M&optonN
MoptonNlsteFM&optonN
MoptonNlste$M&optonN
MoptonNlsteHM&optonN
M&selectN
lst1<liste'
- valeur chose par l,utlsateur )ans la
lste = slecton un/ue
Mselect s5eT>F> nameT>lst"> multpleN
Mopton selecte)Nlste1M&optonN
MoptonNlste"M&optonN
Mopton selecte)NlsteFM&optonN
MoptonNlste$M&optonN
MoptonNlsteHM&optonN
M&selectN
lst$<liste1
lst$<liste'
- valeurs choses par l,utlsateur )ans la
lste = slecton multple
Mnput tDpeT>su-mt> valueT>EnvoDer>
nameT>cm)BenvoDer>N
cmdRen"o*er<En"o*er
- nom et attr-ut value )u -outon /u a
serv = envoDer les )onnes )u !ormulare
au serveur
Mnput tDpeT>h))en> nameT>secret>
valueT>uneValeur>N
secret<uneAaleur
- attr-ut value )u champ cach
?n peut se )eman)er ce /ue le serveur a !at )es param.tres /u,on lu a passs. En ralt ren. A la rcepton )e la comman)e
GET
/aspnet/chap1/params.aspx?R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecret&areaSais
ie=les+bases+de+la%0D%0Aprogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&cmdRenvo
yer=Envoyer&secret=uneValeur HTTP/1.1
7e serveur 0e- a transms les param.tres = l,KB7 au )ocument http+&&localhost&aspnet&chap1&params.asp%1 c.a.). au )ocument
/ue nous avons construt ntalement. Nous n,avons crt aucun co)e pour rcuprer et trater les param.tres /ue le clent nous
envoe. Auss tout se passe comme s la re/u4te )u clent tat smplement +
GET /aspnet/chap1/params.aspx
7es -ases F$&1'"
*,est pour cette rason1 /u,en rponse = notre -outon OEnvoDerQ1 nous avons o-tenu la m4me page /ue celle o-tenue ntalement en
)eman)ant l,KB7 Ohttp+&&localhost&aspnet&chap1&params.asp%Q sans param.tres.
1.6.2.2 -thode P01T
7e )ocument 3T87 est mantenant programm pour /ue le navgateur utlse mantenant la mtho)e P?ST pour envoDer les
valeurs )u !ormulare au serveur 0e- +
<form method="POST" >
Nous )eman)ons le nouveau )ocument va l,KB7 Ohttp+&&localhost&aspnet&chap1&params.asp%Q1 nous remplssons le !ormulare
tel /ue pour la mtho)e AET et nous transmettons les param.tres au serveur avec le -outon OEnvoDerQ. Nous o-tenons )u serveur
la page rponse suvante +
Nous o-tenons )onc le m4me rsultat /u,avec la mtho)e AET1 c.a.). la page ntale. ?n remar/uera une )!!rence + )ans le
champ OA)resseQ )u navgateur1 les param.tres transms n,apparassent pas. 8antenant1 regar)ons la re/u4te envoDe par le clent et
/u a t mmorse )ans le !cher Ore/uest.t%tQ +
POST /aspnet/chap1/params.aspx HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Content-Length: 210
Content-Type: application/x-www-form-urlencoded
Accept: application/x-shockwave-
flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jp
eg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
Referer: http://localhost/aspnet/chap1/params.aspx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113
R1=Oui&C1=un&C2=deux&txtSaisie=programmation+web&txtMdp=ceciestsecrey&areaSaisie=les+bases+de+la%0D%0Apr
ogrammation+web&cmbValeurs=choix3&lst1=liste3&lst2=liste1&lst2=liste3&cmdRenvoyer=Envoyer&secret=uneVale
ur
Des nouveauts apparassent )ans la re/u4te 3TTP )u clent +
POST URL HTTP/1.1
la re/u4te AET a lass place = une re/u4te P?ST. 7es param.tres ne sont plus prsents )ans cette
prem.re lgne )e la re/u4te. ?n peut constater /u,ls sont mantenant placs )err.re la re/u4te 3TTP
apr.s une lgne v)e. 7eur enco)age est )ent/ue = celu /u,ls avaent )ans la re/u4te AET.
7es -ases FH&1'"
Content-Length
nom-re )e caract.res >posts>1 c.a.). le nom-re )e caract.res /ue )evra lre le serveur 0e- apr.s avor
reLu les ent4tes 3TTP pour rcuprer le )ocument /ue lu envoe le clent. 7e )ocument en /ueston est
c la lste )es valeurs )u !ormulare.
Content-type
prcse le tDpe )u )ocument /ue le clent enverra apr.s les ent4tes 3TTP. 7e tDpe Oapplcaton&%-000-
!orm-urlenco)e)Q n)/ue /ue c,est un )ocument contenant )es valeurs )e !ormulare.
(l D a )eu% mtho)es pour transmettre )es )onnes = un serveur 0e- + AET et P?ST. ^-a-t-l une mtho)e melleure /ue l,autre W
Nous avons vu /ue s les valeurs ),un !ormulare taent envoDes par le navgateur avec la mtho)e AET1 le navgateur a!!chat
)ans son champ )'resse l,KB7 )eman)e sous la !orme :R;Cparam12val1Dparam&2val&D.... ?n peut vor cela comme un
avantage ou un nconvnent +
un avantage s on veut permettre = l,utlsateur )e placer cette KB7 paramtre )ans ses lens !avors
un nconvnent s on ne souhate pas /ue l,utlsateur at acc.s = certanes n!ormatons )u !ormulare tels1 par e%emple1 les
champs cachs
Par la sute1 nous utlserons /uas e%clusvement la mtho)e P?ST )ans nos !ormulares.
1.F Conclusion
*e chaptre a prsent )!!rents concepts )e -ase )u )veloppement 0e- +
les )!!rents outls et technologes )spon-les :9ava1 asp1 asp.net1 php1 perl1 v-scrpt1 9avascrpt;
les changes clent-serveur va le protocole 3TTP
la concepton ),un )ocument = l,a)e )u langage 3T87
la concepton )e !ormulares )e sase
Nous avons pu vor sur un e%emple comment un clent pouvat envoDer )es n!ormatons au serveur 0e-. Nous n,avons pas
prsent comment le serveur pouvat
rcuprer ces n!ormatons
les trater
envoDer au clent une rponse )Dnam/ue )pen)ant )u rsultat )u tratement
*,est le )omane )e la programmaton 0e-1 )omane /ue nous a-or)ons )ans le chaptre suvant avec la prsentaton )e la
technologe ASP.NET.
7es -ases FI&1'"
$ 0ntroduction au d"eloppement !eb 4&(.NE1
$.1 0ntroduction
7e chaptre prc)ent a prsent les prncpes )u )veloppement 0e- /u sont n)pen)ants )u langage )e programmaton utls.
Actuellement1 tros technologes )omnent le march )u )veloppement 0e- +
2"EE /u est une plate-!orme )e )veloppement 2ava. Assoce = la technologe Struts1 nstalle sur )!!rents serveurs
),applcaton1 la plate-!orme 2"EE est utlse prncpalement )ans les gran)s pro9ets. Du !at )u langage utls - 2ava - une
applcaton 2"EE peut !onctonner sur les prncpau% sDst.mes ),e%plotaton :Wn)o0s1 Kn%1 7nu%1 8ac ?S1 ...;
P3P /u est un langage nterprt1 lu auss n)pen)ant )u sDst.me ),e%plotaton. *ontrarement = 2ava1 ce n,est pas un
langage orent o-9et. *epen)ant la verson P3PH )evrat ntro)ure l,o-9et )ans le langage. D,acc.s smple1 P3P est
largement utls )ans les petts et moDens pro9ets.
ASP.NET /u est une technologe ne !onctonnant /ue sur les machnes Wn)o0s )sposant )e la plate-!orme .NET :JP1
"###1 "##F1 ...;. 7e langage )e )veloppement utls peut 4tre tout langage compat-le .NET1 c.a.). plus ),une )5ane1 =
commencer par les langages )e 8croso!t :*C1 VB.NET1 2C;1 Delph )e Borlan)1 Perl1 PDthon1 ...
7e chaptre prc)ent a prsent )e courts e%emples pour chacune )e ces tros technologes. *e )ocument s,ntresse au
)veloppement We- ASP.NET avec le langage VB.NET. Nous supposons /ue ce langage est connu. *e pont est mportant. Nous
nous ntressons c un/uement = son utlsaton )ans le conte%te )u )veloppement 0e-. E%plctons )avantage ce pont en
parlant )e la mtho)ologe 8V* )e )veloppement 0e-.
Kne applcaton 0e- respectant le mo).le 8V* sera archtecture )e la !aLon suvante +
Kne telle archtecture1 appele F-ters ou = F nveau%1 cherche = respecter le mo).le 8V* :8o)el Ve0 *ontroller; +
l,nter!ace utlsateur est le V :la vue;
la log/ue applcatve est le * :le contr<leur;
les sources )e )onnes sont le 8 :8o).le;
7,inter#ace utilisateur est souvent un navgateur 0e- mas cela pourrat 4tre galement une applcaton autonome /u va le rseau
enverrat )es re/u4tes 3TTP au servce 0e- et mettrat en !orme les rsultats /ue celu-c lu envoe. 7a loique applicati"e est
consttue )es scrpts tratant les )eman)es )e l,utlsateur. 7a source de donnes est souvent une -ase )e )onnes mas cela peut
4tre auss )e smples !chers plats1 un annuare 7DAP1 un servce 0e- )stant1... 7e )veloppeur a ntr4t = mantenr une gran)e
n)pen)ance entre ces tros entts a!n /ue s l,une ),elles change1 les )eu% autres n,aent pas = changer ou peu.
?n mettra la log/ue mter )e l,applcaton )ans )es classes spares )e la classe /u contr<le le )alogue )eman)e-
rponse. Ans le -loc O7og/ue applcatveQ c-)essus pourra 4tre consttu )es lments suvants +
Dans le -loc O7og/ue ApplcatveQ1 on pourra )stnguer
(ntro)ucton au )veloppement asp.net FG&1'"
(nter!ace
utlsateur
7og/ue
applcatve
Sources )e
)onnes
*lasses
mter
*ontr<leur
page1
(nter!ace
clent
Sources )e
)onnes
pagen
7og/ue applcatve *lent Donnes
*lasses
),acc.s
)onnes
23/1
%/3ELE
C04T56L/35
la classe contr<leur /u est la porte ),entre )e l,applcaton.
le -loc O*lasses mterQ /u regroupe )es classes ncessares = la log/ue )e l,applcaton. Elles sont n)pen)antes )u
clent.
le -loc O*lasses ),acc.s au% )onnesQ /u regroupe )es classes ncessares pour o-tenr les )onnes ncessare = la servlet1
souvent )es )onnes persstantes :BD1 !chers1 servce WEB1 ...;
le -loc )es pages ASP consttuant les vues )e l,applcaton.
Dans les cas smples1 la log/ue applcatve est souvent r)ute = )eu% classes +
la classe contr<leur assurant le )alogue clent-serveur + tratement )e la re/u4te1 gnraton )es )verses rponses
la classe mter /u reLot )u contr<leur )es )onnes = trater et lu !ournt en retour )es rsultats. *ette classe mter g.re
alors elle-m4me l,acc.s au% )onnes persstantes.
7a spc!t )u )veloppement 0e- repose sur l,crture )e la classe contr<leur et )es pages )e prsentaton. 7es classes mter et
),acc.s au% )onnes sont )es classes .NET class/ues1 utlsa-les auss -en )ans une applcaton 0e- /ue )ans une applcaton
0n)o0s ou m4me )e tDpe console. 7,crture )e ces classes ncesste )e -onnes connassance )e la programmaton o-9et. Dans ce
)ocument1 elles seront crtes en VB.NET1 auss supposons-nous /ue ce langage est maVtrs. Dans cette perspectve1 l n,D a pas
leu )e s,apesantr plus /ue ncessare sur le co)e ),acc.s au% )onnes. Dans la /uas totalt )es lvres sur ASP.NET1 un chaptre
est consacr = AD?.NET. 7e schma c-)essus montre /ue l,acc.s au% )onnes est !at par )es classes .NET tout = !at class/ues
/u gnorent /u,elles sont utlses )ans un conte%te 0e-. 7e contr<leur1 /u est le che! ),/upe )e l,applcaton 0e-1 n,a pas = se
soucer ),AD?.NET. (l )ot savor smplement = /uelle classe l )ot )eman)er les )onnes )ont l a -eson et comment les
)eman)er. *,est tout. 8ettre )u co)e AD?.NET )ans le contr<leur n,est pas con!orme au concept 8V* e%pl/u c-)essus et
nous ne le !erons pas.
$.$ Les outils
*e )ocument est )estn = )es tu)ants1 auss allons-nous travaller avec )es outls gratuts tlchargea-les sur nternet +
la plate-!orme .NET :complateurs1 )ocumentaton;
l,envronnement )e )veloppement We-8atr% /u am.ne avec lu le serveur 0e- *assn
)!!rents SABD :8SDE1 8DSE7;
7e lecteur est nvt = consulter l,anne%e >?utls )u 0e-> /u n)/ue o6 trouver et comment nstaller ces )!!rents outls. 7a
plupart )u temps1 nous n,aurons -eson /ue )e tros outls +
un )teur )e te%te pour crre les applcatons 0e-.
un outl )e )veloppement VB.NET pour crre le co)e VB lors/ue celu-c est mportant. *e tDpe ),outl o!!re en gnral
une a)e = la sase )e co)e :complton automat/ue )e co)e;1 le sgnalement )es erreurs sDnta%/ues sot ).s la !rappe )u
co)e1 sot lors )e la sa complaton.
un serveur 0e- pour tester les applcatons 0e- crtes. ?n pren)ra *assn )ans ce )ocument. 7e lecteur )sposant )u
serveur ((S pourra remplacer *assn par ((S. (ls sont tous les )eu% compat-les .NET. *assn est cepen)ant lmt pour
rpon)re au% seules )eman)es locales :localhost; alors /ue ((S peut rpon)re au% re/u4tes )e machnes e%ternes.
Kn e%cellent envronnement commercal pour )velopper en VB.NET est Vsual Stu)o.NET )e 8croso!t. *et (DE tr.s rche
permet )e grer toutes sortes )e )ocuments :co)e VB.NET1 )ocuments 3T871 J871 !eulles )e stDle1 ...;. Pour l,crture )e co)e1
l apporte l,a)e prceuse )e la >complton> automat/ue )e co)e. *ec )t1 cet outl /u amlore sens-lement la pro)uctvt )u
)veloppeur a le )!aut )e ses /ualts + l en!erme le )veloppeur )ans un mo)e )e )veloppement stan)ar)1 certes e!!cace mas
pas tou9ours appropr.
(l est poss-le ),utlser le serveur *assn en-)ehors )e OWe-8atr%Q et c,est ce /ue nous !erons souvent. 7,e%cuta-le )u serveur se
trouve )ans MWe-8atr%NPMversonNPWe-Server.e%e o6 MWe-8atr%N est le rpertore ),nstallaton )e OWe-8atr%Q et
MversonN son nR )e verson +
(ntro)ucton au )veloppement asp.net FS&1'"
?uvrons une !en4tre Dos et postonnons-nous )ans le )osser )u serveur *assn +
E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>dir
...
29/05/2003 11:00 53 248 WebServer.exe
...
7anLons OWe-Server.e%eQ sans param.tres +
E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>webserver
7e panneau c-)essus nous n)/ue /ue l,applcaton OWe-Server&*assnQ a)met tros param.tres +
+port + nR )e port )u servce 0e-. Peut-4tre /uelcon/ue. A par )!aut la valeur S#
&path + chemn phDs/ue ),un )osser )u )s/ue
&"path + )osser vrtuel assoc au )osser phDs/ue prc)ent. 7a sDnta%e est +"path6chemin et non +"path<chemin
comme n)/u )ans la !en4tre *assn c-)essus.
Nous placerons nos e%emples )ans une ar-orescence )e !chers )e racne P avec )es )ossers chap11 chap"1 ... pour les )!!rents
chaptres )e ce )ocument. Nous assocerons = ce )osser phDs/ue P1 le chemn vrtuel V. Auss lancerons-nous *assn avec la
comman)e Dos suvante +
dos> WebServer /port:80 /path:P /vpath:V
Par e%emple1 s on veut /ue la racne phDs/ue )u serveur sot le )osser OD+P)ataP)evelPaspnetPpolDQ et sa racne vrtuelle OaspnetQ1
la comman)e Dos )e lancement )u serveur 0e- sera +
dos> WebServer /port:80 /path:D:\data\devel\aspnet\poly /vpath:/aspnet
?n pourra mettre cette comman)e )ans un raccourc. Kne !os lanc *assn nstalle une c<ne )ans la -arre )es tYches. En )ou-le-
cl/uant )essus1 on a acc.s = un panneau Arr4t&8arche )u serveur +
(ntro)ucton au )veloppement asp.net F'&1'"
7e panneau rappelle les tros param.tres avec les/uels l a t lanc. (l o!!re )eu% -outons ),arr4t&marche ans /u,un len )e test
vers la racne )e son ar-orescence 0e-. Nous le suvons. Kn navgateur est ouvert et l,KB7 Ohttp+&&localhost&aspnetQ )eman)e.
Nous o-tenons le contenu )u )osser n)/u )ans le champ OPhDscal PathQ c-)essus +
Dans l,e%emple1 l,KB7 )eman)e correspon) = un )osser et non = un )ocument 0e-1 auss le serveur a-t-l a!!ch le contenu )e ce
)osser et non un )ocument 0e- partculer. S )ans ce )osser1 l e%ste un !cher appel O)e!ault.asp%Q1 celu-c sera vsuals.
*onstrusons par e%emple1 le !cher suvant et plaLons-le )ans la racne )e l,ar-orescence 0e- )e *assn
:)+P)ataP)evelPaspnetPpolD c; +
<html>
<head>
<title>Page d'entre</title>
</head>
<body>
Page d'index...
</body>
</html>
dos>dir d:\data\devel\aspnet\poly\default.aspx
23/03/2004 18:21 107 default.aspx
Deman)ons mantenant l,KB7 Ohttp+&&localhost&aspnetQ avec un navgateur +
?n vot /u,en ralt c,est l,KB7 Ohttp+&&localhost&aspnet&)e!ault.asp%Q /u a t a!!che. Dans la sute )u )ocument1 nous
n)/uerons comment *assn )ot 4tre con!gur par la notaton *assn:path1vpath; o6 OpathQ est le nom )u )osser racne )e
l,ar-orescence 0e- )u serveur et OvpathQ le chemn vrtuel assoc. ?n se rappellera /u,avec le serveur *assn:path1vpath;1 l,url
Ohttp+&&localhost&vpath&JJQ correspon) au chemn phDs/ue OpathPJJQ. Nous placerons tous nos )ocuments sous une racne
phDs/ue /ue nous appellerons M0e-rootN. Ans nous pourrons parler )u !cher M0e-rootNPchap"Phere1.asp%. Pour cha/ue
lecteur cette racne M0e-rootN sera un )osser )e sa machne personnelle. (c les copes ),cran montreront /ue ce )osser est
souvent O)+P)ataP)evelPaspnetPpolDQ. *e ne sera cepen)ant pas tou9ours le cas1 les tests aDant t !ats sur )es machnes )!!rentes.
$.' (remiers exemples
Nous allons prsenter )es e%emples smples )e page 0e- )Dnam/ue cre avec VB.NET. 7e lecteur est nvt = les tester a!n )e
vr!er /ue son envronnement )e )veloppement est correctement nstall. Nous allons )couvrr /u,l D a pluseurs !aLons )e
construre une page ASP.NET. Nous en chosrons une pour la sute )e nos )veloppements.
(ntro)ucton au )veloppement asp.net $#&1'"
2.3.1 xe2p"e #e -ase ; variante 1
?utls ncessares + un )teur )e te%te1 le serveur We- *assn
Nous reprenons l,e%emple )u chaptre prc)ent. Nous construsons le !cher Oheure1.asp%Q suvant +
<html>
<head>
<title>Demo asp.net </title>
</head>
<body>
Il est <% =Date.Now.ToString("T") %>
</body>
</html>
*e co)e est )u co)e 3T87 avec une -alse spcale MZ ... ZN. A l,ntreur )e cette -alse1 on peut mettre )u co)e VB.NET. (c le
co)e
Date.Now.ToString("T")
pro)ut une chaVne )e caract.res * reprsentant l,heure )u moment. 7a -alse MZ ... ZN est alors remplace par cette chaVne )e
caract.res *. Ans s * est la chaVne 1S+11+#11 la lgne 3T87 contenant le co)e VB.NET )event +
Il est 18:11:01
PlaLons le co)e prc)ent )ans le !cher OM0e-rootNPchap"Pheure1.asp%Q. 7anLons *assn:M0e-rootN1&aspnet; et )eman)ons
avec un navgateur l,KB7 Ohttp+&&localhost&aspnet&chap"&heure1.asp%Q +
Kne !os o-tenu ce rsultat1 nous savons /ue l,envronnement )e )veloppement est correctement nstall. 7a page Oheure1.asp%Q a
t comple pus/u,elle content )u co)e VB.NET. Sa complaton a pro)ut un !cher )ll /u a t stoc[ )ans un )osser sDst.me
pus e%cut par le serveur *assn.
2.3.2 xe2p"e #e -ase ; variante 2
?utls ncessares + un )teur )e te%te1 le serveur We- *assn
7a )ocument Oheure1.asp%Q mlange co)e 3T87 et co)e VB.NET. Dans un e%emple auss smple1 cela ne pose pas pro-l.me. S
on est amen = nclure )avantage )e co)e VB.NET1 on souhatera sparer )avantage le co)e 3T87 )u co)e VB. *ela peut se !are
en regroupant le co)e VB = l,ntreur ),une -alse MscrptN +
<script runat="server">
' calcul des donnes afficher par le code HTML
...
</script>
<html>
....
' affichage des valeurs calcules par la partie script
</html>
7,e%emple Oheure".asp%Q montre cette mtho)e +
<script runat="server">
Dim maintenant as String=Date.Now.ToString("T")
</script>
<html>
<head>
<title>Demo asp.net </title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
(ntro)ucton au )veloppement asp.net $1&1'"
Nous plaLons le )ocument Oheure".asp%Q )ans l,ar-orescence OM0e-rootNPchap"Pheure".asp%Q )u serveur 0e-
*assn:M0e-rootN1&aspnet; et )eman)ons le )ocument avec un navgateur +
2.3.3 xe2p"e #e -ase ; variante 3
?utls ncessares + un )teur )e te%te1 le serveur We- *assn
Nous poussons plus lon la )marche )e sparaton )u co)e VB et )u co)e 3T87 en les mettant )ans )eu% !chers spars. 7e
co)e 3T87 sera )ans le )ocument OheureF.asp%Q et le co)e VB )ans OheureF.asp%.v-Q. 7e contenu )e OheureF.asp%Q sera le suvant +
<%@ Page Language="vb" src="heure3.aspx.vb" Inherits="heure3" %>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
(l D a )eu% )!!rences !on)amentales +
la )rectve OPageQ avec )es attr-uts encore nconnus
l,utlsaton )e la vara-le OmantenantQ )ans le co)e 3T87 alors /u,elle n,est ntalse nulle part
7a )rectve OPageQ sert c = n)/uer /ue le co)e VB /u va ntalser la page est )ans un autre !cher. *,est l,attr-ut OsrcQ /u
n)/ue ce )erner. Nous allons )couvrr /ue le co)e VB est celu ),une classe /u s,appelle OheureFQ. De !aLon transparente pour le
)veloppeur1 un !cher .asp% est trans!orm en classe )rvant ),une classe )e -ase appele OPageQ. (c1 notre )ocument 3T87 )ot
)rver )e la classe /u )!nt et calcule les )onnes /u,l )ot a!!cher. (c c,est la classe OheureFQ )!ne )ans le !cher
OheureF.asp%.v-Q. Auss )ot-on n)/uer ce len parent-!ls entre le )ocument VB OheureF.asp%.v-Q et le )ocument 3T87
OheureF.asp%Q. *,est l,attr-ut OnhertsQ /u prcse ce len. (l )ot n)/uer le nom )e la classe )!ne )ans le !cher pont par
l,attr-ut OsrcQ.
atu)ons mantenant le co)e VB )e la page OheureF.asp%.v-Q +
Public Class heure3
Inherits System.Web.UI.Page
' donnes de la page web afficher
Protected maintenant As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on calcule les donnes de la page web
maintenant = Date.Now.ToString("T")
End Sub
End Class
?n notera les ponts suvants +
le co)e VB )!nt une classe OheureFQ )rve )e la classe OSDstem.We-.K(.PageQ. *,est tou9ours le cas1 une page 0e-
)evant tou9ours )rver )e OSDstem.We-.K(.PageQ.
la classe )clare un attr-ut protg :protecte); OmantenantQ. ?n sat /u,un attr-ut protg est access-le )rectement
)ans les classes )rves. *,est ce /u permet au )ocument 3T87 OheureF.asp%Q ),avor acc.s = la valeur )e la )onne
OmantenantQ )ans son co)e.
l,ntalsaton )e l,attr-ut OmantenantQ se !at )ans une proc)ure OPageb7oa)Q. Nous verrons ultreurement /u,un o-9et
)e tDpe OPageQ est avert par le serveur We- ),un certan nom-re ),vnements. 7,vnement O7oa)Q se pro)ut lors/ue
l,o-9et OPageQ et ses composants ont t crs. 7e gestonnare )e cet vnement est )sgn par la )rectve O3an)les
8DBase.7oa)Q
Private Sub XX(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
le nom OJJQ )u gestonnare )e l,vnement peut 4tre /uelcon/ue. Sa sgnature )ot elle 4tre celle n)/ue c-)essus. Nous
n,e%pl/uerons pas celle-c pour l,nstant.
(ntro)ucton au )veloppement asp.net $"&1'"
on utlse souvent le gestonnare )e l,vnement OPage.7oa)Q pour calculer les valeurs )es )onnes )Dnam/ues /ue )ot
a!!cher la page 0e-.
7es )ocuments OheureF.sp%Q et OheureF.asp%.v-Q sont placs )ans OM0e-rootNPchap"Q. Pus avec un navgateur1 on )eman)e l,KB7
Ohttp+&&localhost&aspnet&chap"&heureF.asp%Q au serveur 0e-:M0e-rootN1&aspnet; +
2.3.% xe2p"e #e -ase ; variante %
?utls ncessares + un )teur )e te%te1 le serveur We- *assn
Nous gar)ons le m4me e%emple /ue prc)emment mas regroupons )e nouveau tout le co)e )ans un un/ue !cher Oheure$.asp%Q
+
<script runat="server">
' donnes de la page web afficher
Private maintenant As String
' evt page_load
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on calcule les donnes de la page web
maintenant = Date.Now.ToString("T")
End Sub
</script>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
Nous retrouvons la s/uence )e l,e%emple " +
<script runat="server">
.... code VB
</script>
<html>
... code HTML
</html>
*ette !os-c1 le co)e VB a t structur en proc)ures. ?n retrouve la proc)ure OPageb7oa)Q )e l,e%emple prc)ent. ?n veut
montrer c1 /u,une page .asp% seule :non le = un co)e VB )ans un !cher spar; est trans!orme )e !aLon mplcte en classe
)rve )e OPageQ. Auss peut-on utlser les attr-uts1 mtho)es et vnements )e cette classe. *,est ce /u est !at c o6 on utlse
l,vnement O7oa)Q )e cette classe.
7a mtho)e )e test est )ent/ue au% prc)entes +
2.3.& xe2p"e #e -ase ; variante &
?utls ncessares + un )teur )e te%te1 le serveur We- *assn
*omme )ans l,e%emple F1 on spare co)e VB et co)e 3T87 )ans )eu% !chers spars. 7e co)e VB est plac )ans
OheureH.asp%.v-Q +
(ntro)ucton au )veloppement asp.net $F&1'"
Public Class heure5
Inherits System.Web.UI.Page
' donnes de la page web afficher
Protected maintenant As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on calcule les donnes de la page web
maintenant = Date.Now.ToString("T")
End Sub
End Class
7e co)e 3T87 est plac )ans OheureH.asp%Q +
<%@ Page Inherits="heure5" %>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
*ette !os-c1 la )rectve OPageQ n,n)/ue plus le len entre le co)e 3T87 et le co)e VB. 7e serveur 0e- n,a plus la poss-lt )e
retrouver le co)e VB pour le compler :a-sence )e l,attr-ut src;. *,est = nous )e !are cette complaton. Dans une !en4tre )os1 nous
complons )onc la classe VB OheureH.asp%.v-Q +
dos>dir
23/03/2004 18:34 133 heure1.aspx
24/03/2004 09:47 232 heure2.aspx
24/03/2004 10:16 183 heure3.aspx
24/03/2004 10:16 332 heure3.aspx.vb
24/03/2004 14:31 440 heure4.aspx
24/03/2004 14:45 332 heure5.aspx.vb
24/03/2004 14:56 148 heure5.aspx
dos>vbc /r:system.dll /r:system.web.dll /t:library /out:heure5.dll heure5.aspx.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>dir heure5.dll
24/03/2004 14:51 3 072 heure5.dll
*-)essus1 l,e%cuta-le Ov-c.e%eQ )u complateur tat )ans le PAT3 )e la machne Dos. S,l ne l,avat pas t1 l aurat !allu )onner le
chemn complet )e Ov-c.e%eQ /u se trouve )ans l,ar-orescence )u )osser o6 a t nstall SDX.NET. 7es classes )rves )e OPageQ
ncesstent )es ressources prsentes )ans les D77 OsDstem.)ll1 sDstem.0e-.)llQ1 ),o6 la r!rence )e celles-c va l,opton &r )u
complateur. 7,opton &t +l-rarD est l= pour n)/uer /u,on veut pro)ure une D77. 7,opton &out n)/ue le nom )u !cher =
pro)ure1 c OheureH.)llQ. *e !cher content la classe OheureHQ )ont a -eson le )ocument 0e- OheureH.asp%Q. Seulement1 le serveur
0e- cherche les D77 )ont l a -eson )ans )es en)rots -en prcs. 7,un )e ces en)rots est le )osser O-nQ stu = la racne )e son
ar-orescence. *ette racne est ce /ue nous avons appel M0e-rootN. Pour le serveur ((S1 c,est gnralement
MlecteurN+Pnetpu-P000root o6 MlecteurN est le lecteur :*1 D1 ...; o6 a t nstall ((S. Pour le serveur *assn1 cette racne
correspon) au param.tre &path avec le/uel vous l,ave5 lanc. Bappelons /ue cette valeur peut 4tre o-tenue en )ou-le-cl/uant sur
l,c<ne )u serveur )ans la -arre )es tYches +
M0e-rootN correspon) = l,attr-ut OPhDscal PathQ c-)essus. Nous crons )onc un )osser M0e-rootNP-n et plaLons OheureH.)llQ
)e)ans +
(ntro)ucton au )veloppement asp.net $$&1'"
Nous sommes pr4ts. Nous )eman)ons l,KB7 Ohttp+&&localhost&aspnet&chap"&heureH.asp%Q au serveur
*assn:M0e-rootN1&aspnet; +
2.3.( xe2p"e #e -ase ; variante (
?utls ncessares + un )teur )e te%te1 le serveur We- *assn
Nous avons montr 9us/u,c /u,une applcaton 0e- )Dnam/ue avat )eu% composantes +
1. )u co)e VB pour calculer les partes )Dnam/ues )e la page
". )u co)e 3T87 ncluant par!os )u co)e VB1 pour l,a!!chage )e ces valeurs )ans la page. *ette parte reprsente la
rponse /u est envoDe au clent 0e-.
7a composante 1 est appele la composante contrleur )e la page et la parte " la composante prsentation. 7a parte
prsentation )ot contenr le mons )e co)e VB poss-le1 vore pas )e co)e VB )u tout. ?n verra /ue c,est poss-le. (c1 nous
montrons un e%emple o6 l n,D a /u,un contr<leur et pas )e composante prsentaton. *,est le contr<leur /u gn.re lu-m4me la
rponse au clent sans l,a)e )e la composante prsentaton.
7e co)e )e prsentaton )event le suvant +
<%@ Page src="heure6.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="heure6" %>
?n vot /u,l n,D a plus aucun co)e 3T87 )e)ans. 7a rponse est la-ore )rectement )ans le contr<leur +
Public Class heure6
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
' on labore la rponse
Dim HTML As String
HTML = "<html><head><title>heure6</title></head><body>Il est "
HTML += Date.Now.ToString("T")
HTML += "</body></html>"
' on l'envoie
Response.Write(HTML)
End Sub
End Class
7e contr<leur la-ore c la totalt )e la rponse plut<t /ue les seules partes )Dnam/ues )e celle-c. De plus l l,envoe. (l le !at
avec la proprt OBesponseQ )e tDpe O3ttpBesponseQ )e la classe OPageQ. *,est un o-9et /u reprsente la rponse !ate par le serveur
au clent. 7a classe O3ttpBesponseQ )spose ),une mtho)e OWrteQ pour crre )ans le !lu% 3T87 /u sera envoD au clent. (c1
nous mettons la totalt )u !lu% 3T87 = envoDer )ans la vara-le O3T87Q et nous envoDons celle-c au clent par
OBesponse.Wrte:3T87;Q.
Nous )eman)ons l,url Ohttp+&&localhost&aspnet&chap"&heureI.asp%Q au serveur *assn :M0e-rootN1&aspnet; +
(ntro)ucton au )veloppement asp.net $H&1'"
2.3.* +$nc"usi$n
Par la sute1 nous utlserons la mtho)e F /u place le co)e VB et le co)e 3T87 ),un )ocument We- )Dnam/ue )ans )eu%
!chers spars. *ette mtho)e a l,avantage )e )couper une page 0e- en )eu% composantes +
1. une composante contrleur compose un/uement )e co)e VB pour calculer les partes )Dnam/ues )e la page
". une composante prsentation /u est la rponse envoDe au clent. Elle est compose )e co)e 3T87 ncluant par!os )u
co)e VB pour l,a!!chage )es valeurs )Dnam/ues. Nous vserons tou9ours = avor le mnmum )e co)e VB )ans la parte
prsentaton1 l,)al tant )e ne pas en avor )u tout.
*omme l,a montr la mtho)e H1 le contr<leur pourra 4tre compl n)pen)amment )e l,applcaton 0e-. *ela prsente l,avantage
)e se concentrer un/uement sur le co)e et ),avor = cha/ue complaton la lste )e toutes les erreurs. Kne !os le contr<leur
compl1 l,applcaton 0e- peut 4tre teste. Sans complaton prala-le1 c,est le serveur 0e- /u !era celle-c1 et alors les erreurs
seront sgnales une par une. *ela peut 4tre 9ug !ast)eu%.
Pour les e%emples /u vont suvre1 les outls suvants su!!sent +
un )teur )e te%te pour construre les )ocuments 3T87 et VB )e l,applcaton lors/u,ls sont smples
un (DE )e )veloppement .NET pour construre les classes VB.NET a!n )e -n!cer )e l,a)e apporte par ce tDpe
),outl = l,crture )e co)e. Kn tel outl est par e%emple C&harp3e"elop :http+&&000.csharpco)e.net;. Kn e%emple
),utlsaton est montr )ans l,anne%e O7es outls )u )veloppement 0e-Q.
l,outl Web%atrix pour construre les pages )e prsentaton )e l,applcaton :c! l,anne%e O7es outls )u )veloppement
0e-Q;.
le serveur Cassini
Tous ces outls sont gratuts.
(ntro)ucton au )veloppement asp.net $I&1'"
' Les #ondamentaux du d"eloppement 4&(.NE1
'.1 La notion d'application !eb 4&(.NE1
3.1.1 5ntr$#ucti$n
Kne applcaton 0e- est une applcaton regroupant )vers )ocuments :3T871 co)e .NET1 mages1 sons1 ...;. *es )ocuments
)ovent 4tre sous une m4me racne /u,on appelle la racne )e l,applcaton 0e-. A cette racne est assoc un chemn vrtuel )u
serveur 0e-. Nous avons rencontr la noton )e )osser vrtuel pour le serveur 0e- *assn. *ette noton e%ste galement pour le
serveur 0e- ((S. Kne )!!rence mportante entre les )eu% serveurs est /u,= un moment )onn1 ((S peut avor un nom-re
/uelcon/ue )e )ossers vrtuels alors /ue le serveur 0e- *assn n,en a /u,un1 celu /u a t spc! = son lancement. *ela sgn!e
/ue le serveur ((S peut servr pluseurs applcatons 0e- smultanment alors /ue le serveur *assn n,en sert /u,une = la !os. Dans
les e%emples prc)ents1 le serveur *assn tat tou9ours lanc avec les param.tres :M0e-rootN1&aspnet; /u assocaent le )osser
vrtuel &aspnet au )osser phDs/ue M0e-rootN. 7e serveur 0e- servat )onc tou9ours la m4me applcaton 0e-. *ela ne nous a pas
emp4chs ),crre et )e tester )es pages )!!rentes et n)pen)antes = l,ntreur )e cette un/ue applcaton 0e-. *ha/ue
applcaton 0e- a )es ressources /u lu sont propres et /u se trouvent sous sa racne phDs/ue M0e-rootN +
un )osser O-nQ )ans le/uel on peut placer )es classes pr-comples
un !cher Oglo-al.asa%Q /u permet )e ),ntalser l,applcaton 0e- )ans son ensem-le ans /ue l,envronnement
),e%cuton )e chacun )e ses utlsateurs
un !cher O0e-.con!gQ /u permet )e paramtrer le !onctonnement )e l,applcaton
un !cher O)e!ault.asp%Q /u 9oue le r<le )e porte ),entre )e l,applcaton
...
D.s /u,une applcaton utlse l,une )e ces tros ressources1 elle a -eson ),un chemn phDs/ue et vrtuel /u lu soent propres. (l n,D
a en e!!et aucune rason pour /ue )eu% applcatons 0e- )!!rentes soent con!gures )e la m4me !aLon. Nos e%emples prc)ents
ont pu tous 4tre placs )ans la m4me applcaton :M0e-rootN1&aspnet; parce /u,ls n,utlsaent aucune )es ressources prc)entes.
Bevenons sur l,archtecture 8V* prconse )ans le chaptre prc)ent1 pour le )veloppement ),une applcaton 0e- +
7,applcaton 0e- est !orme )es !chers )e classe :contr<leur1 classes mter1 classes ),acc.s au% )onnes; et )es !chers )e
prsentaton :)ocuments 3T871 mages1 sons1 !eulles )e stDle1..;. 7,ensem-le )e ces !chers sera plac sous une m4me racne /ue
nous appellerons par!os Mapplcaton-pathN. *ette racne sera assoce = un chemn vrtuel Mapplcaton-vpathN. 7,assocaton
entre ce chemn vrtuel et chemn phDs/ue se !at par con!guraton )u serveur 0e-. ?n a vu /ue pour le serveur *assn1 cette
assocaton se !asat au lancement )u serveur. Par e%emple )ans une !en4tre )os1 on lancerat *assn par +
webserver.exe /port:80 /path:<application-path> /vpath:<application-vpath>
Dans le )osser Mapplcaton-pathN1 on trouvera selon nos -esons +
le )osser O-nQ pour D placer )es classes pr-comples :)ll;
le !cher Oglo-al.asa%Q lors/ue nous aurons -eson )e !are )es ntalsaton sot lors )e l,ntalsaton )e l,applcaton1 sot
lors )e celle ),une sesson utlsateur
le !cher O0e-.con!gQ lors/ue nous aurons -eson )e paramtrer l,applcaton
le !cher O)e!ault.asp%Q lors/ue nous aurons -eson ),une page par )!aut )ans l,applcaton
7es !on)amentau% )u )veloppement asp.net $G&1'"
*lasses
mter
*ontr<leur
page1
(nter!ace
clent
Sources )e
)onnes
pagen
7og/ue applcatve *lent Donnes
*lasses
),acc.s
)onnes
23/1
%/3ELE
C04T56L/35
A!n )e respecter ce concept ),applcaton 0e-1 les e%emples = venr seront tous placs )ans un )osser Mapplcaton-pathN propre
= l,applcaton au/uel sera assoc un )osser vrtuel Mapplcaton-vpathN1 le serveur *assn tant lanc )e !aLon = ler ces )eu%
param.tres.
3.1.2 +$n:igurer une app"icati$n 8e-
S Mapplcaton-pathN est la racne ),une applcaton ASP.NET1 on peut utlser le !cher Mapplcaton-pathNP0e-.con!g pour
con!gurer celle-c. *e !cher est au !ormat J87. Voc un e%emple +
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appSettings>
<add key="nom" value="tintin"/>
<add key="age" value="27"/>
</appSettings>
</configuration>
?n pr4tera attenton au !at /ue les -alses J87 sont sensibles G la casse. Toutes les n!ormatons )e con!guraton )ovent 4tre
entre les -alses :con#iuration; et :+con#iuration;. (l e%ste )e nom-reuses sectons )e con!guraton utlsa-les. Nous n,en
prsentons /u,une c1 la secton :app&ettins; /u permet ),ntalser )es )onnes avec la -alse :add;. 7a sDnta%e )e cette
-alse est la suvante +
<add key="identificateur" value="valeur"/>
7ors/ue le serveur We- lance une applcaton1 l regar)e s )ans Mapplcaton-pathN l D a un !cher appel O0e-.con!gQ. S ou1 l le
lt et mmorse ses n!ormatons )ans un o-9et )e tDpe O*on!guratonSettngsQ /u sera )spon-le = toutes les pages )e l,applcaton
tant /ue celle-c est actve. 7a classe O*on!guratonSettngsQ a une mtho)e stat/ue OAppSettngsQ +
Pour o-tenr la valeur ),une cl * )u !cher )e con!guraton1 on crt O*on!guratonSettngs.AppSettngs:>*>;Q. ?n o-tent une
chaVne )e caract.res. Pour e%ploter le !cher )e con!guraton prc)ent1 crons une page O)e!ault.asp%Q. 7e co)e VB )u !cher
O)e!ault.asp%.v-Q sera le suvant +
Imports System.Configuration
Public Class _default
Inherits System.Web.UI.Page
Protected nom As String
Protected age As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on rcupre les informations de configuration
nom = ConfigurationSettings.AppSettings("nom")
age = ConfigurationSettings.AppSettings("age")
End Sub
End Class
?n vot /u,au chargement )e la page1 les valeurs )es param.tres )e con!guraton OnomQ et OageQ sont rcupres. Elles vont 4tre
a!!ches par le co)e )e prsentaton )e O)e!ault.asp%Q +
<%@ Page src="default.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="_default" %>
<html>
<head>
<title>Configuration</title>
</head>
<body>
Nom :
<% =nom %><br/>
Age :
<% =age %><br/>
</body>
</html>

7es !on)amentau% )u )veloppement asp.net $S&1'"
Pour le test1 on met les !chers O0e-.con!gQ1 O)e!ault.asp%Q et O)e!ault.asp%.v-Q )ans le m4me )osser +
D:\data\devel\aspnet\poly\chap2\config1>dir
30/03/2004 15:06 418 default.aspx.vb
30/03/2004 14:57 236 default.aspx
30/03/2004 14:53 186 web.config
Sot Mapplcaton-pathN le )osser o6 se trouvent les tros !chers )e l,applcaton. 7e serveur *assn est lanc avec les param.tres
:Mapplcaton-pathN1&aspnet&con!g1;. Nous )eman)ons l,KB7 Ohttp+&&localhost&aspnet&con!g1Q. *omme Ocon!g1Q est un
)osser1 le serveur 0e- va chercher un !cher O)e!ault.asp%Q )e)ans et l,a!!cher s,l le trouve. (c1 l va le trouver +
3.1.3 App"icati$n/ Sessi$n/ +$ntexte
3.1.3.1 Le fichier lo%al.asa7
7e co)e )u !cher Oglo-al.asa%Q est tou9ours e%cut avant /ue la page )eman)e par la re/u4te courante ne sot charge. (l )ot 4tre
stu )ans la racne Mapplcaton-pathN )e l,applcaton. S,l e%ste1 le !cher Oglo-al.asa%Q est utls = )vers moments par le serveur
0e- +
1. lors/ue l,applcaton 0e- )marre ou se termne
". lors/u,une sesson utlsateur )marre ou se termne
F. lors/u,une re/u4te utlsateur )marre
*omme pour les pages .asp%1 le !cher Oglo-al.asa%Q peut 4tre crt )e )!!rentes !aLons et en partculer en sparant co)e VB )ans
une classe contr<leur et co)e )e prsentaton. *,est le cho% !at par )!aut par l,outl Vsual Stu)o et nous allons !are c )e m4me.
(l n,D a normalement aucune prsentaton = !are1 ce r<le tant )volu au% pages .asp%. 7e contenu )u !cher Oglo-al.asa%Q est alors
r)ut = une )rectve r!renLant le !cher contenant le co)e )u contr<leur +
<%@ Application src="Global.asax.vb" Inherits="Global" %>
?n remar/uera /ue la )rectve n,est plus OPageQ mas OApplcatonQ. 7e co)e )u contr<leur Oglo-al.asa%.v-Q assoc et gnr par
l,outl Vsual stu)o est le suvant +
Imports System
Imports System.Web
Imports System.Web.SessionState
Public Class Global
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque l'application est dmarre
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque la session est dmarre
End Sub
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche au dbut de chaque demande
End Sub
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lors d'une tentative d'authentification de l'utilisation
End Sub
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsqu'une erreur se produit
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque la session se termine
End Sub
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque l'application se termine
7es !on)amentau% )u )veloppement asp.net $'&1'"
End Sub
End Class
?n notera /ue la classe )u contr<leur )rve )e la classe O3ttpApplcatonQ. Dans la ve ),une applcaton1 l e%ste pluseurs
vnements mportants. *eu%-c sont grs par )es proc)ures )ont le s/uelette est )onn c-)essus.
OApplcatonbStartQ + rappelons /u,une applcaton 0e- est >en!erme> )ans un chemn vrtuel. 7,applcaton )marre ).s
/u,une page stue )ans ce chemn vrtuel est )eman)e par un clent. 7a proc)ure OApplcatonbStartQ est alors e%cute.
*e sera l,un/ue !os. ?n !era )ans cette proc)ure1 toute ntalsaton utle = l,applcaton1 comme par e%emple crer )es
o-9ets )ont la )ure )e ve est celle )e l,applcaton.
OApplcaton-En)Q + est e%cute /uan) l,applcaton est termne. A toute applcaton est assoc un )la ),nactvt1
con!gura-le )ans O0e-.con!gQ1 au -out )u/uel l,applcaton est cons)re comme termne. *,est )onc le serveur 0e- /u
pren) cette )cson en !oncton )u paramtrage )e l,applcaton. 7e )la ),nactvt ),une applcaton est )!n comme le
temps pen)ant le/uel aucun clent n,a !at une )eman)e pour une ressource )e l,applcaton.
OSesson-StartQ&OSessonbEn)Q + A tout clent est attache une sesson sau! s l,applcaton est con!gure comme n,aDant
pas )e sesson. Kn clent n,est pas un utlsateur )evant son cran. S celu-c a ouvert " navgateurs pour nterroger
l,applcaton1 l reprsente )eu% clents. Kn clent est caractrs par un 9eton )e sesson /u,l )ot 9on)re = chacune )e ses
)eman)es. *e 9eton )e sesson est une sute )e caract.res gnre alatorement par le serveur 0e- et un/ue. Deu% clents
ne peuvent avor le m4me 9eton )e sesson. *e 9eton va suvre le clent )e la !aLon suvante +
o le clent /u !at sa prem.re )eman)e n,envoe pas )e 9eton )e sesson. 7e serveur 0e- reconnaVt ce !at et lu en
attr-ue un. *,est le )-ut )e la sesson et la proc)ure OSessonbStartQ est e%cute. *e sera l,un/ue !os.
o le clent !at ses )eman)es suvantes en envoDant le 9eton /u l,)ent!e. *ela va permettre au serveur 0e- )e
retrouver )es n!ormatons les = ce 9eton. *ela va permettre un suv entre les )!!rentes )eman)es )u clent.
o l,applcaton peut mettre = la )sposton ),un clent1 un !ormulare )e !n )e sesson. Dans ce cas1 c,est le clent
/u )eman)e lu-m4me la !n )e sa sesson. 7a proc)ure OSessonbEn)Q sera e%cute. *e sera l,un/ue !os.
o le clent peut ne 9amas )eman)er lu-m4me la !n )e sa sesson. Dans ce cas1 apr.s un certan )la ),nactvt )e
la sesson1 lu-auss con!gura-le par O0e-.con!gQ1 la sesson sera termne par le serveur 0e-. 7a proc)ure
OSessonbEn)Q sera alors e%cute.
OApplcatonbBegnBe/uestQ + cette proc)ure est e%cute ).s /u,une nouvelle )eman)e arrve. Elle est )onc e%cute =
cha/ue re/u4te ),un clent /uelcon/ue. *,est un -on en)rot pour e%amner la re/u4te avant )e la transmettre = la page /u
a t )eman)e. ?n peut m4me pren)re la )cson )e la rorenter vers une autre page.
OApplcatonbErrorQ + est e%cute = cha/ue !os /ue se pro)ut une erreur non gre e%plctement par le co)e )u
contr<leur Oglo-al.asa%.v-Q. ?n peut c1 rorenter la )eman)e )u clent vers une page e%pl/uant la cause )e l,erreur.
S aucun )e ces vnements ne )ot 4tre gr1 alors le !cher Oglo-al.asa%Q peut 4tre gnor. *,est ce /u a t !at avec les premers
e%emples )e ce chaptre.
3.1.3.2 /7emple 1
Dveloppons une applcaton pour meu% apprhen)er les tros moments /ue sont + le )marrage )e l,applcaton1 )e la sesson1
),une )eman)e clent. 7e !cher Oglo-al.asa%Q sera le suvant +
<%@ Application src="Global.asax.vb" Inherits="global" %>
7e !cher Oglo-al.asa%.v-Q assoc sera le suvant +
Imports System
Imports System.Web
Imports System.Web.SessionState
Public Class global
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque l'application est dmarre
' on note l'heure
Dim startApplication As String = Date.Now.ToString("T")
' on la range dans le contexte de l'application
Application.Item("startApplication") = startApplication
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque la session est dmarre
' on note l'heure
Dim startSession As String = Date.Now.ToString("T")
' on la met dans la session
Session.Item("startSession") = startSession
End Sub
7es !on)amentau% )u )veloppement asp.net H#&1'"
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' on note l'heure
Dim startRequest As String = Date.Now.ToString("T")
' on la met dans la session
Context.Items("startRequest") = startRequest
End Sub
End Class
7es ponts mportants )u co)e sont les suvants +
le serveur 0e- ren) )spon-le = la classe O3ttpApplcatonQ )e Oglo-al.asa%.v-Q un certan nom-re ),o-9ets +
o 4pplication )e tDpe O3ttpApplcatonStateQ - reprsente l,applcaton 0e- - )onne acc.s = un )ctonnare
),o-9ets OApplcaton.(temQ access-le = tous les clents )e l,applcaton - permet le partage ),n!ormatons entre
)!!rents clents - l,acc.s smultan )e pluseurs clents = une m4me )onne en lecture&crture ncesste une
sDnchronsaton )es clents.
o &ession )e tDpe O3ttpSessonStateQ - reprsente un clent partculer - )onne acc.s = un )ctonnare ),o-9ets
OSesson.(temQ access-le = toutes les re/u4tes )e ce clent - va permettre )e mmorser )es n!ormatons sur un
clent /u,on va pouvor retrouver au !l )es re/u4tes )e celu-c.
o Request )e tDpe O3ttpBe/uestQ - reprsente la re/u4te 3TTP courante )u clent
o Response )e tDpe O3ttpBesponseQ - reprsente la rponse 3TTP en cours )e constructon )u serveur au clent
o &er"er )e tDpe O3ttpServerKtltDQ - o!!re )es mtho)es utltares notamment pour trans!rer la re/u4te = une
autre page /ue celle prvue ntalement.
o Context )e tDpe O3ttp*onte%tQ - cet o-9et est recr = cha/ue nouvelle re/u4te mas est partag par toutes les
pages /u partcpent au tratement )e la re/u4te - permet )e transmettre )es n!ormatons )e page en page lors
)u tratement ),une re/u4te grYce = son )ctonnare 0tems.
la proc)ure OApplcatonbStartQ note le )-ut )e l,applcaton )ans une vara-le stoc[e )ans un )ctonnare access-le au
nveau applcaton
la proc)ure OSessonbStartQ note le )-ut )e la sesson )ans une vara-le stoc[e )ans un )ctonnare access-le au nveau
sesson
la proc)ure OApplcatonbBegnBe/uestQ note le )-ut )e la re/u4te )ans une vara-le stoc[e )ans un )ctonnare
access-le au nveau re/u4te :c.a.) )spon-le pen)ant tout le temps )e son tratement mas per)ue = la !n )e celu-c;
7a page c-le sera la page Oman.asp%Q suvante +
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<html>
<head>
<title>global.asax</title>
</head>
<body>
jeton de session :
<% =jeton %><br/>
dbut Application :
<% =startApplication %><br/>
dbut Session :
<% =startSession %><br/>
dbut Requte :
<% =startRequest %><br/>
</body>
</html>
*ette page )e prsentaton a!!che )es valeurs calcules par son contr<leur Oman.asp%.v-Q +
Public Class main
Inherits System.Web.UI.Page
Protected startApplication As String
Protected startSession As String
Protected startRequest As String
Protected jeton as String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
' on rcupre les infos de l'application et de la session
jeton=Session.SessionId
startApplication = Application.Item("startApplication").ToString
startSession = Session.Item("startSession").ToString
startRequest = Context.Items("startRequest").ToString
End Sub
End Class
7e contr<leur se contente )e rcuprer les tros n!ormatons places respectvement )ans l,applcaton1 la sesson1 le conte%te par
Oglo-al.asa%.v-Q.
7es !on)amentau% )u )veloppement asp.net H1&1'"
Nous testons l,applcaton )e la !aLon suvante +
1. les !chers sont rassem-ls )ans un m4me )osser Mapplcaton-pathN
". le serveur *assn est lanc avec les param.tres :Mapplcaton-pathN1&aspnet&glo-alasa%1;
F. un premer clent )eman)e l,url Ohttp+&&localhost&aspnet&glo-alasa%1&man.asp%Q et o-tent le rsultat suvant +
$. le m4me clent !at une nouvelle re/u4te :opton Beloa) )u navgateur; +
?n peut constater /ue seule l,heure )e la re/u4te a chang. *ec montre )eu% choses +
les proc)ures OApplcatonbStartQ et OSessonbStartQ )e Oglo-al.asa%Q n,ont pas t e%cutes lors )e la
secon)e re/u4te.
les o-9ets OApplcatonQ et OSessonQ o6 taent stoc[es les heures )e )-ut )e l,applcaton et )e la sesson
sont encore )spon-les pour la secon)e re/u4te.
H. on lance un secon) navgateur pour crer un secon) clent et nous re)eman)ons la m4me url +
*ette !os-c1 nous voDons /ue l,heure )e la sesson a chang. 7e )eu%.me navgateur1 -en /ue sur la m4me machne1
a t cons)r comme un secon) clent et une nouvelle sesson a t cre pour lu. ?n peut constater /ue les )eu%
clents n,ont pas le m4me 9eton )e sesson. 7,heure )e )-ut )e l,applcaton n,a pas chang1 ce /u sgn!e /ue +
la proc)ure OApplcatonbStartQ )e Oglo-al.asa%.v-Q n,a pas t e%cute
l,o-9et OApplcatonQ o6 a t stoc[e l,heure )e )-ut )e l,applcaton est access-le au secon) clent. *,est
)onc )ans cet o-9et /u,l !aut stoc[er les n!ormatons /ue )ovent se partager les )!!rents clents )e
l,applcaton1 l,o-9et OSessonQ lu1 servant = stoc[er )es n!ormatons /ue )ovent se partager les re/u4tes ),un
mHme client.
7es !on)amentau% )u )veloppement asp.net H"&1'"
3.1.3.3 3ne vue d'ensem%le
Avec ce /ue nous avons apprs 9us/u,= mantenant1 nous sommes en mesure )e !are un premer schma e%plcat! )u
!onctonnement ),un serveur 0e- et )es applcaton 0e- /u,l sert +
7e schma prc)ent nous montre un serveur servant )eu% applcatons notes A et B1 chacune avec )eu% clents. Kn serveur 0e-
est capa-le )e servr pluseurs applcatons 0e- smultanment. *elles-c sont totalement n)pen)antes les unes )es autres. Nous
rasonnerons sur l,applcaton A. 7e tratement ),une re/u4te )u clent-1A = l,applcaton A va se )rouler )e la !aLon suvante +
le clent 1A )eman)e au serveur 0e- une ressource /u appartent au )omane )e l,applcaton A. *ela veut )re /u,l
)eman)e une KB7 )e la !orme Ohttp+&&machne+port&VA&ressourceQ o6 VA est le chemn vrtuel )e l,applcaton A.
s le serveur 0e- )tecte /ue c,est la 1.re )eman)e ),une ressource )e l,applcaton A1 l )clenche l,vnement
OApplcatonbStartQ )u !cher Oglo-al.asa%Q )e l,applcaton A. Kn o-9et OApplcatonAQ )e tDpe O3ttpApplcatonStateQ va
4tre construt. 7es )!!rents co)es )e l,applcaton stoc[eront )ans cet o-9et )es )onnes )e porte OApplcatonQ1 c.a.).
)es )onnes concernant tous les utlsateurs. 7,o-9et OApplcatonAQ va e%ster 9us/u,= ce /ue le serveur 0e- )charge
l,applcaton A.
s le serveur 0e- )tecte )e plus /u,l a a!!are = un nouveau clent )e l,applcaton A1 l va )clencher l,vnement
OSessonbStartQ )u !cher Oglo-al.asa%Q )e l,applcaton A. Kn o-9et OSesson-1AQ )e tDpe O3ttpSessonStateQ va 4tre
construt. *et o-9et va permettre = l,applcaton A )e stoc[er )es o-9ets )e porte OSessonQ1 c.a.). )es o-9ets appartenant =
un clent prcs. 7,o-9et OSesson-1AQ va e%ster tant /ue le clent 1A !era )es re/u4tes. (l va permettre un suv )e ce clent.
7e serveur 0e- )tecte /u,l a a!!are = un nouveau clent )ans )eu% cas +
o le clent ne lu a pas envoD )e 9eton )e sesson )ans les ent4tes 3TTP )e sa re/u4te
o le clent lu a envoD un 9eton )e sesson /u n,e%ste pas :mauvas !onctonnement )u clent ou tentatve )e
pratage; ou /u n,e%ste plus. Kn 9eton )e sesson e%pre en e!!et au -out ),un certan )la ),nactvt )u clent
:"# mn par )!aut avec ((S;. *e )la est programma-le.
)ans tous les cas1 le serveur 0e- va )clencher l,vnement OApplcatonbBegnBe/uestQ )u !cher Oglo-al.asa%Q. *et
vnement )marre le tratement ),une re/u4te clent. (l est !r/uent )e ne pas trater cet vnement et )e passer la man =
la page )eman)e par le clent /u elle tratera la re/u4te. ?n peut auss utlser cet vnement pour analDser la re/u4te1 la
trater et )c)er )e la page /u )ot 4tre envoDe en rponse. Nous utlserons cette techn/ue pour mettre en place une
applcaton respectant l,archtecture 8V* )ont nous avons parl.
une !os le !ltre )e Oglo-al.asa%Q pass1 la re/u4te )u clent est passe = une page .asp% /u va trater la re/u4te. Nous
verrons ultreurement /u,l est poss-le )e passer la re/u4te au travers ),un !ltre )e pluseurs pages. 7a )ern.re sera
charge ),envoDer la rponse au clent. 7es pages peuvent a9outer = la re/u4te ntale )u clent1 )es n!ormatons /u,elles
ont calcules. Elles peuvent stoc[er ces n!ormatons )ans la collecton Context.0tems. En e!!et1 toutes les pages
engages )ans le tratement )e la re/u4te ),un clent ont acc.s = ce rservor )e )onnes.
le co)e )es )!!rentes pages a acc.s au% rservors )e )onnes /ue sont les o-9ets OApplcatonAQ1 OSesson-1AQ1 ... (l !aut
se souvenr /ue le serveur 0e- trate smultanment pluseurs clents pour l,applcaton A. Tous ces clents ont acc.s =
l,o-9et OApplcaton AQ. S,ls )ovent mo)!er )es )onnes )ans cet o-9et1 l D a un traval )e sDnchronsaton )es clents =
7es !on)amentau% )u )veloppement asp.net HF&1'"
clent-1A
clent-"A
Serveur
WEB
glo-al.asa% page-1A.asp% page-"A.asp% .asp%
co)e
ApplcatonA Sesson-1A Sesson-"A
)onnes
APP7(*AT(?N A
glo-al.asa% page-1B.asp% page-"B.asp% .asp%
co)e
ApplcatonB Sesson-1B Sesson-"B
)onnes
APP7(*AT(?N B
clent-1B
clent-"B
!are. *ha/ue clent JA a )e plus acc.s au rservor )e )onnes OSesson-JAQ. *elu-c lu tant rserv1 l n,D a pas l= )e
sDnchronsaton = !are.
le serveur 0e- sert pluseurs applcatons 0e- smultanment. (l n,D a aucune nter!rence entre les clents )e ces
)!!rentes applcatons.
De ces e%plcatons1 on reten)ra les ponts suvants +
= un moment )onn1 un serveur 0e- sert )e multples clents )e !aLon smultane. *ela sgn!e /u,l n,atten) pas la !n
),une re/u4te pour en trater une autre. A un temps T1 l D a )onc pluseurs re/u4tes en cours )e tratement appartenant =
)es clents )!!rents pour )es applcatons )!!rentes. ?n appelle par!os threa)s ),e%cuton1 les co)es )e tratement /u
se )roulent en m4me temps au sen )u serveur 0e-.
les threa)s ),e%cuton )es clents ),applications !eb di##rentes n,nter!.rent pas entre-eu%. (l D a tancht.
les threa)s ),e%cuton )es clents d'une mHme application peuvent avor = partager )es )onnes +
o les threa)s ),e%cuton )es re/u4tes de deux clients di##rents :pas le m4me 9eton )e sesson; peuvent partager
)es )onnes au moDen )e l,o-9et O4pplicationQ.
o les threa)s ),e%cuton )es re/u4tes successves d'un mHme client peuvent partager )es )onnes au moDen )e
l,o-9et O&essionQ.
o les threa)s ),e%cuton )es pages successves tratant une mHme requHte ),un clent )onn peuvent partager )es
)onnes au moDen )e l,o-9et OContextQ.
3.1.3.! /7emple 2
Dveloppons un nouvel e%emple mettant en lum.re ce /u vent ),4tre vu. Nous rassem-lons )ans le m4me )osser les !chers
suvants +
Oglo-al.asa%Q
<%@ Application src="Global.asax.vb" Inherits="global" %>
Oglo-al.asa%.v-Q
Imports System
Imports System.Web
Imports System.Web.SessionState
Public Class global
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque l'application est dmarre
' init compteur de clients
Application.Item("nbRequtes") = 0
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque la session est dmarre
' init compteur de requtes
Session.Item("nbRequtes") = 0
End Sub
End Class
7e prncpe )e l,applcaton va 4tre )e compter le nom-re total )e re/u4tes !ates = l,applcaton et le nom-re )e re/u4tes par clent.
7ors/ue l,applcaton )marre OApplcatonbStartQ1 on met = # le compteur )es re/u4tes !ates = l,applcaton. *e compteur est plac
)ans la porte OApplcatonQ car l )ot 4tre ncrment par tous les clents. 7ors/u,un clent se prsente pour la prem.re !os
OSessonbStartQ1 on met = # le compteur )es re/u4tes !ates par ce clent. *e compteur est plac )ans la porte OSessonQ car l ne
concerne /u,un clent )onn.
Kne !os Oglo-al.asa%Q e%cut1 le !cher Oman.asp%Q suvant sera e%cut +
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<html>
<head>
<title>application-session</title>
</head>
<body>
jeton de session :
<% =jeton %>
<br />
requtes Application :
<% =nbRequtesApplication %>
<br />
requtes Client :
<% =nbRequtesClient %>
7es !on)amentau% )u )veloppement asp.net H$&1'"
<br />
</body>
</html>
(l a!!che tros n!ormatons calcules par son contr<leur +
1. l,)entt )u clent va son 9eton )e sesson + O9etonQ
". le nom-re total )e re/u4tes !ates = l,applcaton + On-Be/u4tesApplcaton]
F. le nom-re total )e re/u4tes !ates par le clent )ent! en 1 + On-Be/u4tes*lent]
7es tros n!ormatons sont calcules )ans Oman.asp%.v-Q +
Public Class main
Inherits System.Web.UI.Page
Protected nbRequtesApplication As String
Protected nbRequtesClient As String
Protected jeton As String
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
' une requte de plus pour l'application
Application.Item("nbRequtes") = CType(Application.Item("nbRequtes"), Integer) + 1
' une requte de plus dans la session
Session.Item("nbRequtes") = CType(Session.Item("nbRequtes"), Integer) + 1
' init variables de prsentation
nbRequtesApplication = Application.Item("nbRequtes").ToString
jeton = Session.SessionID
nbRequtesClient = Session.Item("nbRequtes").ToString
End Sub
End Class
7ors/ue Oman.asp%.v-Q est e%cute1 nous sommes en cours )e tratement ),une re/u4te ),un clent )onn. Nous utlsons l,o-9et
OApplcatonQ pour ncrmenter le nom-re )e re/u4tes )e l,applcaton et l,o-9et OSessonQ pour ncrmenter le nom-re )e re/u4tes
)u clent )ont on est en tran )e trater la re/u4te. Bappelons /ue s tous les clents ),une m4me applcaton partagent le m4me o-9et
OApplcatonQ1 ls ont chacun un o-9et OSessonQ /u leur est propre.
Nous testons l,applcaton en plaLant les /uatre !chers prc)ents )ans un )osser /ue nous appelons Mapplcaton-pathN et nous
lanLons le serveur *assn avec les param.tres :Mapplcaton-pathN1&aspnet&0e-appla;. Nous lanLons un premer navgateur et
)eman)ons l,url Ohttp+&&localhost&aspnet&0e-appla&man.asp%Q +
Nous !asons une secon)e re/u4te avec le -outon OBeloa)Q +
Nous lanLons un secon) navgateur pour )eman)er la m4me url. Pour le serveur 0e-1 c,est un nouveau clent +
?n peut constater /ue le 9eton )e sesson a chang et /u,on a )onc un nouveau clent. *ela est re!lt )ans le nom-re )e re/u4tes
)u clent. Bevenons mantenant au 1er navgateur et re)eman)ons encore la m4me url +
7es !on)amentau% )u )veloppement asp.net HH&1'"
7e nom-re )e re/u4tes !ates = l,applcaton sont -en toutes comptes.
3.1.3.5 8e la ncessit de s+nchroniser les clients d'une application
Dans l,applcaton prc)ente1 le compteur )e re/u4tes !ates = l,applcaton est ncrment )ans la proc)ure O]ormb7oa)Q )e la
page Oman.asp%Q )e la !aLon suvante +
' une requte de plus pour l'application
Application.Item("nbRequtes") = CType(Application.Item("nbRequtes"), Integer) + 1
*ette nstructon1 /uo/ue smple1 ncesste pluseurs nstructons )u processeur pour 4tre e%cute. Supposons /u,l en !alle tros +
1. lecture )u compteur
". ncrmentaton )u compteur
F. rcrture )u compteur
7e serveur 0e- s,e%cute sur une machne mult-tYches1 ce /u entraVne /ue cha/ue tYche se vot accor) le processeur pen)ant
/uel/ues mllsecon)es avant )e le per)re pus )e le retrouver apr.s /ue toutes les autres tYches aent eu elles auss leur /uantum )e
temps. Supposons /ue )eu% clents A et B !assent une re/u4te en m4me temps au serveur 0e-. A)mettons /ue le clent A passe le
premer1 /u,l arrve )ans la proc)ure O]ormb7oa)Q )e Oman.asp%.v-Q1 lse le compteur :T1##; pus est nterrompu parce /ue son
/uantum )e temps est pus. Supposons mantenant /ue ce sot le tour )u clent B et /ue celu-c su-sse le m4me sort + l arrve =
lre la valeur )u compteur :T1##; mas n,a pas le temps )e l,ncrmenter. 7es clents A et B sont tous )eu% en possesson ),un
compteur gal = 1##. Supposons /ue revent le tour )u clent A + l ncrmente son compteur1 le passe = 1#1 pus se termne. *,est le
tour )u clent B /u a en sa possesson l,ancenne valeur )u compteur et non la nouvelle. (l passe )onc lu auss la valeur )u
compteur = 1#1 et se termne. 7a valeur )u compteur )e re/u4tes )e l,applcaton est mantenant erron.
Pour lluster ce pro-l.me1 nous reprenons l,applcaton prc)ente /ue nous mo)!ons )e la !aLon suvante +
les !chers Oglo-al.asa%Q1 Oglo-al.asa%.v-Q et Oman.asp%Q ne changent pas
le !cher Oman.asp%.v-Q )event le suvant +
Imports System.Threading
Public Class main
Inherits System.Web.UI.Page
Protected nbRequtesApplication As Integer
Protected nbRequtesClient As Integer
Protected jeton As String
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
' une requte de plus pour l'application et la session
' lecture compteurs
nbRequtesApplication = CType(Application.Item("nbRequtes"), Integer)
nbRequtesClient = CType(Session.Item("nbRequtes"), Integer)
' attente ! s
Thread.Sleep(5000)
' incrmentation des compteurs
nbRequtesApplication += 1
nbRequtesClient += 1
' enregistrement des compteurs
Application.Item("nbRequtes") = nbRequtesApplication
Session.Item("nbRequtes") = nbRequtesClient
' init variables de prsentation
jeton = Session.SessionID
End Sub
End Class
7,ncrmentaton )es compteurs a t )vse en /uatre phases +
1. lecture )u compteur
". mse en sommel )u threa) ),e%cuton
F. ncrmentaton )u compteur
$. rcrture )u compteur
7es !on)amentau% )u )veloppement asp.net HI&1'"
*ons)rons )e nouveau nos )eu% clents A et B. Entre la phase )e lecture et celle ),ncrmentaton )es compteurs )e re/u4tes1
nous !orLons le threa) ),e%cuton = s,arr4ter pen)ant H secon)es. *ela va avor pour cons/uence mm)ate /u,l va per)re le
processeur /u sera alors )onn = une autre tYche. Supposons /ue le clent A passe le premer. (l va lre la valeur N )u compteur et
4tre nterrompu pen)ant H secon)es. S pen)ant celles-c1 le clent B )spose )u processeur1 l )evrat lre la m4me valeur N )u
compteur. Au !nal1 les )eu% clents )evraent a!!cher la m4me valeur )u compteur1 ce /u serat anormal.
Nous testons l,applcaton en plaLant les /uatre !chers prc)ents )ans un )osser /ue nous appelons Mapplcaton-pathN et nous
lanLons le serveur *assn avec les param.tres :Mapplcaton-pathN1&aspnet&0e-appl-;. Nous prparons )eu% navgateurs
)!!rents avec l,url Ohttp+&&localhost&aspnet&0e-appl-&man.asp%Q. Nous lanLons le premer pour /u,l )eman)e l,KB71 pus sans
atten)re la rponse /u arrvera H secon)es plus tar)1 on lance le secon) navgateur. Au -out ),un peu plus )e H secon)es1 on
o-tent le rsultat suvant +
?n vot+
/u,on a )eu% clents )!!rents :pas le m4me 9eton )e sesson;
/ue cha/ue clent a !at une re/u4te
/ue le compteur )e re/u4tes !ates = l,applcaton )evrat )onc 4tre = " )ans l,un )es )eu% navgateurs. *e n,est pas le cas.
8antenant1 !asons une autre e%prence. Avec le m4me navgateur1 nous lanLons cn/ re/u4tes = l,url
Ohttp+&&localhost&aspnet&0e-appl-&man.asp%Q. 7= encore1 nous les lanLons les unes apr.s les autres sans atten)re les rsultats.
7ors/ue toutes les re/u4tes ont t e%cutes1 on o-tent le rsultat suvant pour la )ern.re +
?n peut remar/uer +
/ue les H re/u4tes ont t cons)res comme provenant )u m4me clent car le compteur )e re/u4tes clent est = H. Non
montr c-)essus1 on constate /ue le 9eton )e sesson est e!!ectvement le m4me pour les H re/u4tes.
/ue le compteur )e re/u4tes !ates = l,applcaton est correct.
Eu,en conclure W Ben )e )!nt!. Peut-4tre le serveur 0e- ne commence-t-l pas = e%cuter une re/u4te ),un clent s celu-c en a
)9= une en cours ),e%cuton W (l n,D aurat )onc 9amas smultant ),e%cuton )es re/u4tes ),un m4me clent. Elles seraent
e%cutes les unes apr.s les autres. *e pont est = vr!er. (l peut en e!!et )pen)re )u tDpe )e clent utls.
3.1.3.6 1+nchronisation des clients
7e pro-l.me ms en v)ence )ans l,applcaton prc)ente est un pro-l.me class/ue :mas pas smple = rsou)re; ),acc.s e%clus! =
une ressource. Dans notre pro-l.me partculer1 l !aut !are en sorte /ue /ue )eu% clents A et B ne pussent 4tre en m4me temps
)ans la s/uence )e co)e +
7es !on)amentau% )u )veloppement asp.net HG&1'"
1. lecture )u compteur
". ncrmentaton )u compteur
F. rcrture )u compteur
?n appelle une telle s/uence )e co)e1 une s/uence crt/ue. Elle ncesste une sDnchronsaton )es threa)s amens = l,e%cuter )e
!aLon smultane. 7a palte-!orme .NET o!!re )vers outls pour assurer celle-c. Nous allons c utlser la classe O8ute%Q.
Nous n,utlserons c /ue les constructeurs et mtho)es suvants +
public Mutex()
cre un o-9et )e sDnchronsaton 8
public bool WaitOne()
7e threa) T1 /u e%cute l,opraton =.Fait8ne() )eman)e la proprt )e l,o-9et )e
sDnchronsaton 8. S le 8ute% 8 n,est )tenu par aucun threa) :le cas au )part;1 l est >)onn> au
threa) T1 /u l,a )eman). S un peu plus tar)1 un threa) T" !at la m4me opraton1 l sera -lo/u.
En e!!et1 un 8ute% ne peut appartenr /u,= un threa). (l sera )-lo/u lors/ue le threa) T1 l-.rera
le mute% 8 /u,l )tent. Pluseurs threa)s peuvent ans 4tre -lo/us en attente )u 8ute% 8.
public void
ReleaseMutex()
7e threa) T1 /u e!!ectue l,opraton =.Release=ute"() a-an)onne la proprt )u 8ute% 8. 7ors/ue
le threa) T1 per)ra le processeur1 le sDst.me pourra le )onner = l,un )es threa)s en attente )u
8ute% 8. Kn seul l,o-ten)ra = son tour1 les autres en attente )e 8 restant -lo/us
Kn 8ute% 8 g.re l,acc.s = une ressource partage B. Kn threa) )eman)e la ressource B par =.Fait8ne() et la ren) par
=.Release=ute"(). Kne secton crt/ue )e co)e /u ne )ot 4tre e%cute /ue par un seul threa) = la !os est une ressource partage.
7a sDnchronsaton ),e%cuton )e la secton crt/ue peut se !are ans +
M.WaitOne()
' le thread est seul entrer ici
' section critique
....
M.ReleaseMutex()
o6 8 est un o-9et =ute". (l !aut -en s\r ne 9amas ou-ler )e l-rer un =ute" )evenu nutle1 a!n /u,un autre threa) pusse entrer
)ans la secton crt/ue = son tour1 snon les threa)s en attente ),un 8ute% 9amas l-r n,auront 9amas acc.s au processeur. Par
alleurs1 l !aut vter la stuaton ),nter-locage :'ea'loc+; )ans la/uelle )eu% threa)s s,atten)ent mutuellement. *ons)rons les
actons suvantes /u se suvent )ans le temps +
un threa) T1 o-tent la proprt ),un 8ute% 81 pour avor acc.s = une ressource partage B1
un threa) T" o-tent la proprt ),un 8ute% 8" pour avor acc.s = une ressource partage B"
le threa) T1 )eman)e le 8ute% 8". (l est -lo/u.
le threa) T" )eman)e le 8ute% 81. (l est -lo/u.
(c1 les threa)s T1 et T" s,atten)ent mutuellement. *e cas apparaVt lors/ue )es threa)s ont -eson )e )eu% ressources partages1 la
ressource B1 contr<le par le 8ute% 81 et la ressource B" contr<le par le 8ute% 8". Kne soluton poss-le est )e )eman)er les
)eu% ressources en m4me temps = l,a)e ),un 8ute% un/ue 8. 8as ce n,est pas tou9ours poss-le1 notamment s cela entraVne une
mo-lsaton longue ),une ressource co\teuse. Kne autre soluton est /u,un threa) aDant 81 et ne pouvant o-tenr 8"1 relYche alors
81 pour vter l,nter-locage.
S nous mettons en prat/ue ce /ue nous venons ),appren)re1 notre applcaton )event la suvante +
les !chers Oglo-al.asa%Q et Oman.asp%Q ne changent pas
le !cher Oglo-al.asa%.v-Q )event le suvant +
Imports System
Imports System.Web
Imports System.Web.SessionState
Imports System.Threading
7es !on)amentau% )u )veloppement asp.net HS&1'"
Public Class global
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque l'application est dmarre
' init compteur de clients
Application.Item("nbRequtes") = 0
' cration d'un verrou de s"nchronisation
Application.Item("verrou") = New Mutex
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' e dclenche lorsque la session est dmarre
' init compteur de requtes
Session.Item("nbRequtes") = 0
End Sub
End Class
7a seule nouveaut est la craton ),un O8ute%Q /u sera utls par les clents pour se sDnchronser. Parce /u,l )ot 4tre
access-le = tous les clents1 l est plac )ans l,o-9et OApplcatonQ.
le !cher Oman.asp%.v-Q )event le suvant +
Imports System.Threading
Public Class main
Inherits System.Web.UI.Page
Protected nbRequtesApplication As Integer
Protected nbRequtesClient As Integer
Protected jeton As String
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
' une requte de plus pour l'application et la session
' on entre dans une section critique # on rcupre le verrou de s"nchronisation
Dim verrou As Mutex = CType(Application.Item("verrou"), Mutex)
' on demande entrer seul dans la section critique qui suit
verrou.WaitOne()
' lecture compteurs
nbRequtesApplication = CType(Application.Item("nbRequtes"), Integer)
nbRequtesClient = CType(Session.Item("nbRequtes"), Integer)
' attente ! s
Thread.Sleep(5000)
' incrmentation des compteurs
nbRequtesApplication += 1
nbRequtesClient += 1
' enregistrement des compteurs
Application.Item("nbRequtes") = nbRequtesApplication
Session.Item("nbRequtes") = nbRequtesClient
' on permet l'accs la section critique
verrou.ReleaseMutex()
' init variables de prsentation
jeton = Session.SessionID
End Sub
End Class
?n vot /ue le clent +
)eman)e = entrer seul )ans la secton crt/ue. (l )eman)e pour cela la proprt e%clusve )u 8ute% OverrouQ
l l-.re le 8ute% OverrouQ = la !n )e la secton crt/ue a!n /u,un autre clent pusse entrer = son tour )ans la
secton crt/ue.
Nous testons l,applcaton en plaLant les /uatre !chers prc)ents )ans un )osser /ue nous appelons Mapplcaton-pathN et nous
lanLons le serveur *assn avec les param.tres :Mapplcaton-pathN1&aspnet&0e-applc;. Nous prparons )eu% navgateurs
)!!rents avec l,url Ohttp+&&localhost&aspnet&0e-applc&man.asp%Q. Nous lanLons le premer pour /u,l )eman)e l,KB7 pus1 sans
atten)re la rponse /u arrvera H secon)es plus tar)1 on lance le secon) navgateur. Au -out ),un peu plus )e H secon)es1 on
o-tent le rsultat suvant +
7es !on)amentau% )u )veloppement asp.net H'&1'"
*ette !os-c1 le compteur )e re/u4tes )e l,applcaton est correct.
?n reten)ra )e cette longue )monstraton1 l,a-solue ncesst )e sDnchronser les clents ),une m4me applcaton 0e-1 s,ls
)ovent mettre = 9our )es lments partags par tous les clents.
3.1.3.' .estion du 9eton de session
Nous avons parl )e nom-reuses !os )u 9eton )e sesson /ue s,changeat le clent et le serveur 0e-. Bappelons son prncpe +
le clent !at une prem.re re/u4te au serveur. (l n,envoe pas )e 9eton )e sesson.
= cause )e l,a-sence )u 9eton )e sesson )ans la re/u4te1 le serveur reconnaVt un nouveau clent et lu a!!ecte un 9eton. A ce
9eton1 est galement assoc un o-9et OSessonQ /u sera utls pour stoc[er )es n!ormatons propres = ce clent. 7e 9eton
va suvre toutes les re/u4tes )e ce clent. (l sera nclus )ans les ent4tes 3TTP )e la rponse !ate = la prem.re re/u4te )u
clent.
le clent connaVt mantenant son 9eton )e sesson. (l va le renvoDer )ans les ent4tes 3TTP )e chacune )es re/u4tes
suvantes /u,l va !are au serveur 0e-. ArYce au 9eton1 le serveur pourra retrouver l,o-9et OSessonQ attach au clent.
Pour mettre en v)ence ce mcansme1 nous reprenons l,applcaton prc)ente en ne mo)!ant /ue le seul !cher Oman.asp%.v-Q +
Imports System.Threading
Public Class main
Inherits System.Web.UI.Page
Protected nbRequtesApplication As Integer
Protected nbRequtesClient As Integer
Protected jeton As String
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
' une requte de plus pour l'application et la session
' on entre dans une section critique # on rcupre le verrou de s"nchronisation
Dim verrou As Mutex = CType(Application.Item("verrou"), Mutex)
' on demande entrer seul dans la section qui suit
verrou.WaitOne()
' lecture compteurs
nbRequtesApplication = CType(Application.Item("nbRequtes"), Integer)
nbRequtesClient = CType(Session.Item("nbRequtes"), Integer)
' attente ! s
Thread.Sleep(5000)
' incrmentation des compteurs
nbRequtesApplication += 1
nbRequtesClient += 1
' enregistrement des compteurs
Application.Item("nbRequtes") = nbRequtesApplication
Session.Item("nbRequtes") = nbRequtesClient
' on permet l'accs la section critique
verrou.ReleaseMutex()
' init variables de prsentation
jeton = Session.SessionID
End Sub
7es !on)amentau% )u )veloppement asp.net I#&1'"
Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Init
' on mmorise la requte du client dans request.txt du dossier de l'application
Dim requestFileName As String = Me.MapPath(Me.TemplateSourceDirectory) + "\request.txt"
Me.Request.SaveAs(requestFileName, True)
End Sub
End Class
7ors/ue se pro)ut l,vnement OPageb(ntQ1 nous sauvegar)ons la re/u4te )u clent )ans le )osser )e l,applcaton. Bappelons
/uel/ues ponts +
OTemplateSourceDrectorDQ reprsente le chemn vrtuel )e la page en cours ),e%cuton1
8apPath:TemplateSourceDrectorD; reprsente le chemn phDs/ue correspon)ant. *ec nous permet )e construre le
chemn phDs/ue )u !cher = construre1
OBe/uestQ est un o-9et reprsentant la re/u4te en cours )e tratement. *et o-9et a t construt en e%plotant la re/u4te
-rute envoDe par le clent1 c.a.). une sute )e lgnes )e te%te )e la !orme +
Be/uest.Save:O]leNameQ; sauvegar)e la totalt )e la re/u4te )u clent :ent4tes 3TTP et ventuellement le )ocument /u
sut; )ans un !cer )ont le chemn est pass en param.tre.
Nous pourrons )onc savor e%actement /uelle a t la re/u4te )u clent. Nous testons l,applcaton en plaLant les /uatre !chers
prc)ents )ans un )osser /ue nous appelons Mapplcaton-pathN et nous lanLons le serveur *assn avec les param.tres
:Mapplcaton-pathN1&aspnet&sesson1;. Pus avec un navgateur1 nous )eman)ons l,KB7
Ohttp+&&localhost&aspnet&sesson1&man.asp%Q. Nous o-tenons le rsultat suvant +
Nous utlsons le !cher Ore/uest.t%tQ sauvegar) par Oman.asp%.v-Q pour avor acc.s = la re/u4te )u navgateur +
GET /aspnet/session1/main.aspx HTTP/1.1
Cache-Control: max-age=0
Connection: keep-alive
Keep-Alive: 300
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7b) Gecko/20040316
Nous constatons /ue le navgateur a !at la )eman)e )e l,KB7 O&aspnet&sesson1&man.asp%Q1 envoD ),autres n!ormatons )ont
nous avons )9= parl )ans le prc)ent chaptre. ?n n,D vot pas )e 9eton )e sesson. 7a page reLue en rponse1 montre elle /ue le
serveur a cr un 9eton )e sesson. ?n ne sat pas encore s le navgateur l,a reLu. ]asons mantenant une secon)e re/u4te avec le
m4me navgateur :Beloa);. Nous o-tenons la nouvelle rponse suvante +
7es !on)amentau% )u )veloppement asp.net I1&1'"
Document
Ent4tes 3TTP
lgne v)e
(l D a -en un suv )e sesson pus/ue le nom-re )e re/u4tes )e la sesson a t correctement ncrment. VoDons mantenant le
contenu )u !cher Ore/uest.t%tQ +
GET /aspnet/session1/main.aspx HTTP/1.1
Cache-Control: max-age=0
Connection: keep-alive
Keep-Alive: 300
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Cookie: ASP.NET_SessionId=y153tk45sise0lrhdzrf22m3
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7b) Gecko/20040316
?n constate /ue1 pour cette )eu%.me re/u4te1 le navgateur a envoD au serveur un nouvel ent4te 3TTP O*oo[e+Q )!nssant une
n!ormaton appele OASP.NETbSesson()Q et aDant pour valeur le 9eton )e sesson /u,on a vu apparaVtre )ans la rponse = la
prem.re re/u4te. ArYce = ce 9eton1 le serveur 0e- va connecter cette nouvelle re/u4te = l,o-9et OSessonQ )ent! par le 9eton
OD1HFt[$Hsse#lrh)5r!""mFQ et retrouver le compteur )e re/u4tes assoc.
?n ne sat tou9ours pas par /uel mcansme1 le serveur a envoD le 9eton au clent car nous n,avons pas acc.s = la rponse 3TTP )u
serveur. Bappelons /ue celle-c a la m4me structure /ue la )eman)e )u clent1 = savor un ensem-le )e lgnes )e te%te )e la !orme +
Nous avons eu l,occason ),utlser un clent 0e- /u nous )onnat acc.s = la rponse 3TTP )u serveur 0e-1 le clent curl. Nous
l,utlsons )e nouveau1 )ans une !en4tre )os1 pour nterroger la m4me url /ue le navgateur prc)ent +
E:\curl>curl --include http://localhost/aspnet/session1/main.aspx
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 07:31:42 GMT
X-AspNet-Version: 1.1.4322
Set-Cookie: ASP.NET_SessionId=qxnxmqmvhde3al55kzsmx445; path=/
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 228
Connection: Close
<HTML>
<HEAD>
<title>application-session</title>
</HEAD>
<body>
jeton de session :
qxnxmqmvhde3al55kzsmx445
<br>
requtes Application :
3
<br>
requtes Client :
1
7es !on)amentau% )u )veloppement asp.net I"&1'"
Document
Ent4tes 3TTP
lgne v)e
<br>
</body>
</HTML>
Nous avons la rponse = notre /ueston. 7e serveur 0e- envoe le 9eton )e sesson sous la !orme ),un ent4te 3TTP OSet-*oo[e+Q +
Set-Cookie: ASP.NET_SessionId=qxnxmqmvhde3al55kzsmx445; path=/
]asons la m4me )eman)e sans renvoDer le 9eton )e sesson. ?n o-tent la rponse suvante +
E:\curl>curl --include http://localhost/aspnet/session1/main.aspx
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 07:36:06 GMT
X-AspNet-Version: 1.1.4322
Set-Cookie: ASP.NET_SessionId=cs2p12mehdiz5v55ihev1kaz; path=/
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 228
Connection: Close
<HTML>
<HEAD>
<title>application-session</title>
</HEAD>
<body>
jeton de session :
cs2p12mehdiz5v55ihev1kaz
<br>
requtes Application :
4
<br>
requtes Client :
1
<br>
</body>
</HTML>
Parce /ue nous n,avons pas renvoD le 9eton )e sesson1 le serveur n,a pas pu nous )ent!er et nous a re)onn un nouveau 9eton.
Pour poursuvre une sesson commence1 le clent )ot renvoDer au serveur le 9eton )e sesson /u,l areLu. Nous allons le !are c en
utlsant l,opton O--coo[e clTvaleurQ )e curl /u va gnrer l,ent4te 3TTP O*oo[e+ clTvaleurQ. Nous avons vu /ue le navgateur
avat envoD cet ent4te 3TTP lors )e sa secon)e re/u4te.
E:\curl>curl --include --cookie ASP.NET_SessionId=cs2p12mehdiz5v55ihev1kaz http://localhost/aspnet/session1/main.aspx
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 07:40:20 GMT
X-AspNet-Version: 1.1.4322
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 228
Connection: Close
<HTML>
<HEAD>
<title>application-session</title>
</HEAD>
<body>
jeton de session :
cs2p12mehdiz5v55ihev1kaz
<br>
requtes Application :
5
<br>
requtes Client :
2
<br>
</body>
</HTML>
?n remar/uera pluseurs choses +
le compteur )e re/u4tes clent a -en t ncrment1 montrant par l= /ue le serveur a -en reconnu notre 9eton.
le 9eton )e sesson a!!ch par la page est -en celu /u,on a envoD
7es !on)amentau% )u )veloppement asp.net IF&1'"
le 9eton )e sesson n,est plus )ans les ent4tes 3TTP envoDs par le serveur 0e-. En e!!et1 celu-c ne l,envoe /u,une !os +
lors )e la gnraton )u 9eton au )marrage ),une nouvelle sesson. Kne !os /ue le clent a o-tenu son 9eton1 c,est = lu )e
l,utlser /uan) l le veut pour se !are reconnaVtre.
Ben n,emp4che un clent )e 9ouer avec pluseurs 9etons )e sesson1 comme le montre l,e%emple suvant avec OcurlQ o6 nous utlsons
le 9eton o-tenu lors )e notre prem.re re/u4te :re/u4te nR 1; +
E:\curl>curl --include --cookie ASP.NET_SessionId=qxnxmqmvhde3al55kzsmx445 http://localhost/aspnet/session1/main.aspx
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 07:48:47 GMT
X-AspNet-Version: 1.1.4322
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 228
Connection: Close
<HTML>
<HEAD>
<title>application-session</title>
</HEAD>
<body>
jeton de session :
qxnxmqmvhde3al55kzsmx445
<br>
requtes Application :
6
<br>
requtes Client :
2
<br>
</body>
</HTML>
Eue sgn!e cet e%emple W Nous avons envoD un 9eton o-tenu un peu plus t<t. 7ors/ue le serveur 0e- cre un 9eton1 l le gar)e
tant /ue le clent assoc = ce 9eton contnue = lu envoDer )es re/u4tes. Apr.s un certan temps ),nactvt :"# mn par )!aut avec
((S;1 le 9eton est supprm. 7,e%emple prc)ent montre /ue nous avons utls un 9eton encore act!.
?n peut avor la curost )e vor /uelles ont t les re/u4tes 3TTP )u clent OcurlQ pen)ant toutes ces manpulatons. Nous savons
/u,elles ont t enregstres )ans le !cher Ore/uest.t%tQ. Voc la )ern.re +
GET /aspnet/session1/main.aspx HTTP/1.1
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Cookie: ASP.NET_SessionId=qxnxmqmvhde3al55kzsmx445
Host: localhost
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
?n D trouve -en l,ent4te 3TTP envoDant le 9eton )e sesson.
7es n!ormatons transmses par le serveur va l,ent4te 3TTP OSet-*oo[e+Q sont appeles )es coo@ies. 7e serveur peut utlser ce
mcansme pour transmettre ),autres n!ormatons /ue le 9eton )e sesson. 7ors/ue le serveur S transmet un coo[e = un clent1 l
n)/ue galement la )ure )e ve D )e celu-c et l,KB7 K assoce. *ela sgn!e pour le clent /ue lors/u,l )eman)e au serveur S
une url )e la !orme &K&chemn1 l peut renvoDer le coo[e s,l n,a pas reLu celu-c )epus un temps supreur = D. Ben n,emp4che
un clent )e ne pas o-server ce co)e )e )ontologe. 7es navgateurs eu% le respectent. *ertans navgateurs )onnent acc.s au
contenu )es coo[es /u,ls reLovent. *,est le cas )u navgateur 8o5lla. Voc par e%emple les n!ormatons les au coo[e envoD
par le serveur )ans un e%emple prc)ent +
7es !on)amentau% )u )veloppement asp.net I$&1'"
?n D trouve +
le nom )u coo[e OASP.NETbSesson()Q
sa valeur OD1HF...mFQ
la machne = la/uelle l est assoc OlocalhostQ
l,url = la/uelle l est assoc O&Q
sa )ure )e ve Oat en) o! sessonQ
7e navgateur enverra )onc le 9eton )e sesson = cha/ue !os /u,l )eman)era une KB7 )e la !orme Ohttp+&&localhost&...Q1 c.a.). =
cha/ue !os /u,l )eman)era une url au serveur 0e- )e la machne OlocalhostQ. 7a )ure )e ve )u coo[e est celle )e la sesson. Pour
le navgateur1 cela entraVne /ue le coo[e n,e%pre 9amas. (l l,enverra = cha/ue !os /u,l )eman)era une url )e la machne OlocalhostQ.
Ans s le navgateur reLot le 9eton )e sesson le 9our 21 /u,on le !erme et /u,on le rutlse le len)eman1 l renverra alors le 9eton )e
sesson :/u a t conserv )ans un !cher;. 7e serveur recevra ce 9eton /ue lu n,a plus1 car un 9eton )e sesson a une )ure )e ve
lmte sur le serveur :"# mn sur ((S;. Auss )marrera-t-l une nouvelle sesson.
(l est poss-le ),nh-er l,utlsaton )es coo[es sur un navgateur. Dans ce cas1 le clent reLot -en le 9eton )e sesson mas ne le
renvoe pas ce /u emp4che le suv )e sesson. Pour le montrer1 nous nh-ons l,utlsaton )es coo[es sur notre navgateur :8o5lla
c; +
Par alleurs1 nous supprmons tous les coo[es e%stant +
*ec !at1 nous relanLons le serveur *assn pour repartr )e 5ro et avec le navgateur1 nous )eman)ons )e nouveau l,url
Ohttp+&&localhost&aspnet&sesson1&man.asp%Q +
7es !on)amentau% )u )veloppement asp.net IH&1'"
Begar)ons s notre navgateur a stoc[ un coo[e +
Nous constatons /ue le navgateur n,a pas stoc[ le coo[e )u 9eton )e sesson /ue le serveur lu a envoD. ?n peut )onc s,atten)re
= ce /u,l n,D at pas )e suv )e sesson. Nous re)eman)ons la m4me url :Beloa); +
?n a -en ce /u tat atten)u. 7e navgateur n,a pas renvoD le 9eton )e sesson1 /u,l avat pourtant reLu mas pas stoc[. 7e
serveur a )onc commenc une nouvelle sesson avec un nouveau 9eton. ?n reten)ra )e cet e%emple /ue notre polt/ue )e suv )e
sesson est mse = mal s l,utlsateur a nh- l,utlsaton )es coo[es sur son navgateur. (l D a cepen)ant une autre !aLon /ue les
coo[es1 ),changer le 9eton )e sesson entre serveur et clent. (l est en e!!et poss-le )e sgnaler au serveur 0e- /ue l,applcaton
travalle sans coo[e. *ela se !at au moDen )u !cher )e con!guraton O0e-.con!gQ +
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<system.web>
<sessionState cookieless="true" timeout="10" />
</system.web>
</configuration>
7e !cher )e con!guraton c-)essus n)/ue /ue l,applcaton va travaller sans coo[es :coo[elessT>true>; et /ue la )ure
),nactvt ma%male ),un 9eton )e sesson est )e 1# mn :tmeoutT>1#>;. Apr.s ce )la1 la sesson assoce au 9eton est )trute. 7e
processus ),change )u 9eton )e sesson entre le serveur et le clent va 4tre le suvant +
1. le clent )eman)e l,url Ohttp+&&machne+port&V&chemnQ o6 V est un )osser vrtuel )u serveur 0e-
". le serveur gn.re un 9eton 2 et rpon) au clent )e se re)rger vers l,url Ohttp+&&machne+port&V&:2;&chemnQ. (l a )onc
plac le 9eton )ans l,url = nterroger1 mm)atement )err.re le )osser vrtuel V
F. le clent o-t = cette re)recton et )eman)e la nouvelle KB7 OOhttp+&&machne+port&V&:2;&chemnQ.
$. le serveur rpon) = cette )eman)e et envoe une page )e rponse.
(llustrons ces )!!rents ponts. Nous mettons la totalt )e l,applcaton prc)ente )ans un nouveau )osser Mapplcaton-pathN.
Nous plaLons )ans ce m4me )osser le !cher O0e-.con!gQ prc)ent. Par alleurs1 nous mo)!ons le co)e )e prsentaton
Oman.asp%Q pour D nclure un len +
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<HTML>
<HEAD>
<title>application-session</title>
</HEAD>
<body>
jeton de session :
<% =jeton %>
<br>
requtes Application :
<% =nbRequtesApplication %>
<br>
requtes Client :
<% =nbRequtesClient %>
7es !on)amentau% )u )veloppement asp.net II&1'"
<br>
<a href="main.aspx">Recharger l'application</a>
</body>
</HTML>
*e len ponte sur la page Oman.asp%Q et est )onc /uvalent au -outon :Beloa); )u navgateur. 7e serveur *assn est lanc avec les
param.tres :Mapplcaton-pathN1&sesson";. Nous )rogeons = notre ha-tu)e /u consstat = noter le )osser vrtuel O&aspnet&JJQ.
En e!!et1 = cause )e l,nserton )u 9eton )e sesson )ans l,url1 le )osser vrtuel ne )ot avor /u,un lment &JJ. Nous utlsons tout
),a-or) le clent OcurlQ pour )eman)er l,url Ohttp+&&localhost&sesson"&man.asp%Q +
E:\curl>curl --include http://localhost/session2/main.aspx
HTTP/1.1 302 Found
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 13:52:36 GMT
X-AspNet-Version: 1.1.4322
Location: /session2/(hinadjag3bt0u155g5hqe245)/main.aspx
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 163
Connection: Close
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href='/session2/(hinadjag3bt0u155g5hqe245)/main.aspx'>here
</body></html>
Nous voDons /ue le serveur rpon) par l,ent4te 3TTP O3TTP&1.1 F#" ]oun)Q au leu )e O3TTP&1.1 "## ?XQ. *,est une ent4te
/u )eman)e au clent )e se re)rger vers l,url n)/ue par l,ent4te 3TTP 7ocaton O7ocaton+
&sesson"&:hna)9agF-t#u1HHgHh/e"$H;&man.asp%Q. ?n vot le 9eton )e sesson /u a t nsr )ans l,url )e re)recton. Kn
navgateur recevant cette rponse1 )eman)e la nouvelle url )e !aLon transparente pour l,utlsateur /u ne vot pas la nouvelle
re/u4te. Au cas o6 le navgateur ne g.rerat pas seul la re)recton1 un )ocument 3T87 est envoD )err.re le co)e 3TTP c-
)essus. ?n D trouve un len sur l,url )e re)recton1 len sur le/uel l,utlsateur pourra cl/uer.

8antenant1 !asons la m4me chose avec un navgateur o6 les coo[es ont t nh-s. Nous )eman)ons l= encore1 l,url
Ohttp+&&localhost&sesson"&man.asp%Q. Nous o-tenons la rponse suvante )u serveur +
Tout ),a-or)1 constatons /ue l,url a!!che par le navgateur n,est pas celle /ue nous avons )eman)e. *,est le sgne /u,une
re)recton a eu leu. En e!!et1 le navgateur a!!che tou9ours l,KB7 )u )erner )ocument reLu. S )onc1 l n,a!!che pas l,url
Ohttp+&&localhost&sesson"&man.asp%Q1 c,est /u,on lu a )eman) )e se re)rger vers une autre url. (l peut D avor pluseurs
re)rectons. 7,url a!!che par le navgateur est l,url )e la )ern.re re)recton. Nous pouvons constater /ue le 9eton )e sesson est
prsent )ans l,url a!!che par le navgateur. ?n peut le vor car ce 9eton est galement a!!ch par notre programme )ans la page.
Bappelons le co)e )u len /u a t plac )ans la page +
<a href="main.aspx">Recharger l'application</a>
*,est un len relat! pus/u,l ne commence pas par le sgne & /u en !erat un len a-solu. Belat! = /uo W Pour compren)re ce pont1
l !aut revenr = l,url )u )ocument actuellement a!!ch + Ohttp+&&localhost&sesson"&:guHee$HHp[p!!nHH$eF-1aF";&man.asp%Q. 7es
lens relat!s /u seront trouvs )ans ce )ocument seront relat!s au chemn
Ohttp+&&localhost&sesson"&:guHee$HHp[p!!nHH$eF-1aF";Q. Ans notre len c-)essus est-l /uvalent au len +
<a href=" http://localhost/session2/(gu5ee455pkpffn554e3b1a32)/main.aspx">Recharger l'application</a>
*,est ce /ue nous montre le navgateur s on passe la sours sur le len +
7es !on)amentau% )u )veloppement asp.net IG&1'"
S nous cl/uons sur le len OBecharger l,applcatonQ1 c,est )onc l,url
Ohttp+&&localhost&sesson"&:guHee$HHp[p!!nHH$eF-1aF";&man.asp%Q /u est appele. 7e serveur va )onc recevor le 9eton )e
sesson et pouvor retrouver les n!ormatons /u lu sont les. *,est ce /ue nous montre sa rponse rveur +
Nous reten)rons /ue s nous avons -eson )e !are un suv )e sesson )ans une applcaton 0e- et /ue nous ne sommes pas s\rs
/ue les navgateurs clents )e cette applcaton vont autorser l,utlsaton )es coo[es1 alors
on )ot con!gurer l,applcaton pour /u,elle travalle sans coo[es
les pages )e l,applcaton )ovent comporter )es lens relat!s et non a-solus
'.$ Rcuprer les in#ormations d'une requHte client
3.2.1 Le cyc"e requ<te;r1p$nse #u c"ient;serveur 8e-
Bappelons c le conte%te clent-serveur ),une applcaton 0e- +
7a re/u4te ),un clent pour une applcaton 0e- est trate )e !a !aLon suvante +
1. le clent ouvre une conne%on tcp-p vers un port P )u servce 0e- )e la machne 8 a-rtant l,applcaton 0e-
". l envoe sur cette conne%on une sute )e lgnes )e te%te selon le protocole 3TTP. *et ensem-le )e lgnes !orme ce /u,on
appelle la re/u4te )u clent. Elle a la !orme suvante +
Kne !os la )eman)e envoDe1 le clent va atten)re la rponse.
F. la prem.re lgne )es ent4tes 3TTP prcse l,acton )eman)e au serveur 0e-. Elle peut avor pluseurs !ormes +
7es !on)amentau% )u )veloppement asp.net IS&1'"
clent-1A
clent-"A
Serveur
WEB
glo-al.asa% page-1A.asp% page-"A.asp% .asp%
co)e
ApplcatonA Sesson-1A Sesson-"A
)onnes
APP7(*AT(?N A
Document
Ent4tes 3TTP
lgne v)e
o AET url 3TTP&MversonN1 avec MversonN gal actuellement = 1.# ou 1.1. Dans ce cas1 la re/u4te ne
compren) pas la parte ODocumentQ
o P?ST url 3TTP&MversonN. Dans ce cas1 la re/u4te compren) une parte ODocumentQ1 le plus souvent une lste
),n!ormatons = )estnaton )e l,applcaton 0e-
o PKT url 3TTP&MversonN. 7e clent envoe un )ocument )ans la parte ODocumentQ et veut le stoc[er sur le
serveur = l,a)resse url
7ors/ue le clent souhate transmettre )es n!ormatons = l,applcaton 0e- = la/uelle l s,est connect1 l )spose
prncpalement )e )eu% moDens +
o sa )eman)e est OAET urlbenrche 3TTP&MversonNQ o6 urlbenrche est )e la !orme
OurlWparam1Tval1`param"Tval"`...Q. 7e clent transmet outre l,url1 une sre ),n!ormatons sous la !orme
OclTvaleurQ.
o sa )eman)e est OP?ST url 3TTP&MversonNQ. Dans la parte ODocumentQ1 l transmet )es n!ormatons sous la
m4me !orme /ue prc)emment + Oparam1Tval1`param"Tval"`...Q.
$. sur le serveur1 l,ensem-le )e la chaVne )e tratement )e la re/u4te )u clent a acc.s = celle-c va un o-9et glo-al appel
Request. 7e serveur 0e- a plac )ans cet o-9et la totalt )e la re/u4te )u clent sous une !orme /ue nous allons
)couvrr. 7,applcaton sollcte va trater cet o-9et et construre une rponse au clent. *elle-c est )spon-le )ans un
o-9et glo-al appel Response. 7e r<le )e l,applcaton 0e- est )e construre un o-9et OResponseQ = partr )e l,o-9et
ORequestQ reLu. 7a chaVne )e tratement )spose galement )es o-9ets glo-au% O4pplicationQ et O&essionQ )ont nous
avons )9= parl et /u vont lu permettre )e partager )es )onnes entre clents )!!rents :Applcaton; ou entre re/u4tes
successves ),un m4me clent :Sesson;.
H. l,applcaton va envoDer sa rponse au serveur au moDen )e l,o-9et OBesponseQ. *elle-c1 une !os sur le rseau aura la !orme
3TTP suvante +
Kne !os cette rponse envoDe1 le serveur va !ermer la conne%on rseau en rcepton :sau! s le clent lu a )t )e ne pas le
!are;.
I. le clent va recevor la rponse et va !ermer = son tour la conne%on :en msson;. *e /u sera !at )e cette rponse )pen)
)u tDpe )u clent. S celu-c est un navgateur1 et /ue le )ocument reLu est un )ocument 3T871 celu-c sera a!!ch. S le
clent est un programme1 la rponse va 4tre analDse et e%plote.
G. 7e !at /u,apr.s le cDcle re/u4te-rponse1 la conne%on /u lat le clent au serveur sot !erme !at )u protocole 3TTP un
protocole sans tat. 7ors )e la re/u4te suvante1 le clent ta-lra une nouvelle conne%on rseau au m4me serveur. Du !at
/ue ce n,est plus la m4me conne%on rseau1 le serveur n,a aucune poss-lt :au nveau tcp-p et 3TTP; )e ler cette
nouvelle conne%on = une prc)ente. *,est le sDst.me )u 9eton )e sesson /u permettra ce len.
3.2.2 !1cup1rer "es in:$r2ati$ns trans2ises par "e c"ient
Nous e%amnons mantenant certanes proprts et mtho)es )e l,o-9et OBe/uestQ /u permet au co)e )e l,applcaton ),avor acc.s
= la re/u4te )u clent et )onc au% n!ormatons /u,l a transmses. 7,o-9et OBe/uestQ est )e tDpe O3ttpBe/uestQ +
*ette classe a )e nom-reuses proprts et mtho)es. Nous nous ntressons au% proprts 5ttp%ethod1 Iuer*&trin1 Jorm et
(arams /u vont nous permettre ),avor acc.s au% lments )e la chaVne ),n!ormatons Oparam1Tval1`param"Tval"`...Q.
HttpMethod as String
mtho)e )e re/u4te )u clent + AET1 P?ST1 3EAD1 ...
QueryString as
NameValueCollection
collecton )es lments )e la chaVne )e re/u4te param1Tval1`param"Tval"`.. )e la 1.re
lgne 3TTP Omtho)eQWparam1Tval1`param"Tval"`... o6 Omtho)eQ peut 4tre AET1
P?ST1 3EAD.
Form as NameValueCollection
collecton )es lments )e la chaVne )e re/u4te param1Tval1`param"Tval"`.. se trouvant
)ans la parte ODocumentQ )e la re/u4te :mtho)e P?ST;.
Params as NameValueCollection
rassem-le pluseurs collectons + EuerDStrng1 ]orm1 ServerVara-les1 *oo[es au sen
),une un/ue collecton.
7es !on)amentau% )u )veloppement asp.net I'&1'"
Document
Ent4tes 3TTP
lgne v)e
3.2.3 xe2p"e 1
8ettons en oeuvre ces lments sur un premer e%emple. 7,applcaton n,aura /u,un lment Oman.asp%Q. 7e co)e )e prsentaton
Oman.asp%Q sera le suvant +
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<html>
<head>
<title>Requte client</title>
</head>
<body>
Requte :
<% = mthode %>
<br />
nom :
<% = nom %>
<br />
ge :
<% = age %>
<br />
</body>
</html>
7a page a!!che tros n!ormatons Omtho)e1 nom1 ageQ calcules par sa parte contr<leur Oman.asp%.v-Q +
Public Class main
Inherits System.Web.UI.Page
Protected nom As String = "xx"
Protected age As String = "yy"
Protected mthode As String
Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Init
' on mmorise la requte du client dans request.txt du dossier de l'application
Dim requestFileName As String = Me.MapPath(Me.TemplateSourceDirectory) + "\request.txt"
Me.Request.SaveAs(requestFileName, True)
End Sub
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre les paramtres de la requte
mthode = Request.HttpMethod.ToLower
If Not Request.QueryString("nom") Is Nothing Then nom = Request.QueryString("nom").ToString
If Not Request.QueryString("age") Is Nothing Then age = Request.QueryString("age").ToString
If Not Request.Form("nom") Is Nothing Then nom = Request.Form("nom").ToString
If Not Request.Form("age") Is Nothing Then age = Request.Form("age").ToString
End Sub
End Class
7ors/ue la page est charge :]ormb7oa);1 les n!ormatons Onom1 ageQ sont rcupres )ans la re/u4te )u clent. ?n les recherche
)ans les )eu% colllectons OEuerDStrngQ et O]ormQ. . Par alleurs1 )ans OPageb(ntQ1 nous mmorsons la re/u4te )u clent a!n )e
pouvor vr!er ce /u,l a envoD. Nous plaLons ces )eu% !chers )ans un )osser Mapplcaton-pathN et nous lanLons le serveur
*assn avec les param.tres :Mapplcaton-pathN1&re/uest1;1 pus avec un navgateur nous )eman)ons l,url
Ohttp+&&localhost&re/uest1&man.asp%WnomTtntn`ageT"GQ . Nous o-tenons la rponse suvante +
7es n!ormatons transmses par le clent ont t rcupres correctement. 7a re/u4te )u navgateur mmorse )ans le !cher
Ore/uest.t%tQ est la suvante +
GET /request1/main.aspx?nom=tintin&age=27 HTTP/1.1
Cache-Control: max-age=0
Connection: keep-alive
Keep-Alive: 300
7es !on)amentau% )u )veloppement asp.net G#&1'"
Accept: application/x-shockwave-
flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jp
eg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7b) Gecko/20040316
?n vot /ue le navgateur a !at une re/u4te AET. Pour !are une re/u4te P?ST1 nous allons utlser le clent OcurlQ. Dans une
!en4tre Dos1 nous tapons la comman)e suvante +
C:\curl>curl --include --data nom=tintin --data age=27 http://localhost/request1/main.aspx
--include
pour a!!cher les ent4tes 3TTP )e la rponse
--data param=valeur
pour envoDer l,n!ormaton paramTvaleur au moDen ),un P?ST
7a rponse )u serveur est la suvante +
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Fri, 02 Apr 2004 09:27:25 GMT
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 178
Connection: Close
<html>
<head>
<title>Requte client</title>
</head>
<body>
Requte :
post
<br />
nom :
tintin
<br />
ge :
27
<br />
</body>
</html>
7e serveur a -en1 l= encore1 rcupr les param.tres envoDs cette !os-c par un P?ST. Pour s,assurer )e ce )erner pont1 on peut
vr!er le contenu )u !cher Ore/uest.t%tQ +
POST /request1/main.aspx HTTP/1.1
Pragma: no-cache
Content-Length: 17
Content-Type: application/x-www-form-urlencoded
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Host: localhost
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
nom=tintin&age=27
7e clent OcurlQ a -en !at un P?ST. 8antenant1 mlangeons les )eu% mtho)es )e passage ),n!ormaton. Nous mettons OageQ )ans
l,url )eman)e et OnomQ )ans le )ocument post +
E:\curl>curl --include --data nom="tintin" http://localhost/request1/main.aspx?age=27
7a re/u4te envoDe par OcurlQ est la suvante :re/uest.t%t; +
POST /request1/main.aspx?age=27 HTTP/1.1
Pragma: no-cache
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Host: localhost
User-Agent: curl/7.10.8 (win32) libcurl/7.10.8 OpenSSL/0.9.7a zlib/1.1.4
nom=tintin
7es !on)amentau% )u )veloppement asp.net G1&1'"
?n vot /ue l,Yge est pass )ans l,url )eman)e. ?n l,o-ten)ra )ans la collecton OEuerDStrngQ. 7e nom est lu pass )ans le
)ocument envoD = cette url. ?n l,o-ten)ra )ans la collecton O]ormQ. 7a rponse o-tenue par le clent OcurlQ +
<html>
<head>
<title>Requte client</title>
</head>
<body>
Requte :
post
<br />
nom :
tintin
<br />
ge :
27
<br />
</body>
</html>
En!n n,envoDons aucune n!ormaton au serveur +
E:\curl>curl --include http://localhost/request1/main.aspx
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Fri, 02 Apr 2004 12:43:14 GMT
X-AspNet-Version: 1.1.4322
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 173
Connection: Close
<html>
<head>
<title>Requte client</title>
</head>
<body>
Requte :
get
<br />
nom :
xx
<br />
ge :
yy
<br />
</body>
</html>
7e lecteur est nvt = relre le co)e )u contr<leur Oman.asp%.v-Q pour compren)re cette rponse.
3.2.% xe2p"e 2
(l est poss-le pour le clent ),envoDer pluseurs valeurs pour une m4me cl. Ans /u,arrve-t-l s )ans l,e%emple prc)ent on
)eman)e l,url Ohttp+&&localhost&re/uest1&man.asp%WnomTtntn`ageT"G`nomTmlouQ o6 l D a )eu% !os la cl OnomQ W EssaDons
avec un navgateur +
Notre applcaton a -en rcupr les )eu% valeurs assoces = la cl OnomQ. 7,a!!chage est un peu trompeur. (l a t o-tenu par
l,nstructon
If Not Request.QueryString("nom") Is Nothing Then nom = Request.QueryString("nom").ToString
7es !on)amentau% )u )veloppement asp.net G"&1'"
7a mtho)e OToStrngQ a pro)ut la chaVne Otntn1mlouQ /u a t a!!che. Elle cache le !at /u,en ralt l,o-9et
OBe/uest.EuerDStrng:>nom>;Q est un ta-leau )e chaVnes )e caract.res c>tntn>1>mlou>d. 7,e%emple suvant met ce pont en
v)ence. 7a page Oman.asp%Q )e prsentaton sera la suvante +
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<HTML>
<HEAD>
<title>Requte client</title>
</HEAD>
<body>
<P>Informations passes par le client :</P>
<form runat="server">
<P>QueryString :</P>
<P><asp:listbox id="lstQueryString" runat="server" EnableViewState="False" Rows="6"></asp:listbox></P>
<P>Form :</P>
<P><asp:listbox id="lstForm" runat="server" EnableViewState="False" Rows="2"></asp:listbox></P>
</form>
</body>
</HTML>
(l D a )es nouveauts )ans cette page /u utlse ce /u,on appelle )es contr<les serveur. (ls sont caractrss par l,attr-ut
OrunatT>server>Q. (l est trop t<t pour ntro)ure la noton )e contr<le serveur. (l su!!t )e savor /u,c +
/ue la page a )eu% lstes :-alses Masp+lst-o%N;
/ue ces lstes sont )es o-9ets :lstEuerDStrng1 lst]orm; )e tDpe O7stBo%Q /u seront construts par le contr<leur )e la page
/ue ces o-9ets n,ont ),e%stence /u,au sen )u serveur 0e-. Au moment )e la rponse1 ls seront trans!orms en -alses
3T87 class/ues /ue le clent pourra compren)re. Kn o-9et Olst-o%Q sera ans trans!orm :on )t auss ren)u; en -alses
3T87 MselectN et MoptonN.
/ue l,ntr4t prncpal )e ces o-9ets est )e )-arrasser le co)e )e prsentaton )e tout co)e VB1 celu-c restant con!n au
contr<leur.
7e contr<leur Oman.asp%.v-Q charg )e construre les )eu% o-9ets OlstEuerDStrngQ et Olst]ormQ est le suvant +
Imports System.Collections
Imports System
Imports System.Collections.Specialized
Public Class main
Inherits System.Web.UI.Page
Protected WithEvents lstQueryString As System.Web.UI.WebControls.ListBox
Protected WithEvents lstForm As System.Web.UI.WebControls.ListBox
Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Init
' on mmorise la requte du client dans request.txt du dossier de l'application
Dim requestFileName As String = Me.MapPath(Me.TemplateSourceDirectory) + "\request.txt"
Me.Request.SaveAs(requestFileName, True)
End Sub
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' variables locales
Protected infosQueryString As ArrayList
Protected infosForm As ArrayList
' on rcupre toute la collection des informations du $uer"tring
infosQueryString = getValeurs(Request.QueryString)
' on associe les donnes au ListBox
lstQueryString.DataSource = infosQueryString
lstQueryString.DataBind()
' on fait la mme chose avec les donnes du POST
infosForm = getValeurs(Request.Form)
lstForm.DataSource = infosForm
lstForm.DataBind()
End Sub
Private Function getValeurs(ByRef data As NameValueCollection) As ArrayList
' au dpart une liste d'infos vide
Dim infos As New ArrayList
' on rcupre les cls de la collection
Dim cls() As String = data.AllKeys
' on parcourt le tableau des cls
Dim valeurs() As String
For Each cl As String In cls
' valeurs associes la cl
valeurs = data.GetValues(cl)
' une seule valeur %
If valeurs.Length = 1 Then
infos.Add(cl + "=" + valeurs(0))
Else
7es !on)amentau% )u )veloppement asp.net GF&1'"
' plusieurs valeurs
For ivalue As Integer = 0 To valeurs.Length - 1
infos.Add(cl + "(" + ivalue.ToString + ")=" + valeurs(ivalue))
Next
End If
Next
' on rend le rsultat
Return infos
End Function
End Class
7es ponts mportants )e ce co)e sont les suvants +
)ans O]ormb7oa)Q la page rcup.re les )eu% collecton OEuerDStrngQ et O]ormQ. Elle utlse une !oncton OgetValeursQ pour
mettre le contenu )e ces )eu% collectons )ans )eu% o-9ets )e tDpe OArraD7stQ /u conten)ront )es chaVnes )e caract.res
)u tDpe OclTvaleurQ s la cl )e la collecton est assoce = une un/ue valeur ou Ocl:;TvaleurQ s la cl est assoce =
pluseurs valeurs.
chacun )es o-9ets OArraD7stQ est attach ensute = l,un )es o-9ets O7stBo%Q )e la page )e prsentaton au moDen )e )eu%
nstructons +
o O7stBo%.DataSourceTArraD7stQ et O7stBo%.DataBn)Q. *ette )ern.re nstructon trans!.re les lments )e
ODataSourceQ )ans la collecton O(temsQ )e l,o-9et O7stBo%Q
on remar/uera /u,aucun )es )eu% o-9ets O7stBo%Q n,est cr e%plctement par une opraton ONe0Q. ?n en ))ura /u,en
prsence )e la -alse Masp+lst-o% )T>%%>N...Masp+lst-o%&N1 le serveur 0e- cre lu-m4me l,o-9et O7stBo%Q r!renc par
l,att-ut O)Q )e la -alse.
la !oncton OgetValeursQ e%plote l,o-9et )e tDpe ONameValue*ollectonQ /u,on lu passe en param.tre pour pro)ure un
rsultat )e tDpe OArraD7stQ.
Nous plaLons les )eu% !chers prc)ents )ans un )osser Mapplcaton-pathN et nous lanLons le serveur *assn avec les
param.tres :Mapplcaton-pathN1&re/uest";1 pus nous )eman)ons l,url
Ohttp+&&localhost&re/uest"&man.asp%WnomTtntn`ageT"GQ. Nous o-tenons la rponse suvante +
Nous )eman)ons mantenant une url o6 la cl OnomQ est prsente )eu% !os +
Nous constatons /ue l,o-9et OBe/uest.EuerDStrng:>nom>;; tat -en un ta-leau. (c1 les re/u4tes taent !ates par une mtho)e
AET. Nous utlsons le clent OcurlQ pour !are une re/u4te P?ST +
7es !on)amentau% )u )veloppement asp.net G$&1'"
E:\curl>curl --data nom=milou --data nom=tintin --data age=14 --data age=27 http://localhost/request2/main.aspx
<HTML>
<HEAD>
<title>Requte client</title>
</HEAD>
<body>
<P>Informations passes par le client :</P>
<form name="_ctl0" method="post" action="main.aspx" id="_ctl0">
<input type="hidden" name="__VIEWSTATE" value="dDwtMTI3MjA1MzUzMTs7PtCDC7NG4riDYIB4YjyGFpVAAviD" />
<P>QueryString :</P>
<P><select name="lstQueryString" size="6" id="lstQueryString">
</select></P>
<P>Form :</P>
<P><select name="lstForm" size="2" id="lstForm">
<option value="nom(0)=milou">nom(0)=milou</option>
<option value="nom(1)=tintin">nom(1)=tintin</option>
<option value="age(0)=14">age(0)=14</option>
<option value="age(1)=27">age(1)=27</option>
</select></P>
</form>
</body>
</HTML>
?n peut vor /ue le clent reLot -en )u co)e 3T87 class/ue pour les )eu% lstes )e la page. ?n vot apparaVtre )es n!ormatons
/u,on n,a pas mses nous-m4mes telles le champ cach ObV(EWSTATEQ. *es n!ormatons ont t gnres par les -alses Masp+%%
runatT>serverN. Nous )evrons appren)re = maVtrser celles-c.
'.' %ise en oeu"re d'une architecture %AC
3.3.1 Le c$ncept
Termnons ce long chaptre par la mse en oeuvre ),une applcaton construte selon le mo).le 8V* :8o)el-Ve0-*ontroller;. Kne
applcaton 0e- archtecture selon ce mo).le ressem-le = cec +
le clent a)resse ses re/u4tes = une entt partcul.re )e l,applcaton appele le contr<leur
le contr<leur analDse la re/u4te )u clent et la !at e%cuter. Pour cela l se !at a)er par )es classes regroupant la log/ue
mter )e l,applcaton et )es classes ),acc.s au% )onnes.
selon le rsultat )e l,e%cuton )e la re/u4te1 le contr<leur chost ),envoDer une certane page en rponse au clent
Dans ce mo).le1 toutes les re/u4tes passent par un un/ue contr<leur /u est le che! ),orchestre )e toute l,applcaton 0e-. 7,ntr4t
)e ce mo).le est /u,on peut regrouper )ans le contr<leur tout ce /u )ot 4tre !at avant cha/ue re/u4te. Supposons par e%emple
/ue l,applcaton ncesste une authent!caton. *elle-c est !ate une un/ue !os. Kne !os russe1 l,applcaton va mettre )ans la
sesson1 )es n!ormatons les = l,utlsateur /u vent )e s,authent!er. *omme un clent peut appeler )rectement une page )e
l,applcaton sans s,authent!er1 cha/ue page )evra )onc vr!er )ans la sesson /ue l,authent!caton a -en t !ate. S toutes les
re/u4tes passent par un un/ue contr<leur1 c,est lu /u peut !are ce traval. 7es pages = /u la re/u4te sera ventuellement passe
n,auront pas = le !are.
7es !on)amentau% )u )veloppement asp.net GH&1'"
*lasses
mter
*ontr<leur
page1
(nter!ace
clent
Sources )e
)onnes
pagen
7og/ue applcatve *lent Donnes
*lasses
),acc.s
)onnes
23/1
%/3ELE
C04T56L/35
3.3.2 +$ntr0"er une app"icati$n M.+ sans sessi$n
De ce /ue nous avons vu 9us/u,c1 on peut penser /ue le !cher Oglo-al.asa%Q pourrat 9ouer le r<le )u contr<leur. En e!!et1 on sat
/ue toutes les re/u4tes passent par lu. (l est )onc -en plac pour tout contr<ler. 7,applcaton /u sut l,utlse = cette !n. Son
chemn vrtuel sera Ohttp+&&localhost&mvc1Q. Pour n)/uer ce /u,l veut1 le clent passera )err.re l,url un param.tre actonTvaleur.
Selon la valeur )u param.tre OactonQ1 le contr<leur Oglo-al.asa%Q )rgera la re/u4te vers une page partcul.re +
1. Oman.asp%Q s leparam.tre acton n,est pas )!n ou s actonTman
". Oacton1.asp%Q s actonTacton1
F. Onconnu.asp%Q s acton ne tom-e pas )ans les cas 1 et "
7es pages Oman.asp%1 acton1.asp%1 nconnu.asp%Q se contentent ),a!!cher la valeur )e OactonQ /u a provo/u leur a!!chage. Nous
lstons c-)essous les hut !chers )e cette applcaton et nous les commentons lors/ue c,est ncessare +
Oglo-al.asa%Q
<%@ Application src="Global.asax.vb" Inherits="Global" %>
Oglo-al.asa%.v-Q
Imports System
Imports System.Web
Imports System.Web.SessionState
Public Class Global
Inherits System.Web.HttpApplication
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' on rcupre l'action faire
Dim action As String
If Request.QueryString("action") Is Nothing Then
action = "main"
Else
action = Request.QueryString("action").ToString.ToLower
End If
' on met l'action dans le contexte de la requte
Context.Items("action") = action
' on excute l'action
Select Case action
Case "main"
Server.Transfer("main.aspx", True)
Case "action1"
Server.Transfer("action1.aspx", True)
Case Else
Server.Transfer("inconnu.aspx", True)
End Select
End Sub
End Class
7es ponts = noter +
nous nterceptons toutes les re/u4tes )u clent )ans la proc)ure OApplcatonbBegnBe/uestQ /u est automat/uement
e%cute au )marrage )e cha/ue nouvelle re/u4te !ate = l,applcaton.
)ans cette proc)ure1 nous avons acc.s = l,o-9et OBe/uestQ /u est l,mage )e la re/u4te 3TTP )u clent. *omme nous
atten)ons une url )e la !orme Ohttp+&&localhost&mvc1&man.asp%WactonT%%Q1 nous cherchons une cl OactonQ )ans la
collecton OBe/uest.EuerDStrngQ. S elle n,D est pas1 on !%e par )!aut OactonQ gal = OmanQ.
la valeur )u param.tre OactonQ est place )ans l,o-9et O*onte%tQ. *omme les o-9ets OApplcaton1 Sesson1 Be/uest1
Besponse1 ServerQ1 cet o-9et est glo-al et access-le )ans tout co)e. *et o-9et est pass )e page en page s la re/u4te est
trate par pluseurs pages comme cela va 4tre le cas c. (l est supprm ).s /ue la rponse a t envoDe au clent. Sa
)ure )e ve est )onc celle )u tratement )e la re/u4te.
selon la valeur )u param.tre OactonQ1 on passe la re/u4te = la page appropre. Pour cela on utlse l,o-9et glo-al OServerQ
/u grYce = sa mtho)e permet )e trans!rer la re/u4te courante = une autre page. Son premer param.tre est le nom )e la
page c-le1 le secon) un -oolen n)/uant s on )ot ou non trans!rer = la page c-le les collectons OEuerDStrngQ et
O]ormQ. (c1 c,est ou.
7es !chers Oman.asp%Q et Oman.asp%.v-Q +
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<HTML>
<head>
<title>main</title></head>
<body>
<h3>Page [main]</h3>
Action : <% =action %>
</body>
7es !on)amentau% )u )veloppement asp.net GI&1'"
</HTML>
Public Class main
Inherits System.Web.UI.Page
Protected action As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre l'action en cours
action = Me.Context.Items("action").ToString
End Sub
End Class
7e contr<leur Oman.asp%.v-Q se contente )e rcuprer la valeur )e la cl OactonQ )ans le conte%te1 cette valeur tant a!!che par le
co)e )e prsentaton. ?n cherche c = montrer le passage )e l,o-9et O*onte%tQ entre )!!rentes pages tratant une m4me re/u4te
clent. 7es pages Oacton1.asp%Q et Onconnu.asp%Q ont un !onctonnement analogue +
Oacton1.asp%Q
<%@ Page src="action1.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="action1" %>
<HTML>
<head>
<title>action1</title></head>
<body>
<h3>Page [action1]</h3>
Action : <% =action %>
</body>
</HTML>
Oacton1.asp%.v-Q
Public Class action1
Inherits System.Web.UI.Page
Protected action As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre l'action en cours
action = Me.Context.Items("action").ToString
End Sub
End Class
Onconnu.asp%Q
<%@ Page src="inconnu.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="inconnu" %>
<HTML>
<head>
<title>inconnu</title></head>
<body>
<h3>Page [inconnu]</h3>
Action : <% =action %>
</body>
</HTML>
Onconnu.asp%.v-Q
Public Class inconnu
Inherits System.Web.UI.Page
Protected action As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre l'action en cours
action = Me.Context.Items("action").ToString
End Sub
End Class
Pour tester1 les )ocuments prc)ents sont placs )ans un )osser Mapplcaton-pathN et *assn lanc avec les param.tres
:Mapplcaton-pathN1&mvc1;. Nous )eman)ons l,url Ohttp+&&localhost&mvc1&man.asp%Q +
7es !on)amentau% )u )veloppement asp.net GG&1'"
7a re/u4te n,a envoD aucun param.tre OactonQ. 7e co)e )u contr<leur )e l,applcaton Oglo-al.asa%.v-Q a !at )lvrer la page
Oman.asp%Q. 8antenant nous )eman)ons l,url Ohttp+&&localhost&mvc1&man.asp%WactonTacton1Q +
7e co)e )u contr<leur )e l,applcaton Oglo-al.asa%.v-Q a !at )lvrer la page Oacton1.asp%Q. 8antenant nous )eman)ons l,url
Ohttp+&&localhost&mvc1&man.asp%WactonT%%Q +
7,acton n,a pas t reconnue et le contr<leur Oglo-al.asa%.v-Q a !at )lvrer la page Onconnu.asp%Q.
3.3.3 +$ntr0"er une app"icati$n M.+ avec sessi$n
7a plupart )u temps1 les )!!rentes re/u4tes ),un clent pour une applcaton )ovent se partager )es n!ormatons. ?n a vu une
soluton poss-le = ce pro-l.me + stoc[er les n!ormatons = partager )ans l,o-9et OSessonQ )e la re/u4te. *et o-9et est en e!!et
partag par toutes les re/u4tes et est capa-le )e mmorser )es n!ormatons sous la !orme :cl1valeur; ou cl est )e tDpe OStrngQ et
valeur est tout tDpe )rv )e O?-9ectQ.
Dans l,e%emple prc)ent1 les )!!rentes pages assoces au% )!!rentes actons taent appeles )ans la proc)ure
OApplcatonbBegnBe/uestQ )u !cher Oglo-al.asa%.v-Q +
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' on rcupre l'action faire
Dim action As String
If Request.QueryString("action") Is Nothing Then
action = "main"
Else
action = Request.QueryString("action").ToString.ToLower
End If
' on met l'action dans le contexte de la requte
Context.Items("action") = action
' on excute l'action
Select Case action
Case "main"
Server.Transfer("main.aspx", True)
Case "action1"
Server.Transfer("action1.aspx", True)
Case Else
Server.Transfer("inconnu.aspx", True)
End Select
End Sub
(l se trouve /ue )ans la proc)ure OApplcatonbBegnBe/uestQ l,o-9et OSessonQ n,est pas access-le. (l en )e m4me )ans la page =
la/uelle l,e%cuton est trans!re. Auss ce mo).le n,est-l pas utlsa-le pour une applcaton avec sesson. Nous pouvons !are
7es !on)amentau% )u )veloppement asp.net GS&1'"
9ouer le r<le )u contr<leur = toute page1 par e%emple O)e!ault.asp%Q. 7es !chers Oglo-al.asa%1 glo-al.asa%.v-Q )sparassent alors pour
4tre remplacs par les !chers O)e!ault.asp%1 )e!ault.asp%.v-Q +
O)e!ault.asp%Q
<%@ Page src="default.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="controleur" %>
O)e!ault.asp%.v-Q
Imports System
Imports System.Web
Imports System.Web.SessionState
Public Class controleur
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre l'action faire
Dim action As String
If Request.QueryString("action") Is Nothing Then
action = "main"
Else
action = Request.QueryString("action").ToString.ToLower
End If
' on met l'action dans le contexte de la requte
Context.Items("action") = action
' on rcupre l'action prcdente si elle existe
Context.Items("actionPrec") = Session.Item("actionPrec")
If Context.Items("actionPrec") Is Nothing Then Context.Items("actionPrec") = ""
' on mmorise l'action courante dans la session
Session.Item("actionPrec") = action
' on excute l'action
Select Case action
Case "main"
Server.Transfer("main.aspx", True)
Case "action1"
Server.Transfer("action1.aspx", True)
Case Else
Server.Transfer("inconnu.aspx", True)
End Select
End Sub
End Class
A!n )e mettre en v)ence1 le mcansme )e sesson1 les )!!rentes pages vont a!!cher outre l,acton courante1 l,acton /u a
prc). Pour une sute ),actons A11 A"1 ...1 An1 lors/ue l,acton A se pro)ut1 le contr<leur c-)essus +
met l,acton courante A )ans le conte%te
retrouve )ans la sesson l,acton A
-1
/u a prc). Dans le cas o6 l n,D en a pas :cas )e l,acton A
1
;1 la chaVne v)e est
a!!ecte = l,acton prc)ente.
met l,acton courante A )ans la sesson en remplacement )e A
-1
trans!.re l,e%cuton = la page a)/uate
7es tros pages )e l,applcaton sont les suvantes +
Oman.asp%Q
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<HTML>
<HEAD>
<title>main</title>
</HEAD>
<body>
<h3>Page [main]</h3>
Action courante :
<% =action %>
<br>
Action prcdente :
<% =actionPrec %>
</body>
</HTML>
Oacton1.asp%Q
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
7es !on)amentau% )u )veloppement asp.net G'&1'"
<HTML>
<head>
<title>action1</title></head>
<body>
<h3>Page [action1]</h3>
Action courante :
<% =action %>
<br>
Action prcdente :
<% =actionPrec %>
</body>
</HTML>
Onconnu.asp%Q
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
<HTML>
<head>
<title>inconnu</title>
</head>
<body>
<h3>Page [inconnu]</h3>
Action courante :
<% =action %>
<br>
Action prcdente :
<% =actionPrec %>
</body>
</HTML>
Parce /ue les tros pages a!!chent les m4mes n!ormatons Oacton1 actonPrecQ1 elles peuvent avor toutes les tros le m4me
contr<leur )e page. ?n les a )onc toutes !at )rver )e la classe OmanQ )u !cher Oman.asp%.v-Q +
Public Class main
Inherits System.Web.UI.Page
Protected action As String
Protected actionPrec As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre l'action en cours
action = Me.Context.Items("action").ToString
' et l'action prcdente
actionPrec = Me.Context.Items("actionPrec").ToString
End Sub
End Class
7e co)e c-)essus se contente )e rcuprer les n!ormatons mses )ans le conte%te par le contr<leur )e l,applcaton
O)e!ault.asp%.v-Q.
Tous ces !chers sont placs )ans Mapplcaton-pathN et *assn est lanc avec les param.tres :Mapplcaton-pathN1&mvc";. ?n
)eman)e ),a-or) l,url Ohttp+&&localhost&mvc"Q +
7,url Ohttp+&&localhost&mvc"Q )sgne un )osser. Nous savons /ue )ans ce cas1 c,est le )ocument O)e!ault.asp%Q )e ce )osser /u
est renvoD par le serveur1 s,l e%ste. (c1 aucune acton n,tat prcse. *,est )onc l,acton OmanQ /u s,est e%cute. Passons =
l,acton Oacton1Q +
7es !on)amentau% )u )veloppement asp.net S#&1'"
7,acton courante et l,acton prc)ente ont t correctement )ent!es. Passons = une acton O%%Q +
'., Conclusion
Nous avons mantenant les lments )e -ase = partr )es/uels toute applcaton ASP.ET est construte. (l nous reste cepen)ant une
noton mportante = ntro)ure + celle )e !ormulare. *,est l,o-9et )u chaptre /u sut.
, Kestion de l'inter#ace utilisateur
,.1 0ntroduction
Dans la relaton clent-serveur )u 0e-1 le clent transmet )es n!ormatons au serveur sous la !orme )e chaVne )e param.tres
Oparam1Tval1`param"Tval"`...Q. Nous avons )ans nos e%emples prc)ents1 construt cette chaVne le plus souvent = la man en
)eman)ant )es url )e la !orme Ohttp+&&localhost&applW param1Tval1`param"Tval"`...Q. Dans la ralt1 les n!ormatons /ue le
transmet le clent au serveur provennent )e !ormulares /ue l,utlsateur a rempls. Nous e%plorons la constructon )e ceu%-c )ans
ce chaptre. Nous ntro)usons galement l,outl We-8atr% /u va nous permettre )e )essner les nter!aces utlsateur.
7,nstallaton )e cet outl est prsente )ans les anne%es.
,.$ Le lanae 51%L
%.2.1 Un exe2p"e
*ons)rons l,e%emple suvant1 cr avec OWe- 8atr%Q /u prsente +
un ta-leau
une mage
un len
7es !on)amentau% )u )veloppement asp.net S1&1'"
7anLons OWe-8atr%Q pus prenons l,opton O]le&Ne0 ]leQ +
Nous chosssons )e crer une page 3T87. 7es n!ormatons c-)essus vont crer un !cher
O)+P)ataP)evelPaspnetPchap$Pe%emple1Pe%emple1.htmQ. OWe-8atr%Q o!!re )eu% poss-lts ),)ter ce !cher + le mo)e ODesgnQ
et le mo)e O3T87Q +
7e mo)e ODesgnQ permet ),utlser la palette )e composants 3T87 propose par OWe-8atr%Q +
7es !on)amentau% )u )veloppement asp.net S"&1'"
Pour nsrer un lment )e cette palette1 l su!!t )e )ou-le-cl/uer )essus et ensute )e le postonner sur la !en4tre ODesgnQ. 7e
mo)e O3T87Q permet )e construre le )ocument 3T87 = l,a)e ),un )teur )e te%te. (l !aut pour cela connaVtre la sDnta%e )u
langage 3T87. Dans l,onglet O3T87Q1 un s/uelette )e )ocument a t gnr +
7a !en4tre O3T87Q est tr.s utle = celu /u ne connaVt pas le langage 3T87. (l construt alors )ans la !en4tre ODesgnQ son
)ocument et vr!e le co)e 3T87 gnr )ans la !en4tre O3T87Q. (l ac/uert ans progressvement la maVtrse )e 3T87 et peut
asse5 rap)ement travaller un/uement avec l,)teur )e te%te sans l,a)e )u mo)e ODesgnQ. Nous allons montrer mantenant
comment construre le )ocument 3T87 prsent au )-ut )e cette secton. Nous travallons )ans la !en4tre ODesgnQ. Tout
),a-or)1 nous ntro)usons )rectement la prem.re lgne )e te%te +
- nous a9outons le composant O3or5ontal BuleQ )ans la palette )es composants +
- nous a9outons le composant OTa-leQ +
7es !on)amentau% )u )veloppement asp.net SF&1'"
- nous plaLons le curseur )ans la tros.me lgne )e la ta-le pour la supprmer avec l,opton O3T87&E)t Ta-le&Delete Ta-le Bo0Q.
Pus nous nscrvons le te%te atten)u )ans cha/ue cellule +
- nous plaLons le curseur )ans l,une )es cellules )u ta-leau et nous nous ntressons au% proprts )e celle-c. 7a !en4tre )e
proprts est prsente en -as = )rote )e l,envronnement )e traval +
- la cellule est reprsente par la -alse 3T87 MTDN. ?n nous prsente )onc les proprts )e la -alse MTDN. Nous nous
ntressons au ta-leau /u est un o-9et englo-ant la cellule. Nous cl/uons sur la lste )roulante :clc[ to see parent 3T87
elements; c-)essus pour slectonner l,o-9et MTAB7EN +
- l,o-9et MTAB7EN a une proprt O-or)erQ !%ant la largeur )e la -or)ure entorant les cellules )u ta-leau. (c1 nous prenons
-or)erT1.
7es !on)amentau% )u )veloppement asp.net S$&1'"
- nous )tons mantenant les attr-uts )e l,o-9et MTDN )e la cellule :11"; pour !%er algnT*enter et 0)thT"## :p%els;. 7e te%te
sera centr )ans la cellule :algnTcenter; et celle-c sera large )e "## p%els. Pour vor la mo)!caton1 vous pouve5 par!os 4tre
o-lg )e slectonner l,onglet O3T87Q pus revenr sur l,onglet ODesgnQ +
- mantenant nous plaLons le te%te /u prc.)e l,mage +
- pus nous plaLons l,mage en )ou-le-cl/uant sur le composant OmageQ )e la palette +
- nous slectonnons l,mage pour )ter ses proprts +
- )ans l,attr-ut OsrcQ1 nous mettons le nom )u !cher contenant l,mage1 c Ounv#1.g!Q +
7es !on)amentau% )u )veloppement asp.net SH&1'"
- nous plaLons le te%te prc)ant le len +
- nous !asons )u te%te OcQ un len vers l,url Ohttp+&&sta.unv-angers.!rQ. Pour cela1 nous le slectonnons pus prenons l,opton
O3T87&(nsert 3Dperln[Q +
- nous o-tenons le rsultat suvant +
- nous D sommes pres/ue. Begar)ons le co)e 3T87 gnr )ans l,onglet O3T87Q +
7es !on)amentau% )u )veloppement asp.net SI&1'"
<html>
<head>
</head>
<body>
<p>
Le langage HTML - 1
</p>
<hr />
<table border="1">
<tbody>
<tr>
<td>
cellule(1,1)</td>
<td align="middle" width="200">
cellule(1,2)</td>
<td>
cellule(1,3)</td>
</tr>
<tr>
<td>
cellule(2,1)</td>
<td>
cellule(2,2)</td>
<td>
cellule(2,3)</td>
</tr>
</tbody>
</table>
<p>
Une image <img src="univ01.gif" />
</p>
<p>
Le site de l'istia <a href="http://istia.univ-angers.fr">ici</a>
</p>
</body>
</html>
(l nous reste /uel/ues )tals = rgler. Tout ),a-or) nous amerons )onner un ttre = notre )ocument. OWe-8atr%Q ne permet pas
)e le !are en mo)e ODesgnQ. Dans l,onglet O3T87Q1 nous remplaLons la s/uence Mhea)N..M&hea)N1 par la s/uence suvante +
<head>
<title>HTML1</title>
</head>
Par alleurs1 nous souhaterons avor le te%te O7e langage 3T87 - 1Q en plus gran)s caract.res. 7a s/uence M3Nte%teM&3N
permet )e !%er la talle ),un te%te avec varant )e 1 = I )u plus gran) au plus pett. (c1 nous pren)rons 3". 7a s/uence
<p>
Le langage HTML - 1
</p>
)event +
<h2>Le langage HTML - 1</h2>
7a !en4tre ODesgnQ re!l.te nos changements +
7es !on)amentau% )u )veloppement asp.net SG&1'"
(l ne nous reste plus /u,= tester = l,a)e )e l,opton OVe0&StartQ ou O]HQ. OWe-8atr%Q )eman)e /uel/ues rensegnements pour
lancer le serveur We- O*assnQ +
Nous pouvons accepter les valeurs proposes par )!aut. 7e serveur O*assnQ est lanc et notre page a!!che )ans un navgateur +
Par curost1 nous pouvons vr!er avec /uels param.tres a t lanc O*assnQ +
Nous avons prsent les -ases )e la constructon ),une page 3T87 avec OWe-8atr%Q. 7e lecteur est nvt = construre ),autres
pages 3T87 et = vr!er = cha/ue !os le co)e 3T87 gnr. Peu = peu1 l sera capa-le )e construre une page sans l,a)e )u mo)e
ODesgnQ. Kn )ocument 3T87 a la !orme gnrale suvante +
<html>
7es !on)amentau% )u )veloppement asp.net SS&1'"
<head>
<title>Un titre</title>
...
</head>
<body attributs>
...
</body>
</html>
7,ensem-le )u )ocument est enca)r par les -alses :html;...:+html;. (l est !orm )e )eu% partes +
:head;...:+head; + c,est la parte non a!!cha-le )u )ocument. Elle )onne )es rensegnements au navgateur /u va a!!cher le
)ocument. ?n D trouve souvent la -alse :title;...:+title; /u !%e le te%te /u sera a!!ch )ans la -arre )e ttre )u navgateur. ?n
peut D trouver ),autres -alses notamment )es -alses )!nssant les mots cls )u )ocument1 mots cls utlss ensute par les
moteurs )e recherche. ?n peut trouver galement )ans cette parte )es scrpts1 crts le plus souvent en 9avascrpt ou v-scrpt et /u
seront e%cuts par le navgateur.
:bod* attributs;...:+bod*; + c,est la parte /u sera a!!che par le navgateur. 7es -alses 3T87 contenues )ans cette parte
n)/uent au navgateur la !orme vsuelle >souhate> pour le )ocument. *ha/ue navgateur va nterprter ces -alses = sa !aLon.
Deu% navgateurs peuvent alors vsualser )!!remment un m4me )ocument 0e-. *,est gnralement l,un )es casse-t4tes )es
concepteurs 0e-.
7e co)e 3T87 )u )ocument prc)ent tat le suvant +
<html>
<head>
<title>HTML1</title>
</head>
<body>
<h2>Le langage HTML - 1
</h2>
<hr />
<table border="1">
<tbody>
<tr>
<td>
cellule(1,1)</td>
<td align="middle" width="200">
cellule(1,2)</td>
<td>
cellule(1,3)</td>
</tr>
<tr>
<td>
cellule(2,1)</td>
<td>
cellule(2,2)</td>
<td>
cellule(2,3)</td>
</tr>
</tbody>
</table>
<p>
Une image <img src="univ01.gif" />
</p>
<p>
Le site de l'istia <a href="http://istia.univ-angers.fr">ici</a>
</p>
</body>
</html>
Elment balises et exemples 51%L
titre du
document
<title>E9=;1</title>
3T871 apparaVtra )ans la -arre )e ttre )u navgateur /u a!!chera le )ocument
barre
horizontale
<hr> + a!!che un trat hor5ontal
tableau
<table attributs>....</table> + pour )!nr le ta-leau
<tr attributs>...</tr> + pour )!nr une lgne
<t' attributs>...</t'> + pour )!nr une cellule
exemples 6
<table bor'er2313>...</table> + l,attr-ut -or)er )!nt l,passeur )e la -or)ure )u ta-leau
<t' align23center3 $i'th23&--3>cellule(15&)</t'> + )!nt une cellule )ont le contenu sera cellule(15&). *e contenu
7es !on)amentau% )u )veloppement asp.net S'&1'"
sera centr hor5ontalement :algnT>center>;. 7a cellule aura une largeur )e "## p%els :0)thT>"##>;
image
<img src23univ-1.gif3 /> + )!nt une mage )ont le !cher source est univ-1.gif sur le serveur 0e-
:srcT>unv#1.g!>;. *e len se trouve sur un )ocument 0e- o-tenu avec l,KB7 http://localhost/e"emple1.htm.
Auss1 le navgateur )eman)era-t-l l,KB7 http://localhost/univ-1.gif pour avor l,mage r!rence c.
lien
<a href23http://istia.univ-angers.fr3>ici</a> + !at /ue le te%te ici sert )e len vers l,KB7 http://istia.univ-angers.fr.
?n vot )ans ce smple e%emple /ue pour construre l,ntralt )u )ocument1 le navgateur )ot !are )eu% re/u4tes au serveur +
http://localhost/e"emple1.htm pour avor le source 3T87 )u )ocument
http://localhost/univ-1.gif pour avor l,mage univ-1.gif
%.2.2 +$nstructi$n #9un :$r2u"aire
Kn !ormulare 3T87 a pour -ut )e prsenter = l,utlsateur une page )e sase ),n!ormatons analogue au% !ormulare )e sase
rencontrs sous 0n)o0s. 7e !ormulare )e sase est envoD sous la !orme ),un )ocument 3T87 au navgateur. *elu-c va
prsenter le !ormulare = l,utlsateur /u va le remplr et le val)er avec un -outon aDant cette !oncton. 7e navgateur va alors
transmettre les valeurs sases au serveur pour tratement. ?n verra /u,l ne renvoe pas au serveur la totalt )u !ormulare mas
seulement les valeurs sases. 7,e%emple suvant prsente un !ormulare We- cr lu auss avec We-8atr% +
7e co)e 3T87 gnr par OWe-8atr%Q est le suvant +
<html>
<head>
<title>Formulaire</title>
<script language="javascript">
function effacer(){
alert("Vous avez cliqu sur le bouton [Effacer]");
}
</script>
</head>
<body>
<p>
Gestion d'un formulaire
</p>
<hr />
<form name="formulaire" method="post">
<table border="1">
<tr>
<td>
Etes-vous mari(e)</td>
<td>
<p align="center">
7es !on)amentau% )u )veloppement asp.net '#&1'"
<input type="radio" value="oui" name="rdMarie" />Oui
<input type="radio" checked value="non" name="rdMarie" />Non
</p>
</td>
</tr>
<tr>
<td>
Cases cocher
</td>
<td>
<p align="center">
<input type="checkbox" value="un" name="C1" />1
<input type="checkbox" checked value="deux" name="C2" />2
<input type="checkbox" value="trois" name="C3" />3
</p>
</td>
</tr>
<tr>
<td>
Champ de saisie</td>
<td>
<p align="center">
<input type="text" maxlength="30" value="qqs mots" name="txtSaisie" />
</p>
</td>
</tr>
<tr>
<td>
Mot de passe</td>
<td>
<p align="center">
<input type="password" maxlength="12" size="12" value="unMotDePasse" name="txtMdp" />
</p>
</td>
</tr>
<tr>
<td>
Bote de saisie</td>
<td>
<p align="center">
</p>
<textarea name="areaSaisie">ligne1
ligne2</textarea>
</td>
</tr>
<tr>
<td>
ComboBox</td>
<td>
<p align="center">
</p>
<select name="cmbValeurs">
<option value="1">choix1</option>
<option value="2" selected>choix2</option>
<option value="3">choix3</option>
</select>
</td>
</tr>
<tr>
<td>
Liste choix simple</td>
<td>
<p align="center">
</p>
<select size="3" name="lstSimple">
<option value="1" selected>liste1</option>
<option value="2">liste2</option>
<option value="3">liste3</option>
<option value="4">liste4</option>
<option value="5">liste5</option>
</select>
</td>
</tr>
<tr>
<td>
Liste choix multiple</td>
<td>
<p align="center">
</p>
<select multiple size="3" name="lstMultiple">
<option value="1" selected>multiple1</option>
7es !on)amentau% )u )veloppement asp.net '1&1'"
<option value="2">multiple2</option>
<option value="3" selected>multiple3</option>
<option value="4">multiple4</option>
<option value="5">multiple5</option>
</select>
</td>
</tr>
<tr>
<td>
Bouton simple</td>
<td>
<p align="center">
<input onclick="effacer()" type="button" value="Effacer" name="btnEffacer" />
</p>
</td>
</tr>
<tr>
<td>
Bouton submit</td>
<td>
<p align="center">
<input type="submit" value="Envoyer" name="btnEnvoyer" />
</p>
</td>
</tr>
<tr>
<td>
Bouton reset</td>
<td>
<p align="center">
<input type="reset" value="Rtablir" name="btnRetablir" runat="server" />
</p>
</td>
</tr>
</table>
<input type="hidden" name="secret" value="uneValeur" />
</form>
</body>
</html>
7,assocaton contr<le vsuel M--N -alse 3T87 est le suvant +
Contrle balise 51%L
formulaire <form name="formulaire" method="post">
champ de
saisie
<input type="text" maxlength="30" value="qqs mots" name="txtSaisie" />
champ de
saisie cache
<input type="password" maxlength="12" size="12" value="unMotDePasse" name="txtMdp" />
champ de
saisie
multilignes
<textarea name="areaSaisie">ligne1
ligne2</textarea>
boutons radio <input type="radio" value="oui" name="rdMarie" />Oui
<input type="radio" checked value="non" name="rdMarie" />Non
cases cocher <input type="checkbox" value="un" name="C1" />1
<input type="checkbox" checked value="deux" name="C2" />2
<input type="checkbox" value="trois" name="C3" />3
Combo <select name="cmbValeurs">
<option value="1">choix1</option>
<option value="2" selected>choix2</option>
<option value="3">choix3</option>
</select>
liste
slection
unique
<select size="3" name="lstSimple">
<option value="1" selected>liste1</option>
<option value="2">liste2</option>
<option value="3">liste3</option>
<option value="4">liste4</option>
<option value="5">liste5</option>
</select>
liste
slection
multiple
<select multiple size="3" name="lstMultiple">
<option value="1" selected>multiple1</option>
<option value="2">multiple2</option>
<option value="3" selected>multiple3</option>
<option value="4">multiple4</option>
<option value="5">multiple5</option>
</select>
champ cach <input type="hidden" name="secret" value="uneValeur" />
bouton de
type submit
<input type="submit" value="Envoyer" name="btnEnvoyer" />
7es !on)amentau% )u )veloppement asp.net '"&1'"
bouton de
type reset
<input type="reset" value="Rtablir" name="btnRetablir" runat="server" />
bouton de
type button
<input onclick="effacer()" type="button" value="Effacer" name="btnEffacer" />
Passons en revue ces )!!rents contr<les.
!.2.2.1 Le formulaire
formulaire <form name="formulaire" method="post">
balise HTML
:#orm name<=...= method<=...= action<=...=;...:+#orm;
attributs
name<=#rmexemple= + nom )u !ormulare
method<=...= + mtho)e utlse par le navgateur pour envoDer au serveur 0e- les valeurs rcoltes )ans le
!ormulare
action<=...= + KB7 = la/uelle seront envoDes les valeurs rcoltes )ans le !ormulare.
Kn !ormulare 0e- est entour )es -alses <form>...</form>. 7e !ormulare peut avor un nom :name23""3;. *,est
le cas pour tous les contr<les /u,on peut trouver )ans un !ormulare. *e nom est utle s le )ocument 0e- content
)es scrpts /u )ovent r!rencer )es lments )u !ormulare. 7e -ut ),un !ormulare est )e rassem-ler )es
n!ormatons )onnes par l,utlsateur au claver&sours et ),envoDer celles-c = une KB7 )e serveur 0e-. 7a/uelle W
*elle r!rence )ans l,attr-ut action23:R;3. S cet attr-ut est a-sent1 les n!ormatons seront envoDes = l,KB7
)u )ocument )ans le/uel se trouve le !ormulare. *omment un clent 0e- !at-l pour )onner )es n!ormatons
:celles contenues )ans le !ormulare; = un serveur 0e- W Nous l,avons vu en )tal. (l peut utlser )eu% mtho)es
)!!rentes appeles P?ST et AET. 7,attr-ut metho'23m.tho'e31 avec mtho)e gale = AET ou P?ST1 )e la -alse
<form> n)/ue au navgateur la mtho)e = utlser pour envoDer les n!ormatons recuelles )ans le !ormulare =
l,KB7 prcse par l,attr-ut action23:R;3. 7ors/ue l,attr-ut metho' n,est pas prcs1 c,est la mtho)e AET /u est
prse par )!aut.
!.2.2.2 Champ de saisie
champ de
saisie
<input type="text" maxlength="30" value="qqs mots" name="txtSaisie" />
<input type="password" maxlength="12" size="12" value="unMotDePasse" name="txtMdp"
/>
balise HTML
:input t*pe<=...= name<=...= si>e<=..= "alue<=..=;
7a -alse nput e%ste pour )vers contr<les. *,est l,attr-ut t7pe /u permet )e )!!renter ces )!!rents contr<les
entre eu%.
attributs
t*pe<=text= + prcse /ue c,est un champ )e sase
t*pe<=pass!ord= + les caract.res prsents )ans le champ )e sase sont remplacs par )es caract.res _. *,est la
seule )!!rence avec le champ )e sase normal. *e tDpe )e contr<le convent pour la sase )es mots )e passe.
si>e<=1$= + nom-re )e caract.res vs-les )ans le champ - n,emp4che pas la sase )e )avantage )e caract.res
maxlenth<='?= + !%e = F# le nom-re ma%mal )e caract.res - le navgateur est charg )e !are respecter cet
attr-ut
name<=txt&aisie= + nom )u contr<le
"alue<=qqs mots= + te%te /u sera a!!ch )ans le champ )e sase.
!.2.2.3 Champ de saisie multilines
champ de saisie multilignes <textarea name="areaSaisie">ligne1
ligne2</textarea>
balise HTML
:textarea ...;texte:+textarea;
a!!che une 5one )e sase multlgnes avec au )part te%te )e)ans
attributs
ro!s<=$= + nom-re )e lgnes
7es !on)amentau% )u )veloppement asp.net 'F&1'"
cols<='$?= + nom-re )e colonnes
name<=area&aisie= + nom )u contr<le
!.2.2.! "outons radio
boutons radio <input type="radio" value="oui" name="rdMarie" />Oui
<input type="radio" checked value="non" name="rdMarie" />Non
balise HTML
:input t*pe<=radio= attribut$<="aleur$= ....+;texte
a!!che un -outon ra)o avec texte = c<t.
attributs
name<=rd%arie= + nom )u contr<le. 7es -outons ra)o portant le m4me nom !orment un groupe )e -outons
e%clus!s les uns )es autres + on ne peut cocher /ue l,un ),eu%.
"alue<="aleur= + valeur a!!ecte au -outon ra)o. (l ne !aut pas con!on)re cette valeur avec le te%te a!!ch = c<t
)u -outon ra)o. *elu-c n,est )estn /u,= l,a!!chage.
chec@ed + s ce mot cl est prsent1 le -outon ra)o est coch1 snon l ne l,est pas.
!.2.2.5 Cases # cocher
cases cocher <input type="checkbox" value="un" name="C1" />1
<input type="checkbox" checked value="deux" name="C2" />2
<input type="checkbox" value="trois" name="C3" />3
balise HTML
:input t*pe<=chec@box= attribut$<="aleur$= ....+;texte
a!!che une case = cocher avec te%te = c<t.
attributs
name<=C1= + nom )u contr<le. 7es cases = cocher peuvent porter ou non le m4me nom. 7es cases portant le
m4me nom !orment un groupe )e cases assoces.
"alue<="aleur= + valeur a!!ecte = la case = cocher. (l ne !aut pas con!on)re cette valeur avec le te%te a!!ch =
c<t )e la case = cocher. *elu-c n,est )estn /u,= l,a!!chage.
chec@ed + s ce mot cl est prsent1 le -outon ra)o est coch1 snon l ne l,est pas.
!.2.2.6 Liste droulante $com%o&
Combo <select name="cmbValeurs">
<option value="1">choix1</option>
<option value="2" selected>choix2</option>
<option value="3">choix3</option>
</select>
balise HTML
:select si>e<=..= name<=..=;
Mopton Oselecte)T>selecte)>Q OvalueT>valeur>QNte%teM&optonN
...
M&selectN
a!!che )ans une lste les te%tes comprs entre les -alses MoptonN...M&optonN
attributs
name<=cmbAaleurs= + nom )u contr<le.
si>e<=1= + nom-re ),lments )e lste vs-les. si<e2313 !at )e la lste l,/uvalent ),un com-o-o%. *,est la valeur
par )!aut s l,attr-ut Os5eQ est a-sent.
selected<=selected= + s ce mot cl est prsent pour un lment )e lste1 ce )erner apparaVt slectonn )ans la
lste. Dans notre e%emple c-)essus1 l,lment )e lste choi"& apparaVt comme l,lment slectonn )u com-o
lors/ue celu-c est a!!ch pour la prem.re !os.
"alue<="aleur= + !%e la valeur = envoDer au serveur s l,lment est slectonn. S cet attr-ut est a-sent1 c,est
alors le te%te assoc = l,opton /u est envoD au serveur.
7es !on)amentau% )u )veloppement asp.net '$&1'"
!.2.2.' Liste # slection uni(ue
liste slection unique <select size="3" name="lstSimple">
<option value="1" selected>liste1</option>
<option value="2">liste2</option>
<option value="3">liste3</option>
<option value="4">liste4</option>
<option value="5">liste5</option>
</select>
balise HTML
:select si>e<=..= name<=..=;
Mopton Oselecte)Q OvalueT>valeur>QN...M&optonN
...
M&selectN
a!!che )ans une lste les te%tes comprs entre les -alses <option>...</option>
attributs
les m4mes /ue pour la lste )roulante n,a!!chant /u,un lment. *e contr<le ne )!!.re )e la lste )roulante
prc)ente /ue par son attr-ut s5eN1.
!.2.2.) Liste # slection multiple
liste slection multiple <select multiple size="3" name="lstMultiple">
<option value="1" selected>multiple1</option>
<option value="2">multiple2</option>
<option value="3" selected>multiple3</option>
<option value="4">multiple4</option>
<option value="5">multiple5</option>
</select>
balise HTML
:select si>e<=..= name<=..= multiple;
Mopton Oselecte)Q Q OvalueT>valeur>QN...M&optonN
...
M&selectN
a!!che )ans une lste les te%tes comprs entre les -alses <option>...</option>
attributs
multiple + permet la slecton )e pluseurs lments )ans la lste. Dans l,e%emple c-)essus1 les lments liste1 et
liste( sont tous )eu% slectonns.
!.2.2.* "outon de t+pe %utton
bouton de type button <input onclick="effacer()" type="button" value="Effacer" name="btnEffacer" />
balise HTML
:input t*pe<=button= "alue<=...= name<=...= onclic@<=e##acerBC= ....;
attributs
t*pe<=button= + )!nt un contr<le -outon. (l e%ste )eu% autres tDpes )e -outon1 les tDpes submit et reset.
"alue<=E##acer= + le te%te a!!ch sur le -outon
onclic@<=#onctionBC= + permet )e )!nr une !oncton = e%cuter lors/ue l,utlsateur cl/ue sur le -outon. *ette
!oncton !at parte )es scrpts )!ns )ans le )ocument 0e- a!!ch. 7a sDnta%e prc)ente est une sDnta%e
#avascript. S les scrpts sont crts en v-scrpt1 l !au)rat crre onclic@<=#onction= sans les parenth.ses. 7a
sDnta%e )event )ent/ue s,l !aut passer )es param.tres = la !oncton + onclic@<=#onctionB"al1) "al$)...C=
Dans notre e%emple1 un clc sur le -outon Affacer appelle la !oncton 9avascrpt effacer suvante +
<script language="javascript">
7es !on)amentau% )u )veloppement asp.net 'H&1'"
function effacer(){
alert("Vous avez cliqu sur le bouton [Effacer]");
}
</script>
7a !oncton effacer a!!che un message +
!.2.2.1,"outon de t+pe su%mit
bouton de
type submit
<input type="submit" value="Envoyer" name="btnEnvoyer" />
balise HTML
:input t*pe<=submit= "alue<=En"o*er= name<=btnEn"o*er=;
attributs
t*pe<=submit= + )!nt le -outon comme un -outon ),envo )es )onnes )u !ormulare au serveur 0e-.
7ors/ue le clent va cl/uer sur ce -outon1 le navgateur va envoDer les )onnes )u !ormulare = l,KB7 )!ne )ans
l,attr-ut action )e la -alse :#orm; selon la mtho)e )!ne par l,attr-ut method )e cette m4me -alse.
"alue<=En"o*er= + le te%te a!!ch sur le -outon
!.2.2.11"outon de t+pe reset
bouton de type reset <input type="reset" value="Rtablir" name="btnRetablir" runat="server" />
balise HTML
:input t*pe<=reset= "alue<=Rtablir= name<= btnRetablir =;
attributs
t*pe<=reset= + )!nt le -outon comme un -outon )e rntalsaton )u !ormulare. 7ors/ue le clent va cl/uer
sur ce -outon1 le navgateur va remettre le !ormulare )ans l,tat o6 l l,a reLu.
"alue<=Rtablir= + le te%te a!!ch sur le -outon
!.2.2.12Champ cach
champ cach <input type="hidden" name="secret" value="uneValeur" />
balise HTML
:input t*pe<=hidden= name<=...= "alue<=...=;
attributs
t*pe<=hidden= + prcse /ue c,est un champ cach. Kn champ cach !at parte )u !ormulare mas n,est pas
prsent = l,utlsateur. *epen)ant1 s celu-c )eman)at = son navgateur l,a!!chage )u co)e source1 l verrat la
prsence )e la -alse Mnput tDpeT>h))en> valueT>...>N et )onc la valeur )u champ cach.
"alue<=uneAaleur= + valeur )u champ cach.
Euel est l,ntr4t )u champ cach W *ela peut permettre au serveur 0e- )e gar)er )es n!ormatons au !l )es
re/u4tes ),un clent. *ons)rons une applcaton ),achats sur le 0e-. 7e clent ach.te un premer artcle art1 en
/uantt 01 sur une prem.re page ),un catalogue pus passe = une nouvelle page )u catalogue. Pour se souvenr
/ue le clent a achet 01 artcles art11 le serveur peut mettre ces )eu% n!ormatons )ans un champ cach )u
!ormulare 0e- )e la nouvelle page. Sur cette nouvelle page1 le clent ach.te 0& artcles art&. 7ors/ue les )onnes )e
ce secon) !ormulare vont 4tre envoDes au serveur :su-mt;1 celu-c va non seulement recevor l,n!ormaton
:0&1art&; mas auss :011art1; /u !at parte galement parte )u !ormulare en tant /ue champ cach non mo)!a-le
par l,utlsateur. 7e serveur 0e- va alors mettre )ans un nouveau champ cach les n!ormatons :011art1; et :0&1art&;
7es !on)amentau% )u )veloppement asp.net 'I&1'"
et envoDer une nouvelle page )e catalogue. Et ans )e sute.
,.' En"oi G un ser"eur !eb par un na"iateur des "aleurs d'un #ormulaire
Nous savons )9=1 grYce au chaptre prc)ent1 comment un clent transmet )es n!ormatons au serveur (l le !at sot par +
une re/u4te 3TTP AET urlWparam1Tva1`param"Tval"`....
une re/u4te 3TT P?ST url suve ),un )ocument contenant la chaVne )e param.tres param1Tva1`param"Tval"`....
7e navgateur va utlser l,une )e ces )eu% mtho)es selon /ue l,attr-ut Ometho)Q )e la -alse O!ormQ est AET ou P?ST. *,est ce
/ue nous allons montrer mantenant. 7a page tu)e prc)emment est une page stat/ue. A!n ),avor acc.s au% ent4tes 3TTP
envoDs par le navgateur /u va )eman)er ce )ocument1 nous la trans!ormons en page )Dnam/ue pour un serveur 0e- .NET :((S
ou *assn;. 7e co)e stat/ue prc)ent est plac )ans un !cher O!ormularebget.asp%Q et son contenu est le suvant +
<%@ Page src="formulaire_get.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="formulaire_get" %>
<html>
<head>
<title>Formulaire</title>
<script language="javascript">
function effacer(){
alert("Vous avez cliqu sur le bouton [Effacer]");
}
</script>
</head>
<body>
.....
</body>
</html>
7a page )e prsentaton c-)essus est assoce au contr<leur O!ormularebget.asp%.v-Q +
Public Class formulaire_get
Inherits System.Web.UI.Page
Private Sub Page_Init(ByVal Sender As Object, ByVal e As System.EventArgs) Handles MyBase.Init
' sauve la requte courante dans request.txt du dossier de la page
Dim requestFileName As String = Me.MapPath(Me.TemplateSourceDirectory) + "\request.txt"
Me.Request.SaveAs(requestFileName, True)
End Sub
End Class
A cha/ue appel )u )ocument O!ormularebget.asp%Q1 la re/u4te )u clent sera sauvegar)e )ans un !cher Ore/uest.t%tQ par la
proc)ure Pageb(nt. Nous avons )9= rencontr ce mo)e )e !onctonnement1 auss ne commenterons-nous pas plus le contr<leur.
%.3.1 M1t=$#e >T
]asons un premer test1 o6 )ans le co)e 3T87 )u )ocument1 la -alse ]?B8 est )!ne )e la !aLon suvante +
M!orm nameT>!ormulare> metho)T>post>N
Nous plaLons les !chers O!ormularebget.asp%Q et O!ormularebget.asp%.v-Q )ans un )osser Mapplcaton-pathN et nous lanLons le
serveur *assn avec les param.tres :Mapplcaton-pathN1&!orm";. Nous )eman)ons l,url
http+&&localhost&!orm"&!ormularebget.asp% +
7es !on)amentau% )u )veloppement asp.net 'G&1'"
7e navgateur vent )e !are une re/u4te et nous savons /ue celle-c a t enregstre )ans le !cher Ore/uest.t%tQ. Begar)ons le
contenu )e celu-c +
GET /form2/formulaire_get.aspx HTTP/1.1
Cache-Control: max-age=0
Connection: keep-alive
Keep-Alive: 300
Accept: application/x-shockwave-
flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jpeg
,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7b) Gecko/20040316
7e navgateur a utls une re/u4te 3TTP AET pour )eman)er l,url Ohttp+&&localhost&!orm"&!ormularebget.asp%Q. *,est tou9ours
le cas lors/ue l,url est )onne par l,utlsateur. Nous remplssons le !ormulare est rempl )e la !aLon suvante +
7es !on)amentau% )u )veloppement asp.net 'S&1'"
Nous utlsons le -outon OEnvoDerQ c-)essus. Son co)e 3T87 est le suvant +
<form method="get">
...
<input type="submit" value="Envoyer">
...
</form>
Sur l,actvaton ),un -outon )e tDpe OSu-mtQ1 le navgateur envoe les param.tres )u !ormulare :-alse M!ormN; = l,KB7 n)/ue
)ans l,attr-ut OactonQ )e la -alse M!orm actonT>KB7>N s,l e%ste. S cet attr-ut n,e%ste pas1 les param.tres )u !ormulare sont
envoDs = l,KB7 /u a )lvr le !ormulare. *,est le cas c. 7e -outon OEnvoDerQ )evrat )onc entraVner une re/u4te )u navgateur =
l,KB7 Ohttp+&&localhost&!orm"&!ormularebget.asp%Q avec un trans!ert )es param.tres )u !ormulare. *omme la page
O!ormularebget.asp%Q mmorse la re/u4te reLue1 nous )evrons savor comment le clent a trans!r ces param.tres. EssaDons.
Nous cl/uons sur le -outon OEnvoDerQ. Nous recevons la rponse suvante )u navgateur +
7es !on)amentau% )u )veloppement asp.net ''&1'"
*,est la page ntale mas on peut remar/uer /ue l,KB7 a chang )ans le champ OA)resseQ )u navgateur. Elle est )evenue la
suvante +
http://localhost/form2/formulaire_get.aspx?rdMarie=oui&C1=un&C2=deux&txtSaisie=programmation+asp.net&txt
Mdp=unMotDePasse&areaSaisie=les+bases+de+la%0D%0Aprogrammation+web%0D%0A&cmbValeurs=3&lstSimple=1&lstMul
tiple=2&lstMultiple=4&btnEnvoyer=Envoyer&secret=uneValeur
?n constate /ue les cho% !ats )ans le !ormulare se retrouvent )ans l,KB7. Begar)ons le contenu )u !cher Ore/uest.t%tQ /u a
mmors la re/u4te )u clent +
GET
/form2/formulaire_get.aspx?rdMarie=oui&C1=un&C2=deux&txtSaisie=programmation+asp.net&txtMdp=ceciestsecre
&areaSaisie=les+bases+de+la%0D%0Aprogrammation+web%0D%0A&cmbValeurs=3&lstSimple=1&lstMultiple=2&lstMulti
ple=4&btnEnvoyer=Envoyer&secret=uneValeur HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Accept: application/x-shockwave-
flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jp
eg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
Referer: http://localhost/form2/formulaire_get.aspx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7b) Gecko/20040316
?n retrouve une re/u4te 3TTP asse5 sem-la-le = celle /u avat t !ate ntalement par le navgateur lors/u,l avat )eman) le
)ocument sans transmettre )e param.tres. (l D a )eu% )!!rences +
GET URL HTTP/1.1
les param.tres )u !ormulare ont t a9outs )err.re l,KB7 )u )ocument sous la !orme W
param1Tval1`param"Tval"`...
Referer
le clent n)/ue par cet ent4te 3TTP l,KB7 )u )ocument /u,l a!!chat lors/u,l a !at la re/u4te
E%amnons )e plus pr.s comment les param.tres ont t passs )ans la comman)e BA9 :R;Cparam12valeur1Dparam&2valeur&D...
E99//1.1 o6 les parami sont les noms )es contr<les )u !ormulare 0e- et valeuri les valeurs /u leur sont assoces. Nous
prsentons c-)essous un ta-leau = tros colonnes +
colonne 1 + repren) la )!nton ),un contr<le 3T87 )e l,e%emple
colonne " + )onne l,a!!chage )e ce contr<le )ans un navgateur
7es !on)amentau% )u )veloppement asp.net 1##&1'"
colonne F + )onne la valeur envoDe au serveur par le navgateur pour le contr<le )e la colonne 1 sous la !orme /u,elle a
)ans la re/u4te AET )e l,e%emple
contrle 51%L "isuel a"ant "alidation "aleurBsC ren"o*eBsC
<input type="radio"
value="oui"
name="rdMarie" />Oui
<input type="radio"
checked value="non"
name="rdMarie" />Non
rd%arie<oui
- la valeur )e l,attr-ut value )u -outon
ra)o coch par l,utlsateur.
<input type="checkbox"
value="un" name="C1" />1
<input type="checkbox"
checked value="deux"
name="C2" />2
<input type="checkbox"
value="trois" name="C3"
/>3
C1<un
C$<deux
- valeurs )es attr-uts value )es cases
coches par l,utlsateur
<input type="text"
maxlength="30" value="qqs
mots" name="txtSaisie" />
txt&aisie<prorammationDasp.net
- te%te tap par l,utlsateur )ans le champ
)e sase. 7es espaces ont t remplacs
par le sgne @
<input type="password"
maxlength="12" size="12"
value="unMotDePasse"
name="txtMdp" />
txt%dp<ceciestsecre
- te%te tap par l,utlsateur )ans le champ
)e sase. 7e te%te rellement tap tat
>cecestsecret>. 7e )erner caract.re a t
per)u parce /ue l,attr-ut
ma%lengthT>1"> lmtat le nom-re )e
caract.res = 1".
<textarea
name="areaSaisie">ligne1
ligne2</textarea>
area&aisie<lesDbasesDdeDlaE?3E?4
prorammationD!eb
- te%te tap par l,utlsateur )ans le champ
)e sase. Z?DZ?A est la mar/ue )e !n
)e lgne. 7es espaces ont t remplacs
par le sgne @
<select
name="cmbValeurs">
<option
value="1">choix1</option>
<option value="2"
selected>choix2</option>
<option
value="3">choix3</option>
</select>
cmbAaleurs<'
- valeur :attr-ut "alue )e la -alse
MoptionN; chose par l,utlsateur )ans la
lste = slecton un/ue
<select size="3"
name="lstSimple">
<option value="1"
selected>liste1</option>
<option
value="2">liste2</option>
<option
value="3">liste3</option>
<option
value="4">liste4</option>
<option
value="5">liste5</option>
</select>
lst&imple<'
- valeur :attr-ut "alue )e la -alse
MoptionN; chose par l,utlsateur )ans la
lste = slecton un/ue
<select multiple size="3"
name="lstMultiple">
<option value="1"
selected>multiple1</optio
n>
<option
value="2">multiple2</opti
on>
<option value="3"
selected>multiple3</optio
n>
<option
lst%ultiple<$
lst%ultiple<,
- valeurs :attr-ut "alue )e la -alse
MoptionN; choses par l,utlsateur )ans
la lste = slecton multple
7es !on)amentau% )u )veloppement asp.net 1#1&1'"
value="4">multiple4</opti
on>
<option
value="5">multiple5</opti
on>
</select>
<input type="submit"
value="Envoyer"
name="btnEnvoyer" />
btnEn"o*er<En"o*er
- nom et attr-ut value )u -outon /u a
serv = envoDer les )onnes )u !ormulare
au serveur
<input type="hidden"
name="secret"
value="uneValeur" />
secret<uneAaleur
- attr-ut value )u champ cach
?n peut se )eman)er ce /ue le serveur a !at )es param.tres /u,on lu a passs. En ralt ren. A la rcepton )e la comman)e
GET
/form2/formulaire_get.aspx?rdMarie=oui&C1=un&C2=deux&txtSaisie=programmation+asp.net&txtMdp=ceciestsecre
&areaSaisie=les+bases+de+la%0D%0Aprogrammation+web%0D%0A&cmbValeurs=3&lstSimple=1&lstMultiple=2&lstMulti
ple=4&btnEnvoyer=Envoyer&secret=uneValeur HTTP/1.1
le serveur 0e- a transms les param.tres = l,KB7 au )ocument Ohttp+&&localhost&!orm"&!ormularebget.asp%Q1 c.a.). au )ocument
/ue nous avons construt ntalement. Nous n,avons crt aucun co)e pour rcuprer et trater les param.tres /ue le clent nous
envoe. Auss tout se passe comme s la re/u4te )u clent tat smplement +
GET http://localhost/form2/formulaire_get.aspx
*,est pour cette rason1 /u,en rponse = notre -outon OEnvoDerQ1 nous avons o-tenu la m4me page /ue celle o-tenue ntalement en
)eman)ant l,KB7 Ohttp+&&localhost&!orm"&!ormularebget.asp%Q sans param.tres.
%.3.2 M1t=$#e P4ST
7e )ocument 3T87 est mantenant programm pour /ue le navgateur utlse la mtho)e P?ST pour envoDer les valeurs )u
!ormulare au serveur 0e-. Pour cela1 nous copons le !cher O!ormularebget.asp%Q )ans O!ormularebpost.asp%Q et mo)!ons
un/uement la -alse M!ormN )ans O!ormularebpost.asp%Q+
<%@ Page src="formulaire_get.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="formulaire_get" %>
<html>
<head>
...
</head>
<body>
<p>
Gestion d'un formulaire
</p>
<hr />
<form name="formulaire" method="post">
<table border="1">
(l n,D a pas ncesst )e changer le contr<leur O!ormularebget.asp%.v-Q1 auss le gar)ons-nous en l,tat. Nous )eman)ons le nouveau
)ocument va l,KB7 Ohttp+&&localhost&!orm"&!ormularebpost.asp%Q1 nous remplssons le !ormulare tel /ue pour la mtho)e AET
et nous transmettons les param.tres au serveur avec le -outon OEnvoDerQ. Nous o-tenons )u serveur la page rponse suvante +
7es !on)amentau% )u )veloppement asp.net 1#"&1'"
Nous o-tenons )onc le m4me rsultat /u,avec la mtho)e AET1 c.a.). la page ntale. ?n remar/uera une )!!rence + )ans le
champ OA)resseQ )u navgateur1 les param.tres transms n,apparassent pas. 8antenant1 regar)ons la re/u4te envoDe par le clent et
/u a t mmorse )ans le !cher Ore/uest.t%tQ +
POST /form2/formulaire_post.aspx HTTP/1.1
Connection: keep-alive
Keep-Alive: 300
Content-Length: 222
Content-Type: application/x-www-form-urlencoded
Accept: application/x-shockwave-
flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,image/jp
eg,image/gif;q=0.2,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding: gzip,deflate
Accept-Language: en-us,en;q=0.5
Host: localhost
Referer: http://localhost/form2/formulaire_post.aspx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7b) Gecko/20040316
rdMarie=oui&C1=un&C2=deux&txtSaisie=programmation+asp.net&txtMdp=ceciestsecre&areaSaisie=les+bases+de+la
%0D%0Aprogrammation+web%0D%0A&cmbValeurs=3&lstSimple=3&lstMultiple=2&lstMultiple=4&btnEnvoyer=Envoyer&se
cret=uneValeur
Des nouveauts apparassent )ans la re/u4te 3TTP )u clent +
POST URL HTTP/1.1
la re/u4te AET a lass place = une re/u4te P?ST. 7es param.tres ne sont plus prsents )ans cette
prem.re lgne )e la re/u4te. ?n peut constater /u,ls sont mantenant placs )err.re la re/u4te 3TTP
apr.s une lgne v)e. 7eur enco)age est )ent/ue = celu /u,ls avaent )ans la re/u4te AET.
Content-Length
nom-re )e caract.res >posts>1 c.a.). le nom-re )e caract.res /ue )evra lre le serveur 0e- apr.s avor
reLu les ent4tes 3TTP pour rcuprer le )ocument /ue lu envoe le clent. 7e )ocument en /ueston est
c la lste )es valeurs )u !ormulare.
Content-type
prcse le tDpe )u )ocument /ue le clent enverra apr.s les ent4tes 3TTP. 7e tDpe Oapplcaton&%-000-
!orm-urlenco)e)Q n)/ue /ue c,est un )ocument contenant )es valeurs )e !ormulare.
7es !on)amentau% )u )veloppement asp.net 1#F&1'"
(l D a )eu% mtho)es pour transmettre )es )onnes = un serveur 0e- + AET et P?ST. ^-a-t-l une mtho)e melleure /ue l,autre W
Nous avons vu /ue s les valeurs ),un !ormulare taent envoDes par le navgateur avec la mtho)e AET1 le navgateur a!!chat
)ans son champ )'resse l,KB7 )eman)e sous la !orme :R;Cparam12val1Dparam&2val&D.... ?n peut vor cela comme un
avantage ou un nconvnent +
un avantage s on veut permettre = l,utlsateur )e placer cette KB7 paramtre )ans ses lens !avors
un nconvnent s on ne souhate pas /ue l,utlsateur at acc.s = certanes n!ormatons )u !ormulare tels1 par e%emple1 les
champs cachs
Par la sute1 nous utlserons /uas e%clusvement la mtho)e P?ST )ans nos !ormulares.
,., 1raitement ct ser"eur des "aleurs d'un #ormulaire
%.%.1 Pr1sentati$n #e "9exe2p"e
8antenant /ue nous avons !at le len entre la -alse 3T87 M!orm metho)T>AET&P?ST> ...N et la !aLon utlse par le
navgateur pour envoDer les valeurs )u !ormulare1 nous savons comment c<t serveur rcuprer celles-c. *,est le chaptre
prc)ent /u nous a )onn la rponse +
s la mtho)e )e la -alse M!ormN est AET1 les valeurs )es param.tres seront rcupres )ans la collecton
OBe/uest.EuerDStrngQ
s la mtho)e )e la -alse M!ormN est P?ST1 les valeurs )es param.tres >posts> seront rcupres )ans la collecton
OBe/uest.]ormQ. (l !aut c apporter une prcson. 7a -alse M!ormN peut prcser = l,a)e )e l,attr-ut OactonQ l,url c-le )u
AET ou )u P?ST. *ette url peut tr.s -en 4tre paramtre /u,on at un AET ou un P?ST1 sous la !orme
actonT>urlWparam1Tval1`param"Tval"`..>. *es param.tres s,a9outent alors = ceu% comprs entre les -alses M!ormN et
M&!ormN et /u vont !are l,o-9et ),un trans!ert vers le serveur au moDen ),un AET ou ),un P?ST. Parce /u,ls !ont parte
)e l,url c-le1 ls seront o-tenus )ans la collecton OBe/uest.EuerDStrngQ /u,on at a!!are = un AET ou = un P?ST.
Nous crvons mantenant une applcaton 8V* = )eu% vues +
la prem.re vue est le !ormulare prc)ent. Nous l,appellerons Ovueb!ormulareQ.
la secon)e vue est une page ),n!ormatons lstant les valeurs sases )ans la prem.re page. Kn len permet le retour au
!ormulare. Nous appellerons cette vue Ovuebcon!rmatonQ.
7a vue Ovueb!ormulareQ une envoDe = l,utlsateur /u la remplt et la val)e. Elle pourrat ressem-ler = cec 9uste avant la val)aton
+
7es !on)amentau% )u )veloppement asp.net 1#$&1'"
7,utlsateur utlse le -outon OEnvoDerQ pour val)er ses sases. (l reLot en retour1 la vue Ovuebval)atonQ suvante +
%.%.2 Le c$ntr0"eur #e "9app"icati$n
Nous avons vu )ans le chaptre prc)ent1 /ue nous pouvons con!er le r<le )u contr<leur ),une applcaton 8V* au !cher
Oglo-al.asa%Q par /u transtent toutes les re/u4tes )es clents. Nous avons )9= prsent une applcaton 8V* construte ans et
nous suvons c le mo).le )e )veloppement prsent alors. 7e !cher Oglo-al.asa%Q sera le suvant +
<%@ Application src="Global.asax.vb" Inherits="Global" %>
(l est consttu ),une un/ue lgne r!renLant le contr<leur plac )ans le !cher Oglo-al.asa%.v-Q +
Imports System
Imports System.Web
Imports System.Web.SessionState
Public Class Global
Inherits System.Web.HttpApplication
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' on rcupre l'action faire
Dim action As String
If Request.QueryString("action") Is Nothing Then
action = "init"
Else
action = Request.QueryString("action").ToString.ToLower
End If
' on excute l'action
Select Case action
Case "init"
Server.Transfer("formulaire.aspx", False)
Case "validation"
Server.Transfer("validation.aspx", True)
Case Else
Server.Transfer("formulaire.aspx", True)
End Select
End Sub
End Class
7e prncpe )u contr<leur est le suvant +
l atten) )ans l,url c-le1 une chaVne )e param.tres contenant le param.tre OactonQ. S celu-c est a-sent1 on !at comme s
on avat eu OactonTntQ )ans la chaVne )e param.tres.
seules )eu% actons sont reconnues +
o init + on )lvre au clent le !ormulare pr-rempl
o "alidation + on )lvre au clent la page con!rmant les sases /u,l a !ates
s l,acton n,est pas l,une )es prc)entes1 on !at comme s on avat eu OactonTntQ. ?n pourrat auss )lvrer une page
),erreur.
7es !on)amentau% )u )veloppement asp.net 1#H&1'"
%.%.3 Traite2ent #e "9acti$n init
7ors/ue le contr<leur trate l,acton >nt>1 l )ot gnrer un !ormulare pr-rempl. *,est le r<le )e la page O!ormulare.asp%Q )e !are
ce traval. Son co)e est le suvant +
<HTML>
<HEAD>
<title>Formulaire</title>
<script language="javascript">
function effacer(){
alert("Vous avez cliqu sur le bouton [Effacer]");
}
function raz(liste){
liste.selectedIndex=-1
}
</script>
</HEAD>
<body>
<p>
Gestion d'un formulaire
</p>
<hr>
<form name="formulaire" method="post" action="?action=validation">
<table border="1">
<tr>
<td>
Etes-vous mari(e)</td>
<td>
<p align="center">
<input type="radio" value="oui" name="rdMarie">Oui <input type="radio" checked value="non"
name="rdMarie">Non
</p>
</td>
</tr>
....
<td>
<select size="3" name="lstSimple">
<option value="1" selected>liste1</option>
<option value="2">liste2</option>
<option value="3">liste3</option>
<option value="4">liste4</option>
<option value="5">liste5</option>
</select>
<INPUT type="button" value="Raz" name="btnRazSimple" onclick="raz(lstSimple)">
</td>
....
<td>
<select multiple size="3" name="lstMultiple">
<option value="1" selected>multiple1</option>
<option value="2">multiple2</option>
<option value="3" selected>multiple3</option>
<option value="4">multiple4</option>
<option value="5">multiple5</option>
</select>
<INPUT type="button" value="Raz" name="btnRazMultiple" onclick="raz(lstMultiple)">
</td>
...
</table>
<input type="hidden" name="secret" value="uneValeur">
</form>
</body>
</HTML>
Nous retrouvons le co)e 3T87 )u !ormulare tu) prc)emment = /uel/ues )!!rences pr.s. 7e co)e )e la -alse M!ormN a t
mo)! +
<form name="formulaire" method="post" action="?action=validation">
post + les valeurs sases par l,utlsateur pus envoDes au serveur lors/ue le -outon )e tDpe Osu-mtQ sera utls le seront
par la mtho)e 3TTP P?ST
action + la sDnta%e actonT>url> sert = )sgner l,url = la/uelle )ovent 4tre envoDes les valeurs )u !ormulare. *ette url
peut comporter une chaVne )e param.tres )e la !orme param1Tval1`param"Tval"`... *,est ce /u est !at c o6 nous
passons le param.tre OactonTval)atonQ pour n)/uer au contr<leur l,acton /u,l )ot entrepren)re. ?n peut noter /ue
cette chane )e param.tres n,est pas prc)e ),une a)resse 0e-. 7e navgateur enverra alors les param.tres )u !ormulare
= l,a)resse /u lu a !ourn ce !ormulare. Dans notre e%emple prsent plus haut1 cette a)resse est
7es !on)amentau% )u )veloppement asp.net 1#I&1'"
Ohttp+&&localhost&mvc!orm1Q. 7e navgateur !era )onc une re/u4te OP?ST &mvc!orm1WactonTval)atonQ = la machne
OlocalhostQ.
Des -outons ont t a9outs a!n )e permettre = l,utlsateur )e )slectonner les lments )es lstes OlstSmpleQ et Olst8ultpleQ +
*ela se tra)ut par le co)e 3T87 suvant +
<td>
<select size="3" name="lstSimple">
<option value="1" selected>liste1</option>
<option value="2">liste2</option>
<option value="3">liste3</option>
<option value="4">liste4</option>
<option value="5">liste5</option>
</select>
<INPUT type="button" value="Raz" name="btnRazSimple" onclick="raz(lstSimple)">
</td>
....
<td>
<select multiple size="3" name="lstMultiple">
<option value="1" selected>multiple1</option>
<option value="2">multiple2</option>
<option value="3" selected>multiple3</option>
<option value="4">multiple4</option>
<option value="5">multiple5</option>
</select>
<INPUT type="button" value="Raz" name="btnRazMultiple" onclick="raz(lstMultiple)">
</td>
Kn clc sur un -outon OBa5Q provo/ue la )slecton )e tout lment )e la lste = la/uelle l est assoc. Prenons l,e%emple )e la lste
Olst8ultpleQ. Kn clc sur le -outon OBa5Q correspon)ant1 provo/ue l,e%cuton )e la !oncton 2avascrpt Ora5:lst8ultple;Q. Bappelons
/ue le co)e 2avascrpt ),un )ocument 3T87 a!!ch par un navgateur est e%cut par ce m4me navgateur et non pas par le
serveur. 2avascrpt est un langage tr.s complet /u permet )e )onner un aspect )Dnam/ue = )es pages sans nterventon )u serveur.
7a !oncton Ora5Q est la suvante +
function raz(liste){
liste.selectedIndex=-1
}
*ette !oncton reLot un param.tre /u est un o-9et 2avascrpt reprsentant une lste 3T87. *et o-9et a )es proprts et )es
mtho)es. 7,une )e ses proprts est Oselecte)(n)e%Q )ont la valeur est le numro )e la prem.re opton slectonne )ans la lste
3T87. S,l n,D en a pas1 cette proprt vaut -1. (nversement !%er une valeur = cette proprt revent = slectonner un nouvel
lment )ans la lste 3T87 et lu )onner la valeur -1 revent = n,avor aucun lment slectonn. *,est ce /u est !at c.
?n remar/uera en!n /ue le co)e )e prsentaton O!ormulare.asp%Q n,est pas accompagn ),un contr<leur O!ormulare.asp%.v-Q. En
e!!et1 l n,D a aucune parte )Dnam/ue gnre par le serveur )ans le )ocument 3T87 )onc aucune ncesst ),avor un contr<leur.
%.%.% Traite2ent #e "9acti$n va"i#ati$n
7ors/ue le contr<leur trate l,acton >val)aton>1 l )ot gnrer une page lstant les valeurs sases par l,utlsateur. *,est le r<le )e la
page Oval)aton.asp%Q. Vsuellement la page se prsente )e la !aLon suvante +
7es !on)amentau% )u )veloppement asp.net 1#G&1'"
Son co)e 3T87 est le suvant +
<%@ Page src="validation.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="validation" %>
<HTML>
<HEAD>
<title>validation</title>
</HEAD>
<body>
<P>Valeurs saisies</P>
<HR width="100%" SIZE="1">
<TABLE id="Table1" cellSpacing="1" cellPadding="1" width="300" border="1">
<TR>
<TD width="84">rdMarie</TD>
<TD><% =rdMarie%></TD>
</TR>
<TR>
<TD width="84">C1</TD>
<TD><%=C1%></TD>
</TR>
<TR>
<TD width="84">C2</TD>
<TD><%=C2%></TD>
</TR>
<TR>
<TD width="84">C3</TD>
<TD><%=C3%></TD>
</TR>
<TR>
<TD width="84">txtSaisie</TD>
<TD><%=txtSaisie%></TD>
</TR>
<TR>
<TD width="84">txtMdp</TD>
<TD><%=txtMdp%></TD>
</TR>
<TR>
<TD width="84">areaSaisie</TD>
<TD><%=areaSaisie%></TD>
</TR>
<TR>
<TD width="84">cmbValeurs</TD>
<TD><%=cmbValeurs%></TD>
</TR>
<TR>
<TD width="84">lstSimple</TD>
<TD><%=lstSimple%></TD>
</TR>
<TR>
<TD width="84">lstMultiple</TD>
<TD><%=lstMultiple%></TD>
</TR>
7es !on)amentau% )u )veloppement asp.net 1#S&1'"
<TR>
<TD width="84">secret</TD>
<TD><%=secret%></TD>
</TR>
</TABLE>
</body>
</HTML>
7es partes )Dnam/ues MZTvara-leZN )u )ocument sont calcules par le contr<leur Oval)aton.asp%.v-Q assoc +
Imports System.Text.RegularExpressions
Public Class validation
Inherits System.Web.UI.Page
Protected rdMarie As String
Protected C1 As String
Protected C2 As String
Protected C3 As String
Protected txtSaisie As String
Protected txtMdp As String
Protected areaSaisie As String
Protected cmbValeurs As String
Protected lstSimple As String
Protected lstMultiple As String
Protected secret As String
Protected delimiteur As New Regex("\r\n")
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on rcupre les paramtres posts
rdMarie = getValue("rdMarie")
C1 = getValue("C1")
C2 = getValue("C2")
C3 = getValue("C3")
txtSaisie = getValue("txtSaisie")
txtMdp = getValue("txtMdp")
areaSaisie = String.Join(",", delimiteur.Split(getValue("areaSaisie")))
cmbValeurs = getValue("cmbValeurs")
lstSimple = getValue("lstSimple")
lstMultiple = getValue("lstMultiple")
secret = getValue("secret")
End Sub
Private Function getValue(ByVal champ As String) As String
' rcupre la valeur du champ &champ' de la requte poste
' qq chose %
If Request.Form(champ) Is Nothing Then Return ""
' on rcupre la ou les valeurs du champ
Dim valeurs() As String = Request.Form.GetValues(champ)
Dim valeur As String = ""
Dim i As Integer
For i = 0 To valeurs.Length - 1
valeur += "[" + valeurs(i) + "]"
Next
Return valeur
End Function
End Class
7e calcul )es valeurs = a!!cher est !at )ans la proc)ure O]ormb7oa)Q. 7a valeur ),un champ >post> est o-tenue par la !oncton
getValue:*; o6 * est le nom )u champ. 7es ponts cls )e cette !oncton sont les suvants +
s * n,est pas )ans la chaVne )e param.tres poste alors on ren) la chaVne v)e pour valeur )e *
snon on o-tent le ta-leau )es valeurs )u champ * par ORequest.Form.GetValues(C)]. *elles-c sont concatnes )ans
une chaVne )e caract.res sous la !orme Oval1QOval"Q...OvalnQ o6 OvalQ est la valeur nR )u champ *
7e champ OareaSaseQ est trat )e !aLon partcul.re. Sa valeur est envoDe par le navgateur sous la !orme
areaSaseTlgne1PrPnlgne"PrPn... o6 Pr est le caract.re )e co)e AS*(( 1F :retour charot; et Pn le caract.re )e co)e AS*(( 1# :saut
)e lgne;. 7a !oncton OgetValue:areaSase;Q ren) )onc la chaVne >lgne1PrPnlgne"PrPn...>. *ette chaVne est )coupe en lgnes par
la mtho)e OBege%.SpltQ. ?n o-tent alors un ta-leau )e chaVnes clgne11lgne"1...d. *e ta-leau est trans!orm en chaVne
>lgne11lgne"1...> par la mtho)e OStrng.2onQ. *,est cette )ern.re chaVne /u sera a!!che pour valeur )u champ OareaSaseQ. 7e -ut
tat c )e montrer comment on pouvat o-tenr les )!!rentes lgnes ),un champ 3T87 )e tDpe OTe%tAreaQ.
%.%.& Tests
Nous plaLons tous les !chers :glo-al.asa%1 glo-al.asa%.v-1 !ormulare.asp%1 val)aton.asp%1 val)aton.asp%.v-; )ans un )osser
Mapplcaton-pathN. Nous lanLons le serveur *assn avec les param.tres :Mapplcaton-pathN1&mvc!orm1;. Nous crons )ans le
7es !on)amentau% )u )veloppement asp.net 1#'&1'"
)osser Mapplcaton-pathN un !cher O)e!ault.asp%Q v)e pus nous )eman)ons l,url Ohttp+&&localhost&mvc!orm1Q. *omme
O&mvc!orm1Q est le chemn vrtuel ),un )osser et non ),un )ocument1 le serveur 0e- va a!!cher le )ocument O)e!ault.asp%Q s,l est
prsent. *,est pour/uo nous avons cr celu-c. Avant )e l,a!!cher1 le scrpt Oglo-al.asa%Q va 4tre e%cut et va !nalement !are
a!!cher la page O!ormulare.asp%Q. *,est pour/uo le !cher O)e!ault.asp%Q peut 4tre v)e.
Supposons /ue le !ormulare val) sot le suvant +
7,utlsaton )u -outon OEnvoDerQ renvoe la page suvante +
Bemar/uons tout ),a-or) l,url )e la rponse + Ohttp+&&localhost&mvc!orm1&WactonTval)atonQ. *,est l,KB7 )e l,attr-ut OactonQ )e
la -alse M!ormN )u !ormulare O!ormulare.asp%Q +
7es !on)amentau% )u )veloppement asp.net 11#&1'"
<form name="formulaire" method="post" action="?action=validation">
E%amnons une = une les valeurs o-tenues pour les )!!rents champs )u !ormulare +
champ "aleur
51%L
commentaires
r)8are ou
<input type="radio" value="oui"
name="rdMarie">Oui
<input type="radio" checked value="non"
name="rdMarie">Non
la valeur o-tenue est l,attr-ut OvalueQ )u
-outon coch
*1 un
<input type="checkbox" value="un"
name="C1">1
)em
*" )eu%
<input type="checkbox" checked
value="deux" name="C2">2
)em
*F
<input type="checkbox" value="trois"
name="C3">3
ce -outon n,a pas t coch par
l,utlsateur. Sa valeur n,a alors pas t
envoDe par le navgateur. Dans le co)e1 la
con)ton OBe/uest.]orm:>*F>; s
NothngQ a )onc t vrae.
t%tSase programmaton
asp.net
<input type="text" ...
name="txtSaisie">
la valeur o-tenue est le te%te prsent )ans
le champ )e sase au moment )e la
val)aton
t%t8)p m)p
<input type="password"
...name="txtMdp">
)em
areaSase les -ases )e la
programmaton 0e-
<textarea
name="areaSaisie">...</textarea>
)em
cm-Valeur
s
F
<select name="cmbValeurs">
...
<option value="3">choix3</option>
</select>
la valeur o-tenue est l,attr-ut OvalueQ )e
l,opton slectonne
lstSmple F
<select size="3" name="lstSimple">
....
<option value="3">liste3</option>
...
</select>
)em
lst8ultple " $
<select multiple size="3"
name="lstMultiple">
...
<option value="2">multiple2</option>
...
<option value="4">multiple4</option>
...
</select>
les valeurs o-tenues sont celles )es
attr-uts OvalueQ )es optons slectonnes
secret uneValeur
<input type="hidden" name="secret"
value="uneValeur">
la valeur o-tenue est l,attr-ut OvalueQ )u
champ cach
8antenant ntressons-nous au% lstes. Supposons /u,au moment )e la val)aton l,tat )u !ormulare sot le suvant +
l,opton Ocho%1Q est slectonne )ans le com-oBo%
aucune opton n,est slectonne )ans les )eu% autres lstes. ?n a utls les -outons OBa5Q pour o-tenr cela.
Voc la page retourne apr.s val)aton +
7es !on)amentau% )u )veloppement asp.net 111&1'"
7ors/u,aucune valeur n,est slectonne )ans une lste1 le navgateur n,envoe pas )e param.tre pour celle-c. Dans le co)e )e
Oval)aton.asp%.v-Q1 les e%pressonsOBe/uest.]orm:>lstSmple>;Q et OBe/uest.]orm:>lst8ultple>;Q sont )onc gales = la constante
ONothngQ ),o6 le rsultat a!!ch c-)essus.
,.- %aintenir l'tat d'une pae
%.&.1 Maintenir "91tat #9une page avec une sessi$n
Nous )upl/uons la totalt )e l,applcaton prc)ente )ans un nouveau )osser. Nous a9outons un len )ans la page
Oval)aton.asp%Q permettant = l,utlsateur )e revenr au !ormulare +
7a mo)!caton = oprer sur la page Oval)aton.asp%Q est l,a9out )u len +
.....
<TR>
<TD width="84">secret</TD>
<TD><%=secret%></TD>
</TR>
</TABLE>
<P>
<a href="?action=formulaire">Retour au formulaire</a>
</P>
</body>
</HTML>
7,attr-ut Ohre!Q )u len a pour valeur une url paramtre avec pour seul param.tre OactonT!ormulareQ1 permettant au serveur )e
savor /u,l )ot a!!cher le !ormulare tel /u,l tat lors/u,l a t val). (l D a )onc une )!!rence avec l,acton OntQ /u a!!che un
!ormulare pr)!n. 7,url paramtre OWactonT!ormulareQ n,a en !at pas ),url. *elle-c sera )onc la m4me /ue celle /u a perms
l,a!!chage )e la page )e val)aton. S on se souvent )e l,tu)e prc)ente1 celle-c est l,url )u )osser )e l,applcaton. 7a )eman)e
passera )onc par le contr<leur. *elu-c )ot mantenant trater l,acton O!ormulareQ. 7e co)e )e Oglo-al.asa%.v-Q est mo)! comme
sut +
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' on rcupre l'action faire
Dim action As String
If Request.QueryString("action") Is Nothing Then
action = "init"
Else
action = Request.QueryString("action").ToString.ToLower
End If
' on excute l'action
Select Case action
Case "init"
Server.Transfer("formulaire.aspx", False)
Case "validation"
Server.Transfer("validation.aspx", True)
Case "formulaire"
Server.Transfer("formulaire.aspx", True)
Case Else
Server.Transfer("formulaire.aspx", True)
End Select
End Sub

Dans le cas o6 l,acton est >!ormulare>1 on se contente )e passer la re/u4te = la page O!ormulare.asp%Q. ?n sat /ue celle-c a!!che
un !ormulare pr)!n )ans le/uel l n,D a aucune parte vara-le. *ette page ne peut )onc a!!cher le !ormulare avec les valeurs
/u,l avat lors/u,l a t val). ?n cherche c = mettre en v)ence ce pont. S l,ensem-le )es !chers )e l,applcaton ont t placs
)ans Mapplcaton-pathN1 nous lanLons *assn avec les param.tres :Mapplcaton-pathN1&mvc!orm"; pus nous )eman)ons l,url
Ohttp+&&localhost&mvc!orm"Q. Nous o-tenons la page suvante :vue partelle; +
7es !on)amentau% )u )veloppement asp.net 11"&1'"
Nous remplssons le !ormulare )e la !aLon suvante pus le val)ons +
Nous o-tenons la page )e con!rmaton suvante +
Nous utlsons le len OBetour au !ormulareQ prsent :mas non reprsent; sur la page c-)essus. Nous o-tenons la rponse suvante
)u serveur +
Nous constatons /ue +
l,url )eman)e a -en le param.tre OactonT!ormulareQ comme l tat souhat
le !ormulare a!!ch a per)u les valeurs sases.
Nous savons pour/uo nous ne retrouvons pas les valeurs sases. S nous regar)ons le co)e )u )ocument O!ormulare.asp%Q1 nous
constatons /ue tout est stat/ue et /u,l est o-lg ans ),a!!cher = cha/ue !os la m4me page. ?n vot -en /u,l nous !aut ren)re ce
co)e )Dnam/ue. (l !au)ra /u,l a!!che les valeurs val)es par l,utlsateur. 8as o6 mmorser celles-c W
Bappelons la lo ),aran )u protocole sans tat 3TTP +
l,url Ohttp+&&localhost&mvc!orm"Q est )eman)e - une rponse est reLue. Kne lason T*P-(P a t ouverte entre le clent
et le serveur au )-ut )e la )eman)e et !erme = la !n )e la rponse.
l,utlsateur sast pus val)e )es )onnes. 7,url Ohttp+&&localhost&mvc!orm"&WactonTval)atonQ est )eman)e - une
rponse est reLue. Kne nouvelle conne%on T*P-(P a t ouverte pus !erme entre les )eu% partenares.
l,utlsateur utlse le len OBetour au !ormulareQ. 7,url Ohttp+&&localhost&mvc!orm"&WactonT!ormulareQ est )eman)e -
une rponse est reLue. Kne nouvelle conne%on T*P-(P a t )e nouveau ouverte pus !erme entre les )eu% partenares.
7es !on)amentau% )u )veloppement asp.net 11F&1'"
7es cDcles )eman)e-rponse sont n)pen)ants les uns )es autres parce /ue chacun ),eu% utlse une nouvelle conne%on T*P-(P.
7ors/u,une applcaton clent-serveur utlse une un/ue conne%on T*P-(P pour une sute ),changes1 le serveur peut )ent!er un
clent va sa conne%on. (l peut )onc mmorser )es n!ormatons /u,l va ler = une conne%on prcse et ans avor un suv )es
changes. 7ors/ue les changes se !ont sur )es conne%ons )!!rentes1 le serveur ne peut )ent!er un clent = une conne%on. (l
!aut un autre moDen. Nous avons prsent l,un ),eu% )ans le chaptre prc)ent + le mcansme )e la sesson. (l permet au% cDcles
)eman)e-rponse )e mmorser )es n!ormatons )ans un o-9et OSessonQ access-le = tous les cDcles success!s.
8antenant /ue nous avons une applcaton 8V* avec sesson1 nous ne pouvons plus utlser le !cher Oglo-al.asa%Q comme
contr<leur comme l a t montr au chaptre prc)ent. 7e r<le )e contr<leur ),applcaton )ot 4tre 9ou par une page partcul.re
))e = cela. (c1 ce sera la page Oman.asp%Q. Nous proc)erons ans +
lors/ue l,utlsateur val)era ses )onnes :actonTval)aton;1 le contr<leur Oman.asp%.v-Q les mmorsera )ans la sesson
courante avant )e !are a!!cher la page )e val)aton.
lors/u,l !au)ra !are a!!cher le !ormulare avec les valeurs sases :actonT!ormulare;1 le contr<leur Oman.asp%.v-Q les
rcup.rera )ans la sesson et les mettra )ans le conte%te avant )e !are a!!cher le !ormulare.
%.&.2 Le n$uveau c$ntr0"eur #9app"icati$n
7e contr<leur ),applcaton est !orm )es )eu% !chers Oman.asp%1 man.asp%.v-Q +
Oman.asp%Q
<%@ Page src="main.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="main" %>
Oman.asp%.v-Q
Imports System.Collections.Specialized
Imports Microsoft.VisualBasic
Public Class main
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre l'action faire
Dim action As String
If Request.QueryString("action") Is Nothing Then
action = "init"
Else
action = Request.QueryString("action").ToString.ToLower
End If
' on excute l'action
Select Case action
Case "init"
' on affiche le formulaire pr#rempli
Context.Items("formulaire") = initForm()
Server.Transfer("formulaire.aspx", True)
Case "validation"
' on affiche la page de confirmation aprs avoir enregistr les valeurs postes dans la session
Session.Item("formulaire") = Request.Form
Server.Transfer("validation.aspx", True)
Case "formulaire"
' on affiche le formulaire avec des valeurs prises dans la session
Context.Items("formulaire") = Session.Item("formulaire")
Server.Transfer("formulaire.aspx", True)
Case Else
' on affiche le formulaire pr#rempli
Context.Items("formulaire") = initForm()
Server.Transfer("formulaire.aspx", True)
End Select
End Sub
Private Function initForm() As NameValueCollection
' on initialise le formulaire
Dim form As New NameValueCollection
form.Set("rdMarie", "non")
form.Set("C2", "deux")
form.Set("txtSaisie", "qqs mots")
form.Set("txtMdp", "ceciestsecret")
form.Set("areasaisie", "ligne1" + ControlChars.CrLf + "ligne2" + ControlChars.CrLf)
form.Set("cmbValeurs", "2")
form.Set("lstSimple", "1")
form.Set("lstMultiple", "1")
form.Add("lstMultiple", "3")
Return form
End Function
End Class
7es !on)amentau% )u )veloppement asp.net 11$&1'"
?n retrouve l,essence )e la structure )u contr<leur ),applcaton tu) prc)emment avec les )!!rences suvantes +
le traval )u contr<leur se !at )ans la proc)ure OPageb7oa)Q
)ans le cas )e l,acton Oval)atonQ1 les valeurs )u !ormulare prsentes )ans OBe/uest.]ormQ sont stoc[es )ans la sesson
assoces = la cl >!ormulare>. Ensute l,e%cuton est trans!re = la page Oval)aton.asp%Q /u a!!chera ces valeurs.
pour les autres actons1 l,e%cuton est trans!re )ans tous les cas = la page O!ormulare.asp%Q. *elle-c atten) )ans son
conte%te1 une cl >!ormulare> /u sera assoce = un o-9et )u tDpe )e OBe/uest.!ormQ c.a.). )e tDpe
ONameValue*ollectonQ. *et o-9et )ot contenr la collecton )es valeurs )es champs )u !ormulare.
)ans le cas o6 l,acton est OntQ ou une acton non reconnue1 la collecton )es valeurs est construte ar-trarement par la
!oncton Ont]ormQ.
)ans le cas o6 l,acton est O!ormulareQ1 cette collecton est la collecton OBe/uest.]ormQ /u avat t place )ans la sesson
par l,acton Oval)atonQ
%.&.3 Le n$uveau :$r2u"aire
Parce /ue l,applcaton n,a!!che pas tou9ours le m4me contenu )ans le !ormulare1 celu-c )ot 4tre gnr )Dnam/uement. 7a
nouvelle page O!ormulare.asp%Q )event la suvante +
<%@ Page src="formulaire.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="formulaire" %>
<HTML>
<HEAD>
<title>Formulaire</title>
<script language="javascript">
function effacer(){
alert("Vous avez cliqu sur le bouton [Effacer]");
}
function raz(liste){
liste.selectedIndex=-1
}
</script>
</HEAD>
<body>
<p>
Gestion d'un formulaire
</p>
<hr>
<form name="formulaire" method="post" action="main.aspx?action=validation">
<table border="1">
<tr>
<td>
Etes-vous mari(e)</td>
<td>
<p align="center">
<INPUT type="radio" value="oui" name="rdMarie" <%=rdouichecked%>>Oui
<INPUT type="radio" value="non" name="rdMarie" <%=rdnonchecked%>>Non
</p>
</td>
</tr>
<TR>
<TD>Cases cocher
</TD>
<TD>
<P align="center">
<INPUT type="checkbox" value="un" name="C1" <%=c1checked%>>1
<INPUT type="checkbox" value="deux" name="C2" <%=c2checked%>>2
<INPUT type="checkbox" value="trois" name="C3" <%=c3checked%>>3
</P>
</TD>
</TR>
<TR>
<TD>Champ de saisie</TD>
<TD>
<P align="center">
<INPUT type="text" maxLength="30" value="<%=txtSaisie%>" name="txtSaisie">
</P>
</TD>
</TR>
<tr>
<td>
Mot de passe</td>
<td>
<p align="center">
<input type="password" maxlength="12" size="12" value="<%=txtMdp%>" name="txtMdp">
7es !on)amentau% )u )veloppement asp.net 11H&1'"
</p>
</td>
</tr>
<tr>
<td>
Bote de saisie</td>
<td>
<textarea name="areaSaisie"><%=areaSaisie%></textarea>
</td>
</tr>
<tr>
<td>
ComboBox</td>
<td>
<select name="cmbValeurs">
<%=cmbValeursOptions%>
</select>
</td>
</tr>
<tr>
<td>
Liste choix simple</td>
<td>
<select size="3" name="lstSimple">
<%=lstSimpleOptions%>
</select>
<INPUT type="button" value="Raz" name="btnRazSimple" onclick="raz(lstSimple)">
</td>
</tr>
<tr>
<td>
Liste choix multiple</td>
<td>
<select multiple size="3" name="lstMultiple">
<%=lstMultipleOptions%>
</select>
<INPUT type="button" value="Raz" name="btnRazMultiple" onclick="raz(lstMultiple)">
</td>
</tr>
<tr>
<td>
Bouton simple</td>
<td>
<p align="center">
<input onclick="effacer()" type="button" value="Effacer" name="btnEffacer">
</p>
</td>
</tr>
<tr>
<td>
Bouton submit</td>
<td>
<p align="center">
<input type="submit" value="Envoyer" name="btnEnvoyer">
</p>
</td>
</tr>
<tr>
<td>
Bouton reset</td>
<td>
<p align="center">
<input type="reset" value="Rtablir" name="btnRetablir" runat="server">
</p>
</td>
</tr>
</table>
<input type="hidden" name="secret" value="uneValeur">
</form>
</body>
</HTML>
*ommentons les vara-les )Dnam/ues /u apparassent )ans le co)e 3T87 +
"ariable rle
rdouichecked
aura la valeur >chec[e)> s le -outon ra)o OouQ )ot 4tre coch1 la valeur >> snon
rdnonchecked
)em pour le -outon ra)o OnonQ
c1checked
)em pour la case = cocher O*1Q
c2checked
)em pour la case = cocher O*"Q
7es !on)amentau% )u )veloppement asp.net 11I&1'"
c3checked
)em pour la case = cocher O*FQ
txtSaisie
le te%te = placer )ans le champ Ot%tSaseQ
txtMdp
le te%te = placer )ans le champ Ot%t8)pQ
areaSaisie
le te%te = placer )ans le champ OareaSaseQ
cmbValeursOptions
le te%te 3T87 )es optons )e la lste select Ocm-ValeursQ
lstSimpleOptions
le te%te 3T87 )es optons )e la lste select OlstSmpleQ
lstMultipleOptions
le te%te 3T87 )es optons )e la lste select Olst8ultpleQ
7es valeurs )e ces vara-les sont calcules par le contr<leur )e la page O!ormulare.asp%.v-Q +
Imports Microsoft.VisualBasic
Imports System.Collections.Specialized
Public Class formulaire
Inherits System.Web.UI.Page
' champs constants du formulaire
Private libellsCmbValeurs() As String = {"choix1", "choix2", "choix3"}
Private valeursCmbValeurs() As String = {"1", "2", "3"}
Private libellsLstSimple() As String = {"liste1", "liste2", "liste3"}
Private valeursLstSimple() As String = {"1", "2", "3"}
Private libellsLstMultiple() As String = {"multiple1", "multiple2", "multiple3", "multiple4",
"multiple5"}
Private valeursLstMultiple() As String = {"1", "2", "3", "4", "5"}
' champs d"namiques du formulaire
Protected rdouichecked As String
Protected rdnonchecked As String
Protected c1checked As String
Protected c2checked As String
Protected c3checked As String
Protected txtSaisie As String
Protected txtMdp As String
Protected areaSaisie As String
Protected cmbValeursOptions As String
Protected lstSimpleOptions As String
Protected lstMultipleOptions As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre la prcdente requte dans la session
Dim form As NameValueCollection
If Not Context.Items("formulaire") Is Nothing Then
form = Context.Items("formulaire")
Else
form = New NameValueCollection
End If
' on prpare la page afficher
' boutons radio
rdouichecked = ""
rdnonchecked = "checked"
If isEqual(form("rdMarie"), "oui") Then
rdouichecked = "checked"
rdnonchecked = ""
End If
' cases cocher
c1checked = ""
If isEqual(form("C1"), "un") Then c1checked = "checked"
c2checked = ""
If isEqual(form("C2"), "deux") Then c2checked = "checked"
c3checked = ""
If isEqual(form("C3"), "trois") Then c3checked = "checked"
' champs de saisie
txtSaisie = ""
If Not form("txtSaisie") Is Nothing Then txtSaisie = form("txtSaisie").ToString
txtMdp = ""
If Not form("txtMdp") Is Nothing Then txtMdp = form("txtMdp").ToString
areaSaisie = ""
If Not form("areaSaisie") Is Nothing Then areaSaisie = form("areaSaisie").ToString
' listes
Dim slections() As String = {}
If Not form("cmbValeurs") Is Nothing Then slections = form.GetValues("cmbValeurs")
cmbValeursOptions = getOptions(valeursCmbValeurs, libellsCmbValeurs, slections)
slections = New String() {}
If Not form("lstSimple") Is Nothing Then slections = form.GetValues("lstSimple")
lstSimpleOptions = getOptions(valeursLstSimple, libellsLstSimple, slections)
slections = New String() {}
If Not form("lstMultiple") Is Nothing Then slections = form.GetValues("lstMultiple")
lstMultipleOptions = getOptions(valeursLstMultiple, libellsLstMultiple, slections)
End Sub
7es !on)amentau% )u )veloppement asp.net 11G&1'"
Private Function getOptions(ByRef valeurs() As String, ByRef libelles() As String, ByRef slections()
As String) As String
' rend le code ()*+ des options d'une balise ,select-
' valeurs . tableau des valeurs des options de la balise
' libelles . tableau des libells des options de la balise
' slections . options slectionner
Dim iValeur As Integer
Dim iSelection As Integer
Dim selected As String
Dim toString As String = ""
' on parcourt la liste des valeurs des options
For iValeur = 0 To valeurs.Length - 1
' on regarde si la valeur courante doit tre slectionne
selected = "" : iSelection = 0
Do While iSelection < slections.Length And selected = ""
If valeurs(iValeur) = slections(iSelection) Then selected = "selected"
iSelection += 1
Loop
' on intgre le code ()*+ de l'option
toString += "<option " + selected + " value='" + valeurs(iValeur) + "'> " _
+ libelles(iValeur) + "</option>" + ControlChars.CrLf
Next
' on rend le rsultat
Return toString
End Function
Private Function isEqual(Byval champ As Object, ByVal valeur As String) As Boolean
' rend vrai si le champ est gal valeur
If champ Is Nothing OrElse champ.ToString <> valeur Then
Return false
Else
Return true
End If
end function
End Class
7ors/ue la page O!ormulare.asp%Q commence = s,e%cuter1 elle va trouver )ans son conte%te une cl >!ormulare> assoce = la
collecton )e valeurs )es champs /u,elle )ot a!!cher.
' on rcupre la prcdente requte dans la session
Dim form As NameValueCollection
If Not Context.Items("formulaire") Is Nothing Then
form = Context.Items("formulaire")
Else
form = New NameValueCollection
End If
?n peut se )eman)er pour/uo on vr!e /ue O*onte%t.(tems:>!ormulare>;Q e%ste. En e!!et1 le contr<leur a!!ecte une valeur = cet
o-9et )ans tous les cas. *epen)ant1 ren n,emp4che le clent )e )eman)er )rectement la page O!ormulare.asp%Q sans passer par le
contr<leur. S c,tat le cas1 le co)e prc)ent travallera avec une collecton )e valeurs v)e mas l n,D aura pas )e >plantage>.
7e co)e e%plore la collecton )e valeurs /u,l a reLues pour calculer toutes les vara-les )Dnam/ues )e la page 3T87 /u lu est
assoce. 84me s,l est long1 ce co)e n,est pas spcalement compl/u et nous lassons le lecteur s,D plonger a!n )e ne pas alour)r
cette e%plcaton. Nous nous attar)erons cepen)ant = la !aLon )e gnrer le co)e 3T87 )es tros lstes )e tDpe OselectQ. *e co)e est
gnr par la !oncton suvante +
Private Function getOptions(ByRef valeurs() As String, ByRef libelles() As String, ByRef slections()
As String) As String
' rend le code ()*+ des options d'une balise ,select-
' valeurs . tableau des valeurs des options de la balise
' libelles . tableau des libells des options de la balise
' slections . options slectionner
Dim iValeur As Integer
Dim iSelection As Integer
Dim selected As String
Dim toString As String = ""
' on parcourt la liste des valeurs des options
For iValeur = 0 To valeurs.Length - 1
' on regarde si la valeur courante doit tre slectionne
selected = "" : iSelection = 0
Do While iSelection < slections.Length And selected = ""
If valeurs(iValeur) = slections(iSelection) Then selected = "selected"
iSelection += 1
Loop
' on intgre le code ()*+ de l'option
toString += "<option " + selected + " value='" + valeurs(iValeur) + "'> " _
+ libelles(iValeur) + "</option>" + ControlChars.CrLf
7es !on)amentau% )u )veloppement asp.net 11S&1'"
Next
' on rend le rsultat
Return toString
End Function
Bappelons /ue les optons ),une -alse MselectN correspon)ent au co)e 3T87 suvant +
Mopton Oselecte)Q valueT>...>Nte%teM&optonN
Pour cha/ue opton1 l D a )onc tros n!ormatons = gnrer +
la valeur )e l,opton )ans l,attr-ut OvalueQ
le te%te )e l,opton entre les -alses MoptonN et M&optonN
le mot cl Oselecte)Q s l,opton )ot 4tre slectonne )ans la lste
Pour gnrer ces tros n!ormatons pour chacune )es optons1 la !oncton Oget?ptonsQ reLot tros valeurs +
1. le ta-leau )es valeurs )es optons )ans OvaleursQ
". le ta-leau )es te%tes )es optons )ans Ol-ellesQ
F. le ta-leau )es valeurs = slectonner )ans OslectonsQ
%.&.% La page #e va"i#ati$n
7a page )e val)aton reste nchange +
Oval)aton.asp%Q
<%@ Page src="validation.aspx.vb" Language="vb" AutoEventWireup="false" Inherits="validation" %>
<HTML>
<HEAD>
<title>validation</title>
</HEAD>
<body>
<P>Valeurs saisies</P>
<HR width="100%" SIZE="1">
<TABLE id="Table1" cellSpacing="1" cellPadding="1" width="300" border="1">
<TR>
<TD width="84">rdMarie</TD>
<TD><% =rdMarie%></TD>
</TR>
<TR>
<TD width="84">C1</TD>
<TD><%=C1%></TD>
</TR>
<TR>
<TD width="84">C2</TD>
<TD><%=C2%></TD>
</TR>
<TR>
<TD width="84">C3</TD>
<TD><%=C3%></TD>
</TR>
<TR>
<TD width="84">txtSaisie</TD>
<TD><%=txtSaisie%></TD>
</TR>
<TR>
<TD width="84">txtMdp</TD>
<TD><%=txtMdp%></TD>
</TR>
<TR>
<TD width="84">areaSaisie</TD>
<TD><%=areaSaisie%></TD>
</TR>
<TR>
<TD width="84">cmbValeurs</TD>
<TD><%=cmbValeurs%></TD>
</TR>
<TR>
<TD width="84">lstSimple</TD>
<TD><%=lstSimple%></TD>
</TR>
<TR>
<TD width="84">lstMultiple</TD>
<TD><%=lstMultiple%></TD>
</TR>
<TR>
7es !on)amentau% )u )veloppement asp.net 11'&1'"
<TD width="84">secret</TD>
<TD><%=secret%></TD>
</TR>
</TABLE>
<P>
<a href="main.aspx?action=formulaire">Retour au formulaire</a>
</P>
</body>
</HTML>
Oval)aton.asp%.v-Q
Imports Microsoft.VisualBasic
Imports System.Text.RegularExpressions
Public Class validation
Inherits System.Web.UI.Page
Protected rdMarie As String
Protected C1 As String
Protected C2 As String
Protected C3 As String
Protected txtSaisie As String
Protected txtMdp As String
Protected areaSaisie As String
Protected cmbValeurs As String
Protected lstSimple As String
Protected lstMultiple As String
Protected secret As String
Protected delimiteur As New Regex("\r\n")
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on rcupre les paramtres posts
rdMarie = getValue("rdMarie")
C1 = getValue("C1")
C2 = getValue("C2")
C3 = getValue("C3")
txtSaisie = getValue("txtSaisie")
txtMdp = getValue("txtMdp")
areaSaisie = String.Join(",", delimiteur.Split(getValue("areaSaisie")))
cmbValeurs = getValue("cmbValeurs")
lstSimple = getValue("lstSimple")
lstMultiple = getValue("lstMultiple")
secret = getValue("secret")
' on les sauvegarde dans la session
'ession/0formulaire01 2 3equest.4orm
End Sub
Private Function getValue(ByVal champ As String) As String
' rcupre la valeur du champ &champ' de la requte poste
' qq chose %
If Request.Form(champ) Is Nothing Then Return ""
' on rcupre la ou les valeurs du champ
Dim valeurs() As String = Request.Form.GetValues(champ)
Dim valeur As String = ""
Dim i As Integer
For i = 0 To valeurs.Length - 1
valeur += "[" + valeurs(i) + "]"
Next
Return valeur
End Function
End Class
%.&.& Les tests
7es !chers Oman.asp%1 man.asp%.v-1 !ormulare.asp%1 !ormulare.asp%.v-1 val)aton.asp%1 val)aton.asp%.v-Q sont placs )ans
Mapplcaton-pathN et *assn lanc avec les param.tres :Mapplcaton-pathN1&mvc!ormF;. Nous )eman)ons ensute l,url
Ohttp+&&localhost&mvc!ormF&man.asp%Q. Nous o-tenons le !ormulare pr-ntals +
7es !on)amentau% )u )veloppement asp.net 1"#&1'"
Nous remplssons le !ormulare )e la !aLon suvante +
Nous utlsons le -outon OEnvoDerQ c-)essus. Nous o-tenons la rponse suvante )u serveur +
7es !on)amentau% )u )veloppement asp.net 1"1&1'"
Nous utlsons le len OBetour au !ormulareQ c-)essus pour revenr au !ormulare. Nous o-tenons la nouvelle rponse suvante +
Nous retrouvons -en le !ormulare tel /ue nous l,avons val).
%.&.( +$nc"usi$n
7,e%emple prc)ent nous a montr /u,l tat poss-le )e mantenr l,tat ),une page au !l )es cDcles )eman)e-rponse entre le
clent et le serveur. Nanmons1 ce traval n,est pas trval. Nous verrons )ans un chaptre ultreur /u,l est poss-le avec ASP.NET
)e lasser le serveur rta-lr )e lu-m4me l,tat ),une page.
7es !on)amentau% )u )veloppement asp.net 1""&1'"
- Exemples
Nous nous proposons )ans ce chaptre ),llustrer ce /u a t vu prc)emment par une sre ),e%emples.
-.1 Exemple 1
&.1.1 Le pr$-"32e
*ette applcaton )ot permettre = un utlsateur )e calculer son mp<t. ?n se place )ans le cas smpl! ),un contr-ua-le n,aDant
/ue son seul salare = )clarer :ch!!res "##$ pour revenus "##F; +
on calcule le nom-re )e parts )u salar nb(arts<nbEn#ants+$ D1 s,l n,est pas mar1 nbEn#ants+$D$ s,l est mar1 o6
nbAnfants est son nom-re ),en!ants.
s,l a au mons tros en!ants1 l a une )em part )e plus
on calcule son revenu mposa-le R<?.F$L& o6 S est son salare annuel
on calcule son coe!!cent !amlal IJ<R+nb(arts
on calcule son mp<t 0. *ons)rons le ta-leau suvant +
4262 0 0
8382 0.0683 291.09
14753 0.1914 1322.92
23888 0.2826 2668.39
38868 0.3738 4846.98
47932 0.4262 6883.66
0 0.4809 9505.54
*ha/ue lgne a F champs. Pour calculer l,mp<t (1 on recherche la prem.re lgne o6 GH<2champ1. Par e%emple1 s E]TH### on
trouvera la lgne
M'M$ ?.?9M' $N1.?N
7,mp<t ( est alors gal = ?.?9M'LR . $N1.?NLnb(arts. S E] est tel /ue la relaton GH<2champ1 n,est 9amas vr!e1 alors ce sont
les coe!!cents )e la )ern.re lgne /u sont utlss. (c +
# #.$S#' 'H#H.H$
ce /u )onne l,mp<t (T#.$S#'_B - 'H#H.H$_n-Parts.
&.1.2 La structure M.+ #e "9app"icati$n
7a structure 8V* )e l,applcaton sera la suvante +
7e r<le )u contr<leur sera 9ou par la page Oman.asp%Q. (l D aura tros actons poss-les +
init + correspon) = la prem.re re/u4te )u clent. 7e contr<leur a!!chera la vue O!ormulare.asp%Q
calcul + correspon) = la )eman)e )e calcul )e l,mp<t. S les )onnes )u !ormulare )e sase sont correctes1 l,mp<t est
calcul grYce = la classe mter OmpotsQ. 7e contr<leur retourne au clent la vue O!ormulare.asp%Q telle /u,elle avat t
val)e avec )e plus1 l,mp<t calcul. S les )onnes )u !ormulare )e sase sont ncorrectes1 le contr<leur retournera la vue
Oerreurs.asp%Q avec la lste )es erreurs et un len pour retourner au !ormulare.
E%emples 1"F&1'"
*lent 7og/ue applcatve
*lasse
mter
OmpotQ
Oman.asp%Q
(nter!ace
clent
Donnes
Sources )e
)onnes
C04T56L/35
%/3ELE
23/1
O!ormulare.asp%Q
Oerreurs.asp%Q
*lasse ),acc.s
au% )onnes
OmpotsDataQ
retour + correspon) au retour au !ormulare apr.s une erreur. 7e contr<leur a!!che la vue O!ormulare.asp%Q telle /u,elle a
t val)e avant l,erreur.
7e contr<leur Oman.asp%Q ne connaVt ren au calcul ),mpots. (l est smplement en charge )e grer le )alogue clent-serveur et )e
!are e%cuter les actons )eman)es par le clent. Pour l,acton OcalculQ1 l s,appuera sur la classe mter OmpotQ.
&.1.3 La c"asse 21tier
7a classe impot sera )!ne comme sut +
' espaces de noms imports
Imports System
' classe
Namespace st.istia.univangers.fr
Public Class impot
Private limites(), coeffR(), coeffN() As Decimal
' constructeur
Public Sub New(ByRef source As impotsData)
' les donnes ncessaires au calcul de l'impt
' proviennent d'une source extrieure [source]
' on les rcupre - il peut y avoir une exception
Dim data() As Object = source.getData
limites = CType(data(0), Decimal())
coeffR = CType(data(1), Decimal())
coeffN = CType(data(2), Decimal())
End Sub
' calcul de l'impt
Public Function calculer(ByVal mari As Boolean, ByVal nbEnfants As Integer, ByVal salaire As Long)
As Long
' calcul du nombre de parts
Dim nbParts As Decimal
If mari Then
nbParts = CDec(nbEnfants) / 2 + 2
Else
nbParts = CDec(nbEnfants) / 2 + 1
End If
If nbEnfants >= 3 Then
nbParts += 0.5D
End If
' calcul revenu imposable & Quotient familial
Dim revenu As Decimal = 0.72D * salaire
Dim QF As Decimal = revenu / nbParts
' calcul de l'impt
limites((limites.Length - 1)) = QF + 1
Dim i As Integer = 0
While QF > limites(i)
i += 1
End While
Return CLng(revenu * coeffR(i) - nbParts * coeffN(i))
End Function
End Class
End Namespace
Kn o-9et impt est cr en !ournssant = son constructeur une source )e )onnes )e tDpe Oimpots3ataQ. *ette classe a une
mtho)e pu-l/ue Oet3ataQ /u permet ),o-tenr les tros ta-leau% )e )onnes ncessares au calcul )e l,mp<t et /u ont t
prsents prc)emment. *ette mtho)e peut gnrer une e%cepton s les )onnes n,on pu 4tre ac/uses ou s elles s,av.rent
ncorrectes. Kne !os l,o-9et OmpotQ cr1 on peut appeler )e !aLon rpte sa mtho)e calculer /u calcule l,mp<t )u contr-ua-le
= partr )e son statut martal :mar ou non;1 son nom-re ),en!ants et son salare annuel.
&.1.% La c"asse #9acc3s aux #$nn1es
7a classe OmpotsDataQ est la classe /u permet ),acc)er au% )onnes. *,est une classe a-strate. ?n )ot crer une classe )rve
pour cha/ue nouvelle source )e )onnes poss-le :ta-leau%1 !chers plats1 -ases )e )onnes1 console1 ...;. Sa )!nton est la
suvante +
Imports System.Collections
Namespace st.istia.univangers.fr
Public MustInherit Class impotsData
Protected limites() As Decimal
Protected coeffr() As Decimal
E%emples 1"$&1'"
Protected coeffn() As Decimal
Protected checked As Boolean
Protected valide As Boolean
' mthode d'accs aux donnes
Public MustOverride Function getData() As Object()
' mthode de vrification des donnes
Protected Function checkData() As Integer
' vrifie les donnes acquises
' on doit avoir des donnes
valide = Not limites Is Nothing AndAlso Not coeffr Is Nothing AndAlso Not coeffn Is Nothing
If Not valide Then Return 1
' on doit avoir 5 tableaux de mme taille
If valide Then valide = limites.Length = coeffr.Length AndAlso limites.Length = coeffn.Length
If Not valide Then Return 2
' les tableaux doivent tre non vides
valide = limites.Length <> 0
If Not valide Then Return 3
' chaque tableau doit contenir des lments -26 et en ordre croissant
valide = check(limites, limites.Length - 1) AndAlso check(coeffr, coeffr.Length) AndAlso
check(coeffn, coeffn.Length)
If Not valide Then Return 4
' tout est bon
Return 0
End Function
' vrifie la validit du contenu d'un tableau
Protected Function check(ByRef tableau() As Decimal, ByVal n As Integer) As Boolean
' tableau doit avoir ses n premiers lments -26 et en ordre strictement croissant
If tableau(0) < 0 Then Return False
For i As Integer = 1 To n - 1
If tableau(i) <= tableau(i - 1) Then Return False
Next
' c'est bon
Return True
End Function
End Class
End Namespace
7a classe a les attr-uts protgs suvants +
limites
ta-leau )es lmtes )e tranches ),mp<ts
coeffr
ta-leau )es coe!!cents appl/us au revenu mposa-le
coeffn
ta-leau )es coe!!cents appl/us au nom-re )e parts
checked
-oolen n)/uant s les )onnes :lmtes1 coe!!r1 coe!!n; ont t vr!es
valide
-oolen n)/uant s les )onnes :lmtes1 coe!!r1 coe!!n; sont val)es
7a classe n,a pas )e constructeur. Elle a une mtho)e a-strate OgetDataQ /ue les classes )rves )evront mplmenter. *ette
mtho)e a pour r<le +
),a!!ecter )es valeurs au% tros ta-leau% limites1 coe##r1 coe##n
)e lancer une e%cepton s les )onnes n,ont pu 4tre ac/uses ou s elles se sont avres nval)es.
7a classe !ournt les mtho)es protges Ochec[DataQ et Ochec[Q /u vr!ent la val)t )es attr-uts :lmtes1 coe!!r1 coe!!n;. *ela
)spense les classes )rves )e les mplmenter. Elles n,auront /u,= les utlser.
7a prem.re classe )rve /ue nous utlserons sera la suvante +
Imports System.Collections
Imports System
Namespace st.istia.univangers.fr
Public Class impotsArray
Inherits impotsData
' constructeur sans argument
Public Sub New()
' initialisations des tableaux avec des constantes
limites = New Decimal() {4262D, 8382D, 14753D, 23888D, 38868D, 47932D, 0D}
coeffr = New Decimal() {0D, 0.0683D, 0.1914D, 0.2826D, 0.3738D, 0.4262D, 0.4809D}
coeffn = New Decimal() {0D, 291.09D, 1322.92D, 2668.39D, 4846.98D, 6883.66D, 9505.54D}
checked = True
valide = True
End Sub
' constructeur avec trois tableaux en entre
E%emples 1"H&1'"
Public Sub New(ByRef limites() As Decimal, ByRef coeffr() As Decimal, ByRef coeffn() As Decimal)
' on mmorise les donnes
Me.limites = limites
Me.coeffr = coeffr
Me.coeffn = coeffn
checked = False
End Sub
Public Overrides Function getData() As Object()
' on vrifie ventuellement les donnes
Dim erreur As Integer
If Not checked Then erreur = checkData() : checked = True
' si pas valide7 alors on lance une exception
If Not valide Then Throw New Exception("Les donnes des tranches d'impts sont invalides (" +
erreur.ToString + ")")
' sinon on rend les trois tableaux
Return New Object() {limites, coeffr, coeffn}
End Function
End Class
End Namespace

*ette classe appele OmpotsArraDQ a )eu% constructeurs +
un constructeur sans argument /u ntalse les attr-uts :lmtes1coe!!r1coe!!n; )e la classe )e -ase avec )es ta-leau% co)s
en >)ur>
un constructeur /u ntalse les attr-uts :lmtes1coe!!r1coe!!n; )e la classe )e -ase avec )es ta-leau% /u lu sont passs en
param.tres
7a mtho)e OgetDataQ /u permettra au% classes e%ternes ),o-tenr les ta-leau% :lmtes1coe!!r1coe!!n; se contente )e vr!er la
val)t )es tros ta-leau% = l,a)e )e la mtho)e Ochec[DataQ )e la classe )e -ase. Elle lance une e%cepton s les )onnes sont
nval)es.
&.1.& Tests #es c"asses 21tier et #es c"asses #9acc3s aux #$nn1es
(l est mportant )e n,nclure )ans une applcaton 0e- /ue )es classes mter et ),acc.s au% )onnes cert!es correctes. Ans la
phase )e )-ogage )e l,applcaton 0e- pourra se concentrer sur la parte contr<leur et vues. Kn programme )e test pourat 4tre le
suvant +
' options
Option Strict On
Option Explicit On
' espaces de noms
Imports System
Imports Microsoft.VisualBasic
Namespace st.istia.univangers.fr
Module test
Sub Main()
' programme interactif de calcul d'impt
' l'utilisateur tape trois donnes au clavier : mari nbEnfants salaire
' le programme affiche alors l'impt payer
Const syntaxe As String = "syntaxe : mari nbEnfants salaire" + ControlChars.Lf + "mari : o pour
mari, n pour non mari" + ControlChars.Lf + "nbEnfants : nombre d'enfants" + ControlChars.Lf + "salaire
: salaire annuel en F"
' cration d'un objet impt
Dim objImpt As impot = Nothing
Try
objImpt = New impot(New impotsArray)
Catch ex As Exception
Console.Error.WriteLine(("L'erreur suivante s'est produite : " + ex.Message))
Environment.Exit(1)
End Try
' boucle infinie
Dim mari As String
Dim nbEnfants As Integer
Dim salaire As Long
While True
' on demande les paramtres du calcul de l'impt
Console.Out.Write("Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour
arrter :")
Dim paramtres As String = Console.In.ReadLine().Trim()
' qq chose faire ?
If paramtres Is Nothing OrElse paramtres = "" Then
Exit While
End If
' vrification du nombre d'arguments dans la ligne saisie
E%emples 1"I&1'"
Dim erreur As Boolean = False
Dim args As String() = paramtres.Split(Nothing)
Dim nbParamtres As Integer = args.Length
If nbParamtres <> 3 Then
Console.Error.WriteLine(syntaxe)
erreur = True
End If
' vrification de la validit des paramtres
If Not erreur Then
' mari
mari = args(0).ToLower()
If mari <> "o" And mari <> "n" Then
erreur = True
End If
' nbEnfants
Try
nbEnfants = Integer.Parse(args(1))
If nbEnfants < 0 Then
Throw New Exception
End If
Catch
erreur = True
End Try
' salaire
Try
salaire = Integer.Parse(args(2))
If salaire < 0 Then
Throw New Exception
End If
Catch
erreur = True
End Try
End If
' si les paramtres sont corrects - on calcule l'impt
If Not erreur Then
Console.Out.WriteLine(("impt=" & objImpt.calculer(mari = "o", nbEnfants, salaire) & "
euro(s)"))
Else
Console.Error.WriteLine(syntaxe)
End If
End While
End Sub
End Module
End Namespace
7,applcaton )eman)e = l,utlsateur )e taper au claver les tros n!ormatons )ont on a -eson pour calculer son mp<t +
son statut martal + o pour mar1 n pour non mar
son nom-re ),en!ants
son salare annuel
7e calcul )e l,mp<t est !at = l,a)e ),un o-9et )e tDpe OmpotQ cr ).s le lancement )e l,applcaton +
' cration d'un objet impt
Dim objImpt As impot = Nothing
Try
objImpt = New impot(New impotsArray)
Catch ex As Exception
Console.Error.WriteLine(("L'erreur suivante s'est produite : " + ex.Message))
Environment.Exit(1)
End Try
*omme source )e )onnes1 on utlse un o-9et )e tDpe OmpotsArraDQ. *,est le constructeur sans argument )e cette classe /u est
utls et /u !ournt les tros ta-leau% :lmtes1 coe!!r1 coe!!n; avec )es valeurs en >)ur>. 7a craton ),un o-9et OmpotQ peut en
thore crer une e%cepton pus/ue pour se crer1 l,o-9et va )eman)er les )onnes :lmtes1coe!!r1coe!!n; = sa source )e )onnes
/u,on lu a passe en param.tre1 et /ue cette ac/uston )e )onnes peut lancer une e%cepton. (l se trouve /u,c1 la mtho)e
),o-tenton )es )onnes :co)age en )ur; ne peut provo/uer ),e%cepton. Nous avons cepen)ant lass la geston )e celle-c a!n
),attrer l,attenton )u lecteur sur cette poss-lt /ue l,o-9et OmpotQ se construse mal.
Voc un e%emple ),e%cuton )u programme prc)ent +
dos>dir
05/04/2004 13:28 1 337 impots.vb
21/04/2004 08:23 1 311 impotsArray.vb
21/04/2004 08:26 1 634 impotsData.vb
21/04/2004 08:42 2 490 testimpots1.vb
E%emples 1"G&1'"
Nous complons l,ensem-le )es classes Ompot1 mpotsData1 mpotsArraDQ )ans un assem-age Ompot.)llQ +
dos>vbc /t:library /out:impot.dll impotsData.vb impotsArray.vb impots.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>dir
05/04/2004 13:28 1 337 impots.vb
21/04/2004 08:23 1 311 impotsArray.vb
21/04/2004 08:26 1 634 impotsData.vb
21/04/2004 08:42 2 490 testimpots1.vb
21/04/2004 09:21 5 632 impot.dll
Nous complons le programme )e test +
dos>vbc /r:impot.dll testimpots1.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>dir
05/04/2004 13:28 1 337 impots.vb
21/04/2004 08:23 1 311 impotsArray.vb
21/04/2004 08:26 1 634 impotsData.vb
21/04/2004 08:42 2 490 testimpots1.vb
21/04/2004 09:21 5 632 impot.dll
21/04/2004 09:23 4 608 testimpots1.exe
Nous pouvons !are les tests +
dos>testimpots1
Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour arrter :o 2 60000
impt=4300 euro(s)
Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour arrter :n 2 60000
impt=6872 euro(s)
Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour arrter :
&.1.( Les vues #e "9app"icati$n 8e-
7,applcaton aura )eu% vues + O!ormulare.asp%Q et Oerreurs.asp%Q. (llustrons le !onctonnement )e l,applcaton par )es copes
),cran. 7a vue O!ormulare.asp%Q est prsente lors/ue l,url Oman.asp%Q est )eman)e la prem.re !os +
7,utlsateur rensegne le !ormulare +
et utlse le -outon O*alculerQ pour o-tenr la rponse suvante +
E%emples 1"S&1'"
(l peut se tromper )ans les )onnes sases +
7,utlsaton )u -outon O*alculerQ am.ne alors une autre rponse Oerreurs.asp%Q +
(l peut utlser le len OBetour au !ormulareQ c-)essus pour retrouver la vue O!ormulare.asp%Q telle /u,l l,a val)e avant l,erreur +
&.1.* La vue ?:$r2u"aire.aspx@
7a page O!ormulare.asp%Q sera la suvante +
<%@ page src="formulaire.aspx.vb" inherits="formulaire" AutoEventWireup="false"%>
<html>
<head>
<title>Impt</title>
</head>
<body>
<P>Calcul de votre impt</P>
<HR>
<form method="post" action="main.aspx?action=calcul">
<TABLE border="0">
<TR>
<TD>Etes-vous mari(e)</TD>
<TD>
<INPUT type="radio" value="oui" name="rdMarie" <%=rdouichecked%>>Oui
<INPUT type="radio" value="non" name="rdMarie" <%=rdnonchecked%>>Non
</TD>
</TR>
<TR>
<TD>Nombre d'enfants</TD>
<TD><INPUT type="text" size="3" maxLength="3" name="txtEnfants" value="<%=txtEnfants%>"></TD>
</TR>
<TR>
<TD>Salaire annuel (euro)</TD>
<TD><INPUT type="text" maxLength="12" size="12" name="txtSalaire" value="<%=txtSalaire%>"></TD>
</TR>
E%emples 1"'&1'"
<TR>
<TD>Impt payer :
</TD>
<TD><%=txtImpot%></TD>
</TR>
</TABLE>
<hr>
<P>
<INPUT type="submit" value="Calculer">
</P>
</form>
<form method="post" action="main.aspx?action=effacer">
<INPUT type="submit" value="Effacer">
</form>
</body>
</html>
7es champs )Dnam/ues )e cette page sont les suvants +
rdouichecked
>chec[e)> s la case OouQ )ot 4tre coche1 >> snon
rdnonchecked
)em pour la case OnonQ
txtEnfants
valeur = placer )ans le champ )e sase Ot%tEn!antsQ
txtSalaire
valeur = placer )ans le champ )e sase Ot%tSalareQ
txtImpot
valeur = placer )ans le champ )e sase Ot%t(mpotQ
7a page a )eu% !ormulares1 chacun aDant un -outon Osu-mtQ. 7e -outon O*alculerQ est le -outon Osu-mtQ )u !ormulare suvant +
<form method="post" action="main.aspx?action=calcul">
...
<P>
<INPUT type="submit" value="Calculer">
</P>
</form>
?n vot /ue les param.tres )u !ormulare seront posts au contr<leur avec OactonTcalculQ. 7e -outon OE!!acerQ est le -outon
Osu-mtQ )u !ormulare suvant +
<form method="post" action="main.aspx?action=effacer">
<INPUT type="submit" value="Effacer">
</form>
?n vot /ue les param.tres )u !ormulare seront posts au contr<leur avec OactonTe!!acerQ. (c1 le !ormulare n,a aucun param.tre.
(l n,D a /ue l,acton /u mporte.
7es champs )e O!ormulare.asp%Q sont calculs par O!ormulare.asp%.v-Q +
Imports System.Collections.Specialized
Public Class formulaire
Inherits System.Web.UI.Page
' champs de la page
Protected rdouichecked As String
Protected rdnonchecked As String
Protected txtEnfants As String
Protected txtSalaire As String
Protected txtImpot As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre la prcdente requte dans le contexte
Dim form As NameValueCollection = Context.Items("formulaire")
' on prpare la page afficher
' boutons radio
rdouichecked = ""
rdnonchecked = "checked"
If form("rdMarie").ToString = "oui" Then
rdouichecked = "checked"
rdnonchecked = ""
End If
' le reste
txtEnfants = CType(form("txtEnfants"), String)
txtSalaire = CType(form("txtSalaire"), String)
txtImpot = CType(Context.Items("txtImpot"), String)
End Sub
End Class
E%emples 1F#&1'"
7e calcul )es champs )e Oman.asp%Q se !at = partr )e )eu% n!ormatons places par le contr<leur )ans le conte%te )e la page +
*onte%t.(tems:>!ormulare>; + )ctonnare )e tDpe ONameValue*ollectonQ contenant les valeurs )es champs 3T87
Or)mare1t%tEn!ants1t%tSalareQ
*onte%t.(tems:>t%t(mpot>; + valeur )e l,mp<t
&.1.A La vue ?erreurs.aspx@
7a vue Oerreurs.asp%Q est celle /u a!!che les erreurs ventuelles /u peuvent se pro)ure lors )e la ve )e l,applcaton. Son co)e )e
prsentaton est le suvant +
<%@ page src="erreurs.aspx.vb" inherits="erreurs" AutoEventWireup="false"%>
<HTML>
<HEAD>
<title>Impt</title>
</HEAD>
<body>
<P>Les erreurs suivantes se sont produites :</P>
<HR>
<ul>
<%=erreursHTML%>
</ul>
<a href="<%=href%>">
<%=lien%>
</a>
</body>
</HTML>
7a page a tros champs )Dnam/ues +
erreursHTML
co)e 3T87 ),une lste ),erreurs
href
url ),un len
lien
te%te )u len
*es champs sont calculs par la parte contr<leur )e la page )ans Oerreurs.asp%.v-Q +
Imports System.Collections
Imports Microsoft.VisualBasic
Public Class erreurs
Inherits System.Web.UI.Page
' paramtre de page
Protected erreursHTML As String = ""
Protected href As String
Protected lien As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre les lments du contexte
Dim erreurs As ArrayList = CType(context.Items("erreurs"), ArrayList)
href = context.Items("href").ToString
lien = context.Items("lien").ToString
' on gnre le code ()*+ de la liste
Dim i As Integer
For i = 0 To erreurs.Count - 1
erreursHTML += "<li> " + erreurs(i).ToString + "</li>" + ControlChars.CrLf
Next
End Sub
End Class
7e contr<leur )e la page rcup.re )es n!ormatons places par le contr<leur )e l,applcaton )ans le conte%te )e la page +
Context.Items("erreurs")
o-9et ArraD7st contenant la lste )es messages ),erreurs = a!!cher
Context.Items("href")
url ),un len
Context.Items("lien")
te%te )u len
8antenant /ue nous savons ce /ue vot l,utlsateur )e l,applcaton1 nous pouvons passer = l,crture )u contr<leur )e celle-c.
&.1.B Les c$ntr0"eurs ?g"$-a".asax/ 2ain.aspx@
Bappelons le schma 8V* )e notre applcaton +
E%emples 1F1&1'"
7e contr<leur Oman.asp%Q a = trater tros actons +
init + correspon) = la prem.re re/u4te )u clent. 7e contr<leur a!!che la vue O!ormulare.asp%Q
calcul + correspon) = la )eman)e )e calcul )e l,mp<t. S les )onnes )u !ormulare )e sase sont correctes1 l,mp<t est
calcul grYce = la classe mter OmpotsQ. 7e contr<leur retourne au clent la vue O!ormulare.asp%Q telle /u,elle avat t
val)e avec )e plus l,mp<t calcul. S les )onnes )u !ormulare )e sase sont ncorrectes1 le contr<leur retourne la vue
Oerreurs.asp%Q avec la lste )es erreurs et un len pour retourner au !ormulare.
retour + correspon) au retour au !ormulare apr.s une erreur. 7e contr<leur a!!che la vue O!ormulare.asp%Q telle /u,elle a
t val)e avant l,erreur.
?n sat par alleurs1 /ue toute re/u4te vers l,applcaton transte va le contr<leur Oglo-al.asa%Q s,l e%ste. Nous avons alors = l,entre
)e l,applcaton1 une chaVne )e )eu% contr<leurs +
Oglo-al.asa%Q /u )e par l,archtecture ASP.NET reLot toute re/u4te vers l,applcaton
Oman.asp%Q /u )e par la )cson )u )veloppeur reLot galement toute re/u4te vers l,applcaton
7a ncesst )e Oman.asp%Q vent )u !at /ue nous aurons une sesson = grer. Nous avons vu /ue Oglo-al.asa%Q ne convenat pas
comme contr<leur )ans ce cas. ?n pourrat c se passer totalement )e Oglo-al.asa%Q. Nous allons cepen)ant l,utlser pour e%cuter
)u co)e au )marrage )e l,applcaton. 7e schma 8V* c-)essus montre /ue nous allons avor -eson )e crer un o-9et OmpotQ
pour calculer l,mp<t. (l est nutle )e crer celu-c pluseurs !os1 une !os su!!t. Nous allons )onc le crer au )marrage )e
l,applcaton lors )e l,vnement OApplcatonbStartQ gr par le contr<leur Oglo-al.asa%Q. 7e co)e )e celu-c est le suvant +
Oglo-al.asa%Q
<%@ Application src="Global.asax.vb" Inherits="Global" %>
Oglo-al.asa%.v-Q
Imports System
Imports System.Web
Imports System.Web.SessionState
Imports st.istia.univangers.fr
Public Class Global
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' on cre un ob8et impot
Dim objImpot As impot
Try
objImpot = New impot(New impotsArray)
' on met l'ob8et dans l'application
Application("objImpot") = objImpot
' pas d'erreur
Application("erreur") = False
Catch ex As Exception
'il " a eu erreur7 on le note dans l'application
Application("erreur") = True
End Try
End Sub
End Class
E%emples 1F"&1'"
*lent 7og/ue applcatve
*lasse
mter
OmpotQ
Oman.asp%Q
(nter!ace
clent
Donnes
Sources )e
)onnes
C04T56L/35
%/3ELE
23/1
O!ormulare.asp%Q
Oerreurs.asp%Q
*lasse ),acc.s
au% )onnes
OmpotsDataQ
Kne !os cr1 l,o-9et )e tDpe OmpotQ est ms )ans l,applcaton. *,est l= /ue les )!!rentes re/u4tes )es )!!rents clents ront le
chercher. *omme la constructon )e l,o-9et OmpotQ peut chouer1 nous grons l,ventuelle e%cepton et plaLons une cl OerreurQ
)ans l,applcaton pour sgnaler s,l D a eu ou non une erreur lors )e la craton )e l,o-9et OmpotQ.
7e co)e )u contr<leur Oman.asp%1 man.asp%.v-Q sera le suvant +
Oman.asp%Q
<%@ page src="main.aspx.vb" inherits="main" AutoEventWireup="false"%>
Oman.asp%.v-Q
Imports System
Imports System.Collections.Specialized
Imports System.Collections
Imports st.istia.univangers.fr
Public Class main
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' avant tout7 on regarde si l'application a pu s'initialiser correctement
If CType(Application("erreur"), Boolean) Then
' on redirige vers la page d'erreurs
Dim erreurs As New ArrayList
erreurs.Add("Application momentanment indisponible...")
context.Items("erreurs") = erreurs
context.Items("lien") = ""
context.Items("href") = ""
Server.Transfer("erreurs.aspx")
End If
' on rcupre l'action faire
Dim action As String
If Request.QueryString("action") Is Nothing Then
action = "init"
Else
action = Request.QueryString("action").ToString.ToLower
End If
' on excute l'action
Select Case action
Case "init"
' init application
initAppli()
Case "calcul"
' calcul impot
calculImpot()
Case "retour"
' retour au formulaire
retourFormulaire()
Case "effacer"
' init application
initAppli()
Case Else
' action inconnue 2 init
initAppli()
End Select
End Sub
Private Sub initAppli()
' on affiche le formulaire pr#rempli
Context.Items("formulaire") = initForm()
Context.Items("txtImpot") = ""
Server.Transfer("formulaire.aspx", True)
End Sub
Private Function initForm() As NameValueCollection
' on initialise le formulaire
Dim form As New NameValueCollection
form.Set("rdMarie", "non")
form.Set("txtEnfants", "")
form.Set("txtSalaire", "")
Return form
End Function
Private Sub calculImpot()
' on vrifie la validit des donnes saisies
Dim erreurs As ArrayList = checkData()
' s'il " a des erreurs7 on le signale
If erreurs.Count <> 0 Then
E%emples 1FF&1'"
' on sauvegarde les saisies dans la session
Session.Item("formulaire") = Request.Form
' on prpare la page d'erreurs
context.Items("href") = "main.aspx?action=retour"
context.Items("lien") = "Retour au formulaire"
context.Items("erreurs") = erreurs
Server.Transfer("erreurs.aspx")
End If
' ici pas d'erreurs # on calcule l'imp9t
Dim impot As Long = CType(Application("objImpot"), impot).calculer( _
Request.Form("rdMarie") = "oui", _
CType(Request.Form("txtEnfants"), Integer), _
CType(Request.Form("txtSalaire"), Long))
' on affiche la page de rsultat
context.Items("txtImpot") = impot.ToString + " euro(s)"
context.Items("formulaire") = Request.Form
Server.Transfer("formulaire.aspx", True)
End Sub
Private Sub retourFormulaire()
' on affiche le formulaire avec des valeurs prises dans la session
Context.Items("formulaire") = Session.Item("formulaire")
Context.Items("txtImpot") = ""
Server.Transfer("formulaire.aspx", True)
End Sub
Private Function checkData() As ArrayList
' au dpart pas d'erreurs
Dim erreurs As New ArrayList
Dim erreur As Boolean = False
' bouton radio mari
Try
Dim rdMarie As String = Request.Form("rdMarie").ToString
If rdMarie <> "oui" And rdMarie <> "non" Then
Throw New Exception
End If
Catch
erreurs.Add("Vous n'avez pas indiqu votre statut marital")
End Try
' nbre d'enfants
Try
Dim txtEnfants As String = Request.Form("txtEnfants").ToString
Dim nbEnfants As Integer = CType(txtEnfants, Integer)
If nbEnfants < 0 Then Throw New Exception
Catch
erreurs.Add("Le nombre d'enfants est incorrect")
End Try
' salaire
Try
Dim txtSalaire As String = Request.Form("txtSalaire").ToString
Dim salaire As Integer = CType(txtSalaire, Long)
If salaire < 0 Then Throw New Exception
Catch
erreurs.Add("Le salaire annuel est incorrect")
End Try
' on rend la liste des erreurs
Return erreurs
End Function
End Class
7e contr<leur commence par vr!er /ue l,applcaton s,est correctement ntalse +
' avant tout7 on regarde si l'application a pu s'initialiser correctement
If CType(Application("erreur"), Boolean) Then
' on redirige vers la page d'erreurs
Dim erreurs As New ArrayList
erreurs.Add("Application momentanment indisponible...")
context.Items("erreurs") = erreurs
context.Items("lien") = ""
context.Items("href") = ""
Server.Transfer("erreurs.aspx")
End If
S le contr<leur )couvre /ue l,applcaton n,a pas pu s,ntalser correctement :l,o-9et OmpotQ ncessare au calcul n,a pu 4tre cr;1
alors l !at a!!cher la page ),erreurs avec les param.tres a)/uats. (c1 l n,D a pas leu )e placer le len )e retour sur le !ormulare
pus/ue la totalt )e l,applcaton s,av.re n)spon-le. Kn message ),erreur gnral est plac )ans O*onte%t.(tems:>erreurs>;Q )e
tDpe OArraD7stQ.
E%emples 1F$&1'"
S le contr<leur )couvre /ue l,applcaton est opratonnelle1 l analDse alors l,acton /u,on lu )eman)e ),e%cuter va le param.tre
OactonQ. Nous avons )9= rencontr souvent ce mo)e )e !onctonnement. 7e tratement )e cha/ue tDpe ),acton est )lgu = une
!oncton.
5.1.*.1 Les actions init: effacer
*es )eu% actons )ovent !are a!!cher le !ormulare )e sase v)e. ?n rappelle /ue celu-c :c! vues; a )eu% param.tres +
*onte%t.(tems:>!ormulare>; + )ctonnare )e tDpe ONameValue*ollectonQ contenant les valeurs )es champs 3T87
Or)mare1t%tEn!ants1t%tSalareQ
*onte%t.(tems:>t%t(mpot>; + valeur )e l,mp<t
7a !oncton OntApplQ ntalse ces )eu% param.tres )e !aLon = a!!cher un !ormulare v)e.
5.1.*.2 L'action calcul
*ette acton )ot calculer l,mp<t = paDer = partr )es )onnes sases )ans le !ormulare et renvoDer celu-c pr-rempl avec les
valeurs sases et avec )e plus le montant )e l,mp<t calcul. 7a !oncton Ocalcul(mpotQ charge )e ce traval commence par vr!er
/ue les )onnes )u !ormulare sont -en correctes +
le champ Or)8areQ )ot 4tre prsent et avor la valeur OouQ ou OnonQ
le champ Ot%tEn!antsQ )ot 4tre prsent et 4tre un enter NT#
le champ Ot%tSalareQ )ot 4tre prsent et 4tre un enter NT#
S les )onnes sases se rv.lent nval)es1 le contr<leur !at a!!cher la vue Oerreurs.asp%Q en aDant auparavant ms )ans le conte%te
les valeurs atten)ues par celle-c +
les messages ),erreurs sont placs )ans un o-9et OArraD7stQ1 o-9et plac ensute )ans le conte%te O*onte%t.(tems:>erreurs>;Q
l,url )u len )e retour et le te%te )e ce len sont galement placs )ans le conte%te.
Avant )e passer la man = la page Oerreurs.asp%Q /u va envoDer la rponse au clent1 les valeurs sases )ans le !ormulare
:Be/uest.]orm; sont places )ans la sesson1 assoces = la cl >!ormulare>. *ec permettra = une re/u4te ultreure )e les rcuprer.
?n peut se )eman)er c s,l est utle )e vr!er /ue les champs Or)8are1 t%tEn!ants1 t%tSalareQ sont prsents )ans la re/u4te
envoDe par le clent. *,est nutle s on est s\r /ue notre clent est un navgateur aDant reLu la vue O!ormulare.asp%Q /u content ces
champs. ?n ne peut 9amas 4tre s\r )e cela. Nous montrerons un peu plus tar) un e%emple o6 le clent est l,applcaton OcurlQ )9=
rencontre. Nous nterrogerons l,applcaton sans envoDer les champs /u,elle atten) et nous verrons comment elle ragra. *,est une
r.gle )9= nonce = pluseurs reprses et /ue nous rappelons c + une applcaton ne )ot 9amas !are ),hDpoth.ses sur le tDpe )e
clent /u l,nterroge. Par scurt1 elle )ot cons)rer /u,elle peut 4tre nterroge par une applcaton programme /u peut lu
envoDer )es chaVnes )e param.tres natten)ues. Elle )ot correctement se comporter )ans tous les cas.
Dans notre cas1 nous avons vr! /ue les champs Or)8are1 t%tEn!ants1 t%tSalareQ taent prsents )ans la re/u4te mas pas /ue
celle-c pouvat en contenr ),autres. Dans cette applcaton1 ls seraent gnors. Nanmons1 tou9ours par mesure )e scurt1 l
serat ntressant ),enregstrer ce tDpe )e )eman)e )ans un !cher )e logs et )e remonter une alerte = l,a)mnstrateur )e
l,applcaton a!n /ue celu-c sache /ue l,applcaton reLot )es )eman)es >-5arres>. En analDsant celles-c )ans le !cher )e logs1 l
pourrat )tecter une ventuelle atta/ue )e l,applcaton et pren)re alors les mesures ncessares = la protecton )e celle-c.
S les )onnes atten)ues sont correctes1 le contr<leur lance le calcul )e l,mp<t avec l,o-9et OmpotQ stoc[ )ans l,applcaton. Pus l
stoc[e )ans le conte%te les )eu% n!ormatons atten)ues par la vue O!ormulare.asp%Q +
*onte%t.(tems:>!ormulare>; + )ctonnare )e tDpe ONameValue*ollectonQ contenant les valeurs )es champs 3T87
Or)mare1t%tEn!ants1t%tSalareQ1 c OBe/uest.]orm;Q1 c.a.). les valeurs sases prc)emment )ans le !ormulare
*onte%t.(tems:>t%t(mpot>; + valeur )e l,mp<t /u vent ),4tre o-tenue
7e lecteur attent! s,est peut 4tre pos une /ueston = la lecture )e ce /u prc.)e + pus/ue l,o-9et OmpotQ cr au )marrage )e
l,applcaton est partag entre toutes les re/u4tes1 ne peut-l D avor )e con!lts ),acc.s entraVnant une corrupton )es )onnes )e
l,o-9et OmpotQ. Pour rpon)re = cette /ueston1 l nous !aut revenr au co)e )e la classe OmpotQ. 7es re/u4tes !ont appel = la
mtho)e OmpotQ.calculer(mpot pour o-tenr l,mp<t = paDer. *,est )onc ce co)e /u,l nous !aut e%amner +
Public Function calculer(ByVal mari As Boolean, ByVal nbEnfants As Integer, ByVal salaire As Long)
As Long
' calcul du nombre de parts
Dim nbParts As Decimal
If mari Then
nbParts = CDec(nbEnfants) / 2 + 2
Else
nbParts = CDec(nbEnfants) / 2 + 1
E%emples 1FH&1'"
End If
If nbEnfants >= 3 Then
nbParts += 0.5D
End If
' calcul revenu imposable : $uotient familial
Dim revenu As Decimal = 0.72D * salaire
Dim QF As Decimal = revenu / nbParts
' calcul de l'imp9t
limites((limites.Length - 1)) = QF + 1
Dim i As Integer = 0
While QF > limites(i)
i += 1
End While
Dim impot As Long = CLng(revenu * coeffR(i) - nbParts * coeffN(i))
Return impot
End Function
Supposons /u,un threa) sot en tran ),e%cuter la mtho)e prc)ente et /u,l sot nterrompu. Kn autre threa) e%cute alors la
mtho)e. Euels sont les rs/ues W Pour le savor1 nous avons ra9out le co)e suvant +
Dim impot As Long = CLng(revenu * coeffR(i) - nbParts * coeffN(i))
' on patiente ;6 secondes
Thread.Sleep(10000)
Return impot
7e threa) 11 apr.s avor calcul la valeur Ompot1Q )e la vara-le locale OmpotQ est nterrompu. 7e threa) " s,e%cute alors et calcule
une nouvelle valeur Ompot"Q pour cette m4me vara-le OmpotQ avant ),4tre nterrompu. 7e threa) 1 rcup.re la man. Eue
retrouve-t-l )ans la vara-le locale OmpotQ W *ette vara-le tant locale = une mtho)e est stoc[e )ans une structure )e la mmore
appele pile. *ette ple !at parte )u conte%te )u threa) /u est sauvegar) lors/ue celu-c est nterrompu. 7ors/ue le threa) "
s,nstalle1 son conte%te est ms en place avec une nouvelle ple et )onc une nouvelle vara-le locale OmpotQ. 7ors/ue le threa) " va
4tre nterrompu = son tour1 son conte%te sera = son tour sauvegar). 7ors/ue le threa) 1 est relanc1 son conte%te est restaur )ont
sa ple. (l retrouve alors sa vara-le locale OmpotQ et non celle )u threa) ". ?n est )onc )ans une stuaton o6 l n,D a pas )e con!lts
),acc.s entre re/u4tes. 7es tests !ats avec la pause )e 1# secon)es c-)essus ont con!rm /ue les re/u4tes smultanes o-tenaent
-en le rsultat atten)u.
5.1.*.3 L'action retour
*ette acton correspon) = l,actvaton )u len OBetour vers le !ormulareQ )e la vue Oerreurs.asp%Q pour revenr = la vue
O!ormulare.asp%Q pr-rempl avec les valeurs sases prc)emment et sauvegar)es )ans la sesson. 7a !oncton Oretour]ormulareQ
rcup.re cette n!ormaton. 7es )eu% param.tres atten)us par la vue O!ormulare.asp%Q sont ntalss +
*onte%t.(tems:>!ormulare>; avec les valeurs sases prc)emment et sauvegar)es )ans la sesson
*onte%t.(tems:>t%t(mpot>; avec la chaVne v)e
&.1.1CTest #e "9app"icati$n 8e-
7,ensem-le )es !chers prc)ents sont placs )ans un )osser Mapplcaton-pathN.

Dans ce )osser1 est cr un sous-)osser O-nQ )ans le/uel est plac l,assem-lage Ompot.)llQ ssu )e la complaton )es !chers )es
classes mter + Ompots.v-1 mpotsData.v-1 mpotsArraD.v-Q. ?n rappelle c-)essous1 la comman)e )e complaton ncessare +
dos>vbc /t:library /out:impot.dll impotsData.vb impotsArray.vb impots.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
dos>dir
05/04/2004 13:28 1 337 impots.vb
21/04/2004 08:23 1 311 impotsArray.vb
21/04/2004 08:26 1 634 impotsData.vb
21/04/2004 09:21 5 632 impot.dll
E%emples 1FI&1'"
7e !cher Ompot.)llQ c-)essus )ot 4tre plac )ans Mapplcaton-pathNP-n a!n /ue l,applcaton 0e- D at acc.s. 7e serveur *assn
est lanc avec les param.tres :Mapplcaton-pathN1&mpots1;. Avec un navgateur1 nous )eman)ons l,url
Ohttp+&&localhost&mpots1&man.asp%Q +
Nous remplssons le !ormulare +
Pus nous lanLons le calcul )e l,mp<t avec le -outon O*alculerQ. Nous o-tenons la rponse suvante +
Pus nous !asons )es sases errones +
E%emples 1FG&1'"
7,appu sur le -outon O*alculerQ am.ne la rponse suvante +
7,utlsaton )u len OBetour au !ormulareQ nous ram.ne au !ormulare )ans l,tat o6 l tat lors/u,l a t val) +
En!n1 l,utlsaton )u -outon OE!!acerQ rntalse la page +
&.1.11Uti"isati$n #u c"ient ?cur"@
(l est mportant )e tester les applcatons 0e- avec ),autres clents /ue les navgateurs. S on envoe = un navgateur un !ormulare
avec )es param.tres = poster lors/u,l sera val)1 le navgateur renverra les valeurs )e ces param.tres au serveur au moment )u
P?ST. Kn autre clent pourrat ne pas le !are et alors le serveur aurat une re/u4te o6 l man/uerat )es param.tres. (l )ot savor
/uo !are )ans ce cas. Kn autre e%emple est celu )es vr!catons )e sase !ates c<t clent. S le !ormulare content )es )onnes =
vr!er1 cette vr!caton peut 4tre !ate c<t clent grYce = )es scrpts nclus )ans le )ocument contenant le !ormulare. 7e
navgateur ne postera le !ormulare /ue s toutes les )onnes vr!es c<t clent sont val)es. ?n pourrat alors 4tre tent1 c<t
serveur1 )e cons)rer /u,on va recevor )es )onnes vr!es et ne pas voulor !are cette vr!caton une secon)e !os. *e serat
une erreur. En e!!et1 un clent autre /u,un navgateur pourrat envoDer au serveur )es )onnes nval)es et alors l,applcaton 0e-
rs/ue ),avor un comportement natten)u. Nous allons llustrer ces ponts en utlsant le clent OcurlQ.
Tout ),a-or)1 nous )eman)ons l,url Ohttp+&&localhost&mpots1&man.asp%Q +
dos>curl --include --url http://localhost/impots1/main.aspx
E%emples 1FS&1'"
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 15:18:10 GMT
Set-Cookie: ASP.NET_SessionId=ivthkl45tjdjrzznevqsf255; path=/
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 982
Connection: Close
<html>
<head>
<title>Impt</title>
</head>
<body>
<P>Calcul de votre impt</P>
<HR width="100%" SIZE="1">
<form method="post" action="main.aspx?action=calcul">
<TABLE border="0">
<TR>
<TD>Etes-vous mari(e)</TD>
<TD>
<INPUT type="radio" value="oui" name="rdMarie" >Oui <INPUT type="radio" value="non"
name="rdMarie" checked>Non</TD>
</TR>
<TR>
<TD>Nombre d'enfants</TD>
<TD><INPUT type="text" size="3" maxLength="3" name="txtEnfants" value=""></TD>
</TR>
<TR>
<TD>Salaire annuel (euro)</TD>
<TD><INPUT type="text" maxLength="12" size="12" name="txtSalaire" value=""></TD>
</TR>
<TR>
<TD>Impt payer :
</TD>
<TD></TD>
</TR>
</TABLE>
<hr>
<P>
<INPUT type="submit" value="Calculer">
</P>
</form>
<form method="post" action="main.aspx?action=effacer">
<INPUT type="submit" value="Effacer">
</form>
</body>
</html>
7e serveur nous a envoD le co)e 3T87 )u !ormulare. Dans les ent4tes 3TTP nous avons le coo[e )e sesson. Nous allons
l,utlser )ans les re/u4tes suvantes a!n )e mantenr la sesson. Deman)ons l,acton OcalculQ sans !ournr )e param.tres +
dos>curl --cookie ASP.NET_SessionId=ivthkl45tjdjrzznevqsf255 --include --url
http://localhost/impots1/main.aspx?action=calcul
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 15:22:42 GMT
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 380
Connection: Close
<HTML>
<HEAD>
<title>Impt</title>
</HEAD>
<body>
<P>Les erreurs suivantes se sont produites :</P>
<HR>
<ul>
<li> Vous n'avez pas indiqu votre statut marital</li>
<li> Le nombre d'enfants est incorrect</li>
<li> Le salaire annuel est incorrect</li>
</ul>
<a href="main.aspx?action=retour">
E%emples 1F'&1'"
Retour au formulaire
</a>
</body>
</HTML>
Nous pouvons constater /ue l,applcaton 0e- a renvoD la vue OerreursQ avec tros messages ),erreurs pour les tros param.tres
man/uants. EnvoDons mantenant )es param.tres errons +
dos>curl --cookie ASP.NET_SessionId=ivthkl45tjdjrzznevqsf255 --include --data rdMarie=xx --data
txtEnfants=xx --data txtSalaire=xx --url http://localhost/impots1/main.aspx?action=calcul
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 15:25:50 GMT
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 380
Connection: Close
<HTML>
<HEAD>
<title>Impt</title>
</HEAD>
<body>
<P>Les erreurs suivantes se sont produites :</P>
<HR>
<ul>
<li> Vous n'avez pas indiqu votre statut marital</li>
<li> Le nombre d'enfants est incorrect</li>
<li> Le salaire annuel est incorrect</li>
</ul>
<a href="main.aspx?action=retour">
Retour au formulaire
</a>
</body>
</HTML>
7es tros erreurs ont t correctement )tectes. 8antenant envoDons )es param.tres val)es +
dos>curl --cookie ASP.NET_SessionId=ivthkl45tjdjrzznevqsf255 --include --data rdMarie=oui --data
txtEnfants=2 --data txtSalaire=60000 --url http://localhost/impots1/main.aspx?action=calcul
HTTP/1.1 200 OK
Server: Microsoft ASP.NET Web Matrix Server/0.6.0.0
Date: Thu, 01 Apr 2004 15:28:24 GMT
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 1000
Connection: Close
<html>
<head>
<title>Impt</title>
</head>
<body>
<P>Calcul de votre impt</P>
<HR width="100%" SIZE="1">
<form method="post" action="main.aspx?action=calcul">
<TABLE border="0">
<TR>
<TD>Etes-vous mari(e)</TD>
<TD>
<INPUT type="radio" value="oui" name="rdMarie" checked>Oui <INPUT type="radio" value="non"
name="rdMarie" >Non</TD>
</TR>
<TR>
<TD>Nombre d'enfants</TD>
<TD><INPUT type="text" size="3" maxLength="3" name="txtEnfants" value="2"></TD>
</TR>
<TR>
<TD>Salaire annuel (euro)</TD>
<TD><INPUT type="text" maxLength="12" size="12" name="txtSalaire" value="60000"></TD>
</TR>
<TR>
<TD>Impt payer :
</TD>
E%emples 1$#&1'"
<TD>4300 euro(s)</TD>
</TR>
</TABLE>
<hr>
<P>
<INPUT type="submit" value="Calculer">
</P>
</form>
<form method="post" action="main.aspx?action=effacer">
<INPUT type="submit" value="Effacer">
</form>
</body>
</html>
Nous avons -en rcupr l,mp<t = paDer + $F## euros. Nous reten)rons )e cette llustraton /u,l ne !aut pas se lasser llusonner
par le !at /u,on crt une applcaton 0e- = )estnaton )e clents /u sont )es navgateurs. Kne applcaton 0e- est un servce tcp-
p et ce protocole rseau ne permet pas )e )re la nature )e l,applcaton clente ),un servce. Donc1 on ne peut pas savor s le clent
),une applcaton 0e- est un navgateur ou non. ?n sut alors )eu% r.gles +
= rcepton ),une re/u4te ),un clent1 on ne !at aucune hDpoth.se sur le clent et on vr!e /ue les param.tres atten)us
)ans la re/u4te sont -en prsents et val)es
on la-ore une rponse = )estnaton )es navgateurs1 )onc en gnral )es )ocuments 3T87
Kne applcaton 0e- peut 4tre construte pour servr smultanment )es clents )!!rents1 par e%emple )es navgateurs et )es
tlphones mo-les. ?n peut alors nclure )ans cha/ue re/u4te un nouveau param.tre n)/uant le tDpe )u clent. Ans un
navgateur )eman)era le calcul )e l,mp<t par une re/u4te = l,url
http+&&machne&mpots&man.asp%WclentTnavgateur`actonTcalcul alors /ue le tlphone mo-le lu !era une re/u4te = l,url
http+&&machne&mpots&man.asp%WclentTmo-le`actonTcalcul. 7a structure 8V* !aclte l,crture ),une telle applcaton. Elle
)event la suvante +
7e -loc O*lasses mter1 *lasses ),acc.s au% )onnesQ ne change pas. *,est en e!!et une parte n)!!rente au clent. 7e -loc
O*ontr<leurQ change peu mas )ot pren)re un compte un nouveau param.tre )ans la re/u4te1 le param.tre OclentQ n)/uant = /uel
tDpe )e clent l a a!!are. 7e -loc OvuesQ )ot gnrer )es vues pour cha/ue tDpe )e clent. (l pourrat 4tre ntressant )e pren)re en
compte ).s la concepton )e l,applcaton la prsence )u param.tre OclentQ )ans la re/u4te1 m4me s on n,a comme o-9ect! = court
ou moDen terme /ue les seuls navgateurs. S l,applcaton )ot ultreurement grer un nouveau tDpe )e clent1 seules )es vues
a)aptes = celu-c sont = crre.
-.$ Exemple $
&.2.1 Le pr$-"32e
Nous nous proposons c )e trater le m4me pro-l.me /ue prc)emment mas en mo)!ant la source )es )onnes )e l,o-9et
OmpotQ cr par l,applcaton 0e-. Dans la verson prc)ente1 celle utlse )lvrat les valeurs )e ta-leau% crts en >)ur> )ans le
co)e. *ette !os-c1 la nouvelle source )e )onnes les pren)ra )ans une source )e )onnes ?DB* assoce = une -ase 8DSE7.
&.2.2 La s$urce #e #$nn1es 4DE+
7es )onnes se trouveront )ans une ta-le appele O(8P?TSQ ),une -ase 8DSE7 appele O)-mpotsQ. 7e contenu )e cette ta-le sera
le suvant +
E%emples 1$1&1'"
*lasse
mter
OmpotQ
Oman.asp%Q
*lent 7og/ue applcatve
*lasse ),acc.s
au% )onnes
OmpotsDataQ
(nter!ace
clent
Donnes
Sources )e
)onnes
C04T56L/35
%/3ELE
O!ormulare.nav.asp%Q Oerreurs.nav.asp%Q
23/1
O!ormulare.mo-.asp%Q Oerreurs.mo-.asp%Q
7e proptare )e la -ase est l,utlsateur Oa)mmpotsQ )e mot )e passe Om)pmpotsQ. Nous assocons une source )e )onnes ?DB*
= cette -ase. Avant )e le !are1 rappelons ),a-or) les )!!rents moDens ),acc)er = une -ase )e )onnes avec la plate-!orme .NET.
(l e%ste )e nom-reuses -ases )e )onnes pour les plate-!ormes 0n)o0s. Pour D acc)er1 les applcatons passent au travers )e
programmes appels pilotes :)rvers;.
Dans le schma c-)essus1 le plote prsente )eu% nter!aces +
l,nter!ace (1 prsente = l,applcaton
l,nter!ace (" vers la -ase )e )onnes
A!n ),vter /u,une applcaton crte pour une -ase )e )onnes B1 )ove 4tre rcrte s on mgre vers une -ase )e )onnes B"
)!!rente1 un e!!ort )e normalsaton a t !at sur l,nter!ace (1. S on utlse )es -ases )e )onnes utlsant )es plotes >normalss>1
la -ase B1 sera !ourne avec un plote P11 la -ase B" avec un plote P"1 et l,nter!ace (1 )e ces )eu% plotes sera )ent/ue. Auss
n,aura-t-on pas = rcrre l,applcaton. ?n pourra ans1 par e%emple1 mgrer une -ase )e )onnes A**ESS vers une -ase )e
)onnes 8DSE7 sans changer l,applcaton.
(l e%ste )eu% tDpes )e plotes normalss +
les plotes ?DB* :?pen DataBase *onnectvtD;
les plotes ?7E DB :?-9ect 7n[ng an) Em-e))ng DataBase;
7es plotes ?DB* permettent l,acc.s = )es -ases )e )onnes. 7es sources )e )onnes pour les plotes ?7E DB sont plus vares +
-ases )e )onnes1 messageres1 annuares1 ... (l n,D a pas )e lmte. Toute source )e )onnes peut !are l,o-9et ),un plote ?le DB s
un )teur le )c)e. 7,ntr4t est v)emment gran) + on a un acc.s un!orme = une gran)e vart )e )onnes.
7a plate-!orme .NET 1.1 est lvre avec tros tDpes )e classes ),acc.s au% )onnes +
1. les classes SE7 Server.NET1 pour acc)er au% -ases SE7 Server )e 8croso!t
". les classes ?le D-.NET1 pour acc)er au% -ases )es SABD o!!rant un plote ?7E DB
F. les classes o)-c.net1 pour acc)er au% -ases )es SABD o!!rant un plote ?DB*
7e SABD 8DSE7 )spose )epus longtemps ),un plote ?DB*. *,est celu-c /ue nous utlsons mantenant. Sous Wn)o0s1 nous
prenons l,opton O8enu Dmarrer&Panneau )e con!guraton&?utls ),a)mnstraton&Sources ?DB* F" -tsQ. Selon la verson )e
0n)o0s1 ce chemn peut lg.rement varer. ?n o-tent l,applcaton suvante /u va nous permettre )e crer notre source ?DB* +
E%emples 1$"&1'"
Plote )e -ase )e )onnes
Base )e
)onnes
Applcaton
(" (1
Nous allons crer une source )e )onnes SDst.me1 c.a.). une source )e )onnes /ue tout utlsateur )e la machne pourra
utlser.Auss1 c-)essus slectonnons-nous l,onglet OSource )e )onnes sDst.meQ. 7a page prsente a un -outon OA9outerQ /ue nous
utlsons pour crer une nouvelle source )e )onnes ?DB* +
7,assstant )eman)e )e slectonner le plote ?DB* = utlser. Wn)o0s am.ne avec lu un certan nom-re )e plotes ?DB* pr-
nstalls. 7e plote ?DB* )e 8DSE7 ne !at pas parte )u lot. (l !aut )onc auparavant l,nstaller. ?n le trouvera sur nternet en
tapant la chaVne cl >8DSE7 ?DB*> ou encore >8D?DB*> )ans un moteur )e recherche. (c1 nous avons nstall le plote
O8DSE7 ?DB* F.H1Q. Nous le slectonnons et !asons OTermnerQ +
Kn certan nom-re )e rensegnements )ot 4tre !ourn +
Data Source Name
le nom /u )sgnera la source )e )onnes ?DB*. Toute applcaton 0n)o0s pourra avor acc.s = la source
va ce nom
Description
un te%te ar-trare )crvant la source )e )onnes
Host Name
le nom )e la machne h-ergeant le SABD 8DSE7. (c c,est la machne locale. *e pourrat 4tre une machne
)stante. *ela permettrat = une applcaton 0n)o0s ),acc)er = une -ase )stante sans aucun co)age
partculer. *,est un gran) ntr4t )e la source ?DB*.
Database Name
un SABD 8DSE7 peut grer pluseurs -ases. (c on prcse la/uelle on veut grer + )-mpots
User
nom ),un utlsateur )clar au sen )u SABD 8DSE7. *,est sous son nom /ue se !eront les acc.s = la
E%emples 1$F&1'"
source )e )onnes. (c + a)mmpots
Password
le mot )e passe )e cet utlsateur. (c + m)pmpots
Port
port )e traval )u SABD 8DSE7. Par )!aut c,est le port FF#I. Nous ne l,avons pas chang
*ec !at1 nous testons la val)t )e nos param.tres )e conne%on avec le -outon OTest Data SourceQ +
*ec !at1 nous sommes s\rs )e notre source )e )onnes ?DB*. Nous pouvons )sormas l,e%ploter. Nous !asons autant )e !os
/ue ncessare O?XQ pour sortr )e l,assstant ?DB*.
S le lecteur ne )spose pas )u SABD mDSE71 l peut se le procurer l-rement = l,url Ohttp+&&000.mDs/l.comQ. Nous prsentons c-
)essous la )marche pour crer une source ?DB* avec Access. 7es prem.res tapes sont )ent/ues = ce /u a t )crt
prc)emment. ?n a9oute une nouvelle source )e )onnes sDst.me +
7e plote slectonn sera O8croso!t Access DrverQ. ?n !at OTermnerQ pour passer = la )!nton )e la source ?DB* +
7es rensegnements = !ournr sont les suvants +
Nom de la source
de donnes
le nom /u )sgnera la source )e )onnes ?DB*. Toute applcaton 0n)o0s pourra avor acc.s = la source
va ce nom
Description
un te%te ar-trare )crvant la source )e )onnes
Base de donnes
le nom complet )u !cher A**ESS = e%ploter
&.2.3 Une n$uve""e c"asse #9acc3s aux #$nn1es
Bevenons la structure 8V* )e notre applcaton +
E%emples 1$$&1'"
Sur le schma c-)essus1 la classe OmpotsDataQ est charge )e rcuprer les )onnes. Elle )evra le !are c aupr.s )e la -ase 8DSE7
O)-mpotsQ. Nous savons )epus la verson prc)ente )e cette applcaton1 /ue OmpotsDataQ est une classe a-strate /u,l !aut
)rver = cha/ue !os /u,on veut l,a)apter = une nouvelle source )e )onnes. Bappelons la structure )e cette classe a-strate +
Imports System.Collections
Namespace st.istia.univangers.fr
Public MustInherit Class impotsData
Protected limites() As Decimal
Protected coeffr() As Decimal
Protected coeffn() As Decimal
Protected checked As Boolean
Protected valide As Boolean
' mthode d'accs aux donnes
Public MustOverride Function getData() As Object()
' mthode de vrification des donnes
Protected Function checkData() As Integer
' vrifie les donnes acquises
...
End Function
' vrifie la validit du contenu d'un tableau
Protected Function check(ByRef tableau() As Decimal, ByVal n As Integer) As Boolean
...
End Function
End Class
End Namespace
7a classe /u )rve OmpotsDataQ )ot mplmenter )eu% mtho)es +
un constructeur s le constructeur sans arguments )e OmpotsDataQ ne lu convent pas
la mtho)e OgetDataQ /u ren) les tros ta-leau% :lmtes1coe!!r1coe!!n;
Nous crons la classe Ompots?DB*Q /u va aller chercher les )onnes :lmtes1coe!!r1coe!!n; )ans une source ?DB* )ont on lu
)onnera le nom +
Imports System.Data.Odbc
Imports System.Data
Imports System.Collections
Imports System
Namespace st.istia.univangers.fr
Public Class impotsODBC
Inherits impotsData
' variables d'instance
Protected DSNimpots As String
' constructeur
Public Sub New(ByVal DSNimpots As String)
' on note le nom de la source <=>?
Me.DSNimpots = DSNimpots
End Sub
E%emples 1$H&1'"
*lent 7og/ue applcatve
*lasse
mter
OmpotQ
Oman.asp%Q
(nter!ace
clent
Donnes
Sources )e
)onnes
C04T56L/35
%/3ELE
23/1
O!ormulare.asp%Q
Oerreurs.asp%Q
*lasse ),acc.s
au% )onnes
OmpotsDataQ
Public Overrides Function getdata() As Object()
' initialise les trois tableaux limites7 coeffr7 coeffn partir
' du contenu de la table &impots' de la base <=>? =@impots
' limites7 coeffr7 coeffn sont les trois colonnes de cette table
' peut lancer diverses exceptions
Dim connectString As String = "DSN=" + DSNimpots + ";" ' chaAne de connexion la base
Dim impotsConn As OdbcConnection = Nothing ' la connexion
Dim sqlCommand As OdbcCommand = Nothing ' la commande $+
' la requte B+B?)
Dim selectCommand As String = "select limites,coeffr,coeffn from impots"
' tableaux pour rcuprer les donnes
Dim aLimites As New ArrayList
Dim aCoeffR As New ArrayList
Dim aCoeffN As New ArrayList
Try
' on tente d'accder la base de donnes
impotsConn = New OdbcConnection(connectString)
impotsConn.Open()
' on cre un ob8et command
sqlCommand = New OdbcCommand(selectCommand, impotsConn)
' on excute la requte
Dim myReader As OdbcDataReader = sqlCommand.ExecuteReader()
' Bxploitation de la table rcupre
While myReader.Read()
' les donnes de la ligne courante sont mis dans les tableaux
aLimites.Add(myReader("limites"))
aCoeffR.Add(myReader("coeffr"))
aCoeffN.Add(myReader("coeffn"))
End While
' libration des ressources
myReader.Close()
Catch e As Exception
Throw New Exception("Erreur d'accs la base de donnes (" + e.Message + ")")
Finally
impotsConn.Close()
End Try
' les tableaux d"namiques sont mis dans des tableaux statiques
Me.limites = New Decimal(aLimites.Count - 1) {}
Me.coeffr = New Decimal(aLimites.Count - 1) {}
Me.coeffn = New Decimal(aLimites.Count - 1) {}
Dim i As Integer
For i = 0 To aLimites.Count - 1
limites(i) = Decimal.Parse(aLimites(i).ToString())
coeffR(i) = Decimal.Parse(aCoeffR(i).ToString())
coeffN(i) = Decimal.Parse(aCoeffN(i).ToString())
Next i
' on vrifie les donnes acquises
Dim erreur As Integer = checkData()
' si donnes pas valides7 alors on lance une exception
If Not valide Then Throw New Exception("Les donnes des tranches d'impts sont invalides (" +
erreur.ToString + ")")
' sinon on rend les trois tableaux
Return New Object() {limites, coeffr, coeffn}
End Function
End Class
End Namespace
(ntressons-nous au constructeur +
' constructeur
Public Sub New(ByVal DSNimpots As String)
' on note le nom de la source <=>?
Me.DSNimpots = DSNimpots
End Sub
(l reLot en param.tre1 le nom )e la source ?DB* )ans la/uelle se trouvent les )onnes = ac/urr. 7e constructeur se contente )e
mmorser ce nom. 7a mtho)e OgetDataQ est charge )e lre les )onnes )e la ta-le OmpotsQ et )e les mettre )ans tros ta-leau%
:lmtes1 coe!!r1 coe!!n;. *ommentons son co)e +
les param.tres )e la conne%on = la source )e )onnes ?DB* sont )!ns mas celle-c n,est pas ouverte
' chaAne de connexion la base
Dim connectString As String = "DSN=" + DSNimpots + ";"
' on cre un ob8et connexion la base de donnes # cette connexion n'est pas ouverte
Dim impotsConn As OdbcConnection = New OdbcConnection(connectString)
on )!nt tros o-9ets OArraD7stQ pour rcuprer les )onnes )e la ta-le OmpotsQ +
E%emples 1$I&1'"
' tableaux pour rcuprer les donnes
Dim aLimites As New ArrayList
Dim aCoeffR As New ArrayList
Dim aCoeffN As New ArrayList
Toute le co)e ),acc.s = la -ase est entour ),un trD&catch pour grer une ventuelle erreur ),acc.s. ?n ouvre la conne%on
avec la -ase +
' on tente d'accder la base de donnes
impotsConn = New OdbcConnection(connectString)
impotsConn.Open()
on e%cute la comman)e OselectQ sur la conne%on ouverte. ?n o-tent un o-9et O?)-cDataBea)erQ /u va nous permettre
)e parcourr les lgnes )e la ta-le rsultat )u select +
' on cre un objet command
Dim sqlCommand As OdbcCommand = New OdbcCommand(selectCommand, impotsConn)
' on excute la requte
Dim myReader As OdbcDataReader = sqlCommand.ExecuteReader()
on parcourt la ta-le rsultat1 lgne par lgne. Pour cela on utlse la mtho)e OBea)Q )e l,o-9et O?)-cDataBea)erQ o-tenu
prc)emment. *ette mtho)e !at )eu% choses +
o elle avance ),une lgne )ans la ta-le. Au )part1 on est postonn avant la 1.re lgne
o elle ren) le -oolen OtrueQ s elle a pu avancer1 O!alseQ snon1 ce )erner cas n)/uant /ue toutes les lgnes ont t
e%plotes.
7es colonnes )e la lgne courante )e l,o-9et O?)-cDataBea)erQ sont o-tenues par O?)-cDataBea)erQ:nom*olonne;. ?n
o-tent alors un o-9et reprsentant la valeur )e la colonne. Nous parcourons la totalt )e la ta-le pour mettre son contenu
)ans les tros o-9ets OArraD7stQ +
' Exploitation de la table rcupre
While myReader.Read()
' les donnes de la ligne courante sont mis dans les tableaux
aLimites.Add(myReader("limites"))
aCoeffR.Add(myReader("coeffr"))
aCoeffN.Add(myReader("coeffn"))
cec !at1 nous l-rons les ressources assoces = la conne%on +
' libration des ressources
myReader.Close()
impotsConn.Close()
le contenu )es tros o-9ets OArraD7stQ est trans!r )ans tros ta-leau% class/ues +
' les tableaux dynamiques sont mis dans des tableaux statiques
limites = New Decimal(aLimites.Count - 1) {}
coeffr = New Decimal(aLimites.Count - 1) {}
coeffn = New Decimal(aLimites.Count - 1) {}
Dim i As Integer
For i = 0 To aLimites.Count - 1
limites(i) = CType(aLimites(i), Decimal)
coeffR(i) = CType(aCoeffR(i), Decimal)
coeffN(i) = CType(aCoeffN(i), Decimal)
Next i
une !os les )onnes )e la ta-le OmpotsQ arrves )ans les tros ta-leau%1 l ne reste plus /u,= vr!er le contenu )e ceu%-c =
l,a)e )e la mtho)e Ochec[DataQ )e la classe )e -ase OmpotsDataQ +
' on vrifie les donnes acquises
Dim erreur As Integer = checkData()
' si donnes pas valides7 alors on lance une exception
If Not valide Then Throw New Exception("Les donnes des tranches d'impts sont invalides (" +
erreur.ToString + ")")
' sinon on rend les trois tableaux
Return New Object() {limites, coeffr, coeffn}
&.2.% Tests #e "a c"asse #9acc3s aux #$nn1es
Kn programme )e test pourat 4tre le suvant +
E%emples 1$G&1'"
Option Explicit On
Option Strict On
' espaces de noms
Imports System
Imports Microsoft.VisualBasic
Namespace st.istia.univangers.fr
' pg de test
Module testimpots
Sub Main(ByVal arguments() As String)
' programme interactif de calcul d'imp9t
' l'utilisateur tape trois donnes au clavier . mari nbBnfants salaire
' le programme affiche alors l'imp9t pa"er
Const syntaxe1 As String = "pg DSNimpots"
Const syntaxe2 As String = "syntaxe : mari nbEnfants salaire" + ControlChars.Lf + "mari : o pour
mari, n pour non mari" + ControlChars.Lf + "nbEnfants : nombre d'enfants" + ControlChars.Lf + "salaire
: salaire annuel en F"
' vrification des paramtres du programme
If arguments.Length <> 1 Then
' msg d'erreur
Console.Error.WriteLine(syntaxe1)
' fin
Environment.Exit(1)
End If
' on rcupre les arguments
Dim DSNimpots As String = arguments(0)
' cration d'un ob8et imp9t
Dim objImpot As impot = Nothing
Try
objImpot = New impot(New impotsODBC(DSNimpots))
Catch ex As Exception
Console.Error.WriteLine(("L'erreur suivante s'est produite : " + ex.Message))
Environment.Exit(2)
End Try
' boucle infinie
While True
' au dpart pas d'erreurs
Dim erreur As Boolean = False
' on demande les paramtres du calcul de l'imp9t
Console.Out.Write("Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour
arrter :")
Dim paramtres As String = Console.In.ReadLine().Trim()
' qq chose faire %
If paramtres Is Nothing Or paramtres = "" Then
Exit While
End If
' vrification du nombre d'arguments dans la ligne saisie
Dim args As String() = paramtres.Split(Nothing)
Dim nbParamtres As Integer = args.Length
If nbParamtres <> 3 Then
Console.Error.WriteLine(syntaxe2)
erreur = True
End If
Dim mari As String
Dim nbEnfants As Integer
Dim salaire As Integer
If Not erreur Then
' vrification de la validit des paramtres
' mari
mari = args(0).ToLower()
If mari <> "o" And mari <> "n" Then
Console.Error.WriteLine((syntaxe2 + ControlChars.Lf + "Argument mari incorrect : tapez o ou
n"))
erreur = True
End If
' nbBnfants
nbEnfants = 0
Try
nbEnfants = Integer.Parse(args(1))
If nbEnfants < 0 Then
Throw New Exception
End If
Catch
E%emples 1$S&1'"
Console.Error.WriteLine(syntaxe2 + "\nArgument nbEnfants incorrect : tapez un entier positif
ou nul")
erreur = True
End Try
' salaire
salaire = 0
Try
salaire = Integer.Parse(args(2))
If salaire < 0 Then
Throw New Exception
End If
Catch
Console.Error.WriteLine(syntaxe2 + "\nArgument salaire incorrect : tapez un entier positif ou
nul")
erreur = True
End Try
End If
If Not erreur Then
' les paramtres sont corrects # on calcule l'imp9t
Console.Out.WriteLine(("impt=" & objImpot.calculer(mari = "o", nbEnfants, salaire).ToString +
" euro(s)"))
End If
End While
End Sub
End Module
End Namespace
7,applcaton est lance avec un param.tre +
DSNmpots + nom )e la source )e )onnes ?DB* = e%ploter
7e calcul )e l,mp<t est !at = l,a)e ),un o-9et )e tDpe OmpotQ cr ).s le lancement )e l,applcaton +
' cration d'un objet impt
Dim objImpt As impot = Nothing
Try
objImpot = New impot(New impotsODBC(DSNimpots))
Catch ex As Exception
Console.Error.WriteLine(("L'erreur suivante s'est produite : " + ex.Message))
Environment.Exit(1)
End Try
Kne !os ntalse1 l,applcaton )eman)e )e !aLon rpte = l,utlsateur )e taper au claver les tros n!ormatons )ont on a -eson
pour calculer son mp<t +
son statut martal + o pour mar1 n pour non mar
son nom-re ),en!ants
son salare annuel
7,ensem-le )es classes est compl +
dos>vbc /r:system.dll /r:system.data.dll /t:library /out:impot.dll impots.vb impotsArray.vb impotsData.vb
impotsODBC.vb
dos>dir
01/04/2004 19:34 7 168 impot.dll
01/04/2004 19:31 1 360 impots.vb
21/04/2004 08:23 1 311 impotsArray.vb
21/04/2004 08:26 1 634 impotsData.vb
01/04/2004 19:34 2 735 impotsODBC.vb
01/04/2004 19:32 3 210 testimpots.vb
7e programme )e test est compl = son tour +
dos>vbc /r:impot.dll testimpots.vb
dir>dir
01/04/2004 19:34 7 168 impot.dll
01/04/2004 19:31 1 360 impots.vb
21/04/2004 08:23 1 311 impotsArray.vb
21/04/2004 08:26 1 634 impotsData.vb
01/04/2004 19:34 2 735 impotsODBC.vb
01/04/2004 19:34 6 144 testimpots.exe
01/04/2004 19:32 3 210 testimpots.vb
7e programme )e test est e%cut ),a-or) avec la source )e )onnes ?DB* 8DSE7 +
E%emples 1$'&1'"
dos>testimpots odbc-mysql-dbimpots
Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour arrter :o 2 60000
impt=4300 euro(s)
?n change )e source ?DB* pour pren)re une source Access +
dos>testimpots odbc-access-dbimpots
Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour arrter :o 2 60000
impt=4300 euro(s)
&.2.& Les vues #e "9app"icati$n 8e-
*e sont celles )e l,applcaton prc)ente + O!ormulare.asp%Q et Oerreurs.asp%Q
&.2.( Les c$ntr0"eurs #9app"icati$n ?g"$-a".asax/ 2ain.aspx@
Seul le contr<leur Oglo-al.asa%Q )ot 4tre mo)!. (l est en e!!et en charge )e crer l,o-9et OmpotQ lors )u )marrage )e l,applcaton.
7e constructeur )e cet o-9et a pour un/ue param.tre l,o-9et )e tDpe OmpotsDataQ charg )e rcuprer les )onnes. *e param.tre
change )onc pour cha/ue nouveau tDpe )e sources )e )onnes. 7e contr<leur Oglo-al.asa%.v-Q )event le suvant +
Imports System
Imports System.Web
Imports System.Web.SessionState
Imports st.istia.univangers.fr
Imports System.Configuration
Public Class Global
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' on cre un ob8et impot
Dim objImpot As impot
Try
objImpot = New impot(New impotsODBC(ConfigurationSettings.AppSettings("DSNimpots")))
' on met l'ob8et dans l'application
Application("objImpot") = objImpot
' pas d'erreur
Application("erreur") = False
Catch ex As Exception
'il " a eu erreur7 on le note dans l'application
Application("erreur") = True
Application("message") = ex.Message
End Try
End Sub
End Class
7a source )e )onnes )e l,o-9et OmpotQ est mantenant un o-9et Ompot?DB*Q. *e )erner a pour param.tre le nom DSN )e la
source )e )onnes ?DB* = e%ploter. Plut<t /ue ),crre ce nom en )ur )ans le co)e1 on le met )ans le !cher )e con!guraton
O0e-.con!gQ )e l,applcaton +
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DSNimpots" value="odbc-mysql-dbimpots" />
</appSettings>
</configuration>
?n sat /ue la valeur ),une cl * )e la secton MappSettngsN )u !cher O0e-.con!gQ est o-tenue )ans le co)e )e l,applcaton par
O*on!guratonSettngs.AppSettngs:*;Q.
A!n )e connaVtre la cause )e l,e%cepton1 on enregstre le message )e celle-c )ans l,applcaton a!n /u,l reste )spon-le pour les
re/u4tes. 7e contr<leur Oman.asp%.v-Q ncluera ce message )ans sa lste ),erreurs +
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' avant tout7 on regarde si l'application a pu s'initialiser correctement
If CType(Application("erreur"), Boolean) Then
' on redirige vers la page d'erreurs
Dim erreurs As New ArrayList
erreurs.Add("Application momentanment indisponible...(" + Application("message").ToString + ")")
context.Items("erreurs") = erreurs
context.Items("lien") = ""
context.Items("href") = ""
Server.Transfer("erreurs.aspx")
End If
' on rcupre l'action faire
E%emples 1H#&1'"
...
&.2.* Ei"an #es 2$#i:icati$ns
7,applcaton est pr4te = 4tre teste. 7stons les mo)!catons amenes = la verson prc)ente +
1. une nouvelle classe ),acc.s au% )onnes a t construte
". le contr<leur Oglo-al.asa%.v-Q a t mo)! en )eu% en)rots + constructon )e l,o-9et OmpotQ et enregstrement )ans
l,applcaton )u message l = l,ventuelle e%cepton
F. le contr<leur Oman.asp%.v-Q a t mo)! en un en)rot pour a!!cher le message ),e%cepton prc)ent
$. un !cher O0e-.con!gQ a t a9out
7e traval )e mo)!caton s,est !at essentellement en 11 c.a.). en-)ehors )e l,applcaton 0e-. *ec a t ren)u poss-le grYce =
l,archtecture 8V* )e l,applcaton /u spare le contr<leur )es classes mter. *,est l= tout l,ntr4t )e cette archtecture. ?n
pourrat montrer /u,avec un !cher )e con!guraton O0e-.con!gQ a)/uat1 on aurat pu vter toute mo)!caton )u contr<leur )e
l,applcaton. (l est poss-le )e mettre )ans O0e-.con!gQ le nom )e la classe ),acc.s au% )onnes = nstancer )Dnam/uement ans
/ue les )vers param.tres ncessares = cette nstancaton. Avec ces n!ormatons1 Oglo-al.asa%Q peut nstancer l,o-9et ),acc.s au%
)onnes. *hanger )e source )e )onnes revent alors = +
crer la classe ),acc.s = cette source s elle n,e%ste pas encore
mo)!er le !cher O0e-.con!gQ pour permettre la craton )Dnam/ue ),une nstance )e cette classe )ans
Oglo-al.asa%Q
&.2.A Test #e "9app"icati$n 8e-
7,ensem-le )es !chers prc)ents sont placs )ans un )osser Mapplcaton-pathN.

Dans ce )osser1 est cr un sous-)osser O-nQ )ans le/uel est plac l,assem-lage Ompot.)llQ ssu )e la complaton )es !chers )es
classes mter + Ompots.v-1 mpotsData.v-1 mpotsArraD.v-1 mpots?DB*.v-Q. ?n rappelle c-)essous1 la comman)e )e
complaton ncessare +
dos>vbc /r:system.dll /r:system.data.dll /t:library /out:impot.dll impots.vb impotsArray.vb impotsData.vb
impotsODBC.vb
dos>dir
01/04/2004 19:34 7 168 impot.dll
01/04/2004 19:31 1 360 impots.vb
21/04/2004 08:23 1 311 impotsArray.vb
21/04/2004 08:26 1 634 impotsData.vb
01/04/2004 19:34 2 735 impotsODBC.vb
01/04/2004 19:32 3 210 testimpots.vb
7e !cher Ompot.)llQ c-)essus )ot 4tre plac )ans Mapplcaton-pathNP-n a!n /ue l,applcaton 0e- D at acc.s. 7e serveur *assn
est lanc avec les param.tres :Mapplcaton-pathN1&mpots";. 7es tests )onnent les m4mes rsultats /ue )ans la verson prc)ente1
la prsence )e la -ase )e )onnes tant transparente pour l,utlsateur. Pour llustrer nanmons cette prsence1 nous !asons en
sorte /ue la source ?DB* ne sot pas )spon-le en arr4tant le SABD 8DSE7 et nous )eman)ons l,url
Ohttp+&&localhost&mpots"&man.asp%Q. Nous o-tenons la rponse suvante +
E%emples 1H1&1'"
-.' Exemple '
&.3.1 Le pr$-"32e
Nous nous proposons c )e trater le m4me pro-l.me en mo)!ant )e nouveau la source )es )onnes )e l,o-9et OmpotQ cr par
l,applcaton 0e-. *ette !os-c1 la nouvelle source )e )onnes sera une -ase A**ESS = la/uelle on acc.)era va un plote ?7EDB.
Notre o-9ect! est )e montrer une autre !aLon ),acc)er = une -ase )e )onnes.
&.3.2 La s$urce #e #$nn1es 4LDE
7es )onnes se trouveront )ans une ta-le appele O(8P?TSQ ),une -ase A**ESS. 7e contenu )e cette ta-le sera le suvant +
&.3.3 La c"asse #9acc3s aux #$nn1es
Bevenons la structure 8V* )e notre applcaton +
Sur le schma c-)essus1 la classe OmpotsDataQ est charge )e rcuprer les )onnes. Elle )evra le !are cette !os-c aupr.s ),une
source ?7EDB.
Nous crons la classe Ompots?7EDBQ /u va aller chercher les )onnes :lmtes1coe!!r1coe!!n; )ans une source ?DB* )ont on lu
)onnera le nom +
Imports System.Data
Imports System.Collections
Imports System
Imports System.Xml
Imports System.Data.OleDb
E%emples 1H"&1'"
*lent 7og/ue applcatve
*lasse
mter
OmpotQ
Oman.asp%Q
(nter!ace
clent
Donnes
Sources )e
)onnes
C04T56L/35
%/3ELE
23/1
O!ormulare.asp%Q
Oerreurs.asp%Q
*lasse ),acc.s
au% )onnes
OmpotsDataQ
Namespace st.istia.univangers.fr
Public Class impotsOLEDB
Inherits impotsData
' variables d'instance
Protected chaineConnexion As String
' constructeur
Public Sub New(ByVal chaineConnexion As String)
' on note la chaAne de connexion au C>=
Me.chaineConnexion = chaineConnexion
End Sub
Public Overrides Function getData() As Object()
' initialise les trois tableaux limites7 coeffr7 coeffn partir
' du contenu de la table &impots' de la base <+B=> &chaine?onnexion'
' limites7 coeffr7 coeffn sont les trois colonnes de cette table
' peut lancer diverses exceptions
' on cre un ob8et =ataAdapter pour lire les donnes de la source <+B=>
Dim adaptateur As New OleDbDataAdapter("select limites,coeffr,coeffn from impots", chaineConnexion)
' on cre une image en mmoire du rsultat du select
Dim contenu As New DataTable("impots")
Try
adaptateur.Fill(contenu)
Catch e As Exception
Throw New Exception("Erreur d'accs la base de donnes (" + e.Message + ")")
End Try
' on rcupre le contenu de la table impots
Dim lignesImpots As DataRowCollection = contenu.Rows
' on dimensionne les tableaux de rception
Me.limites = New Decimal(lignesImpots.Count - 1) {}
Me.coeffr = New Decimal(lignesImpots.Count - 1) {}
Me.coeffn = New Decimal(lignesImpots.Count - 1) {}
' on transfre le contenu de la table impots dans les tableaux
Dim i As Integer
Dim ligne As DataRow
Try
For i = 0 To lignesImpots.Count - 1
' ligne i de la table
ligne = lignesImpots.Item(i)
' on rcupre le contenu de la ligne
limites(i) = CType(ligne.Item(0), Decimal)
coeffr(i) = CType(ligne.Item(1), Decimal)
coeffn(i) = CType(ligne.Item(2), Decimal)
Next
Catch
Throw New Exception("Certaines donnes des tranches d'impts sont invalides")
End Try
' on vrifie les donnes acquises
Dim erreur As Integer = checkData()
' si donnes pas valides7 alors on lance une exception
If Not valide Then Throw New Exception("Les donnes des tranches d'impts sont invalides (" +
erreur.ToString + ")")
' sinon on rend les trois tableaux
Return New Object() {limites, coeffr, coeffn}
End Function
End Class
End Namespace
(ntressons-nous au constructeur +
' constructeur
Public Sub New(ByVal chaineConnexion As String)
' on note la chane de connexion au SGBD
Me.chaineConnexion = chaineConnexion
End Sub
(l reLot en param.tre1 la chaVne )e conne%on )e la source ?7EDB )ans la/uelle se trouvent les )onnes = ac/urr. 7e
constructeur se contente )e la mmorser. Kne chaVne )e conne%on content tous les param.tres ncessares au plote ?7EDB
pour se connecter = la source ?7EDB. Elle est en gnral asse5 comple%e. Pour )couvrr celle )es -ases A**ESS1 on peut se !are
a)er par l,outl OWe-8atr%Q. ?n lance cet outl. (l o!!re une !en4tre permettant )e se connecter = une source )e )onnes +
E%emples 1HF&1'"
ArYce = l,cone )sgne par la !l.che c-)essus1 l est poss-le )e crer une conne%on = )eu% tDpes )e -ases )e )onnes 8croso!t +
SE7 Server et A**ESS. *hosssons A**ESS +
Nous avons utls le -outon O...Q pour )sgner la -ase A**ESS. Nous val)ons l,assstant. Dans l,onglet ODataQ1 )es c<nes
sDm-olsent la conne%on +
8antenant1 construsons un nouveau !cher .asp% par O]les&Ne0 ]leQ +
Nous o-tenons une !eulle verge sur la/uelle on peut )essner notre nter!ace 0e- +
]asons glsser )e l,onglet ODataQ la ta-le OmpotsQ sur la !eulle c-)essus. Nous o-tenons le rsultat suvant +
E%emples 1H$&1'"
*l/uons )rot sur l,o-9et OAccessDataSource*ontrolQ c-)essous pour avor acc.s = ces proprts +
7a chaVne )e conne%on ?7EDB = la -ase A**ESS est )onne par la proprt O*onnectonStrngQ c-)essus +
Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data
Source=D:\data\serge\devel\aspnet\poly\chap5\impots\3\impots.mdb
?n vot /ue cette chaVne est !orme ),une parte !%e et ),une parte vara-le /u est tout smplement le nom )u !cher A**ESS.
Nous utlserons ce !at pour gnrer la chaVne )e conne%on = notre source )e )onnes ?7EDB.
Bevenons mantenant = notre classe Ompots?7EDBQ. 7a mtho)e OgetDataQ est charge )e lre les )onnes )e la ta-le OmpotsQ et
)e les mettre )ans tros ta-leau% :lmtes1 coe!!r1 coe!!n;. *ommentons son co)e +
on )!nt l,o-9et ODataA)apterQ /u va nous permettre )e trans!rer en mmore le rsultat ),une re/u4te SE7 OselectQ.
Pour cela1 nous )!nssons la re/u4te OselectQ = e%cuter et l,assocons = l,o-9et ODataA)apterQ. 7e constructeur )e celu-c
rclame galement la chaVne )e conne%on /u,l )evra utlser pour se connecter = la source ?7EDB
' on cre un objet DataAdapter pour lire les donnes de la source OLEDB
Dim adaptateur As New OleDbDataAdapter("select limites,coeffr,coeffn from impots", chaineConnexion)
on e%cute la comman)e OselectQ grYce = la mtho)e O]llQ )e l,o-9et ODataA)apterQ. 7e rsultat )u OselectQ est n9ect )ans
un o-9et ODataTa-leQ cr pour l,occason. Kn o-9et ODataTa-leQ est l,mage en mmore ),une ta-le )e -ase )e )onnes1
c.a.). un ensem-le )e lgnes et )e colonnes. Nous grons une e%cepton /u peut survenr s par e%emple la chaVne )e
conne%on est ncorrecte.
' on cre une image en mmoire du rsultat du select
Dim contenu As New DataTable("impots")
Try
adaptateur.Fill(contenu)
Catch e As Exception
Throw New Exception("Erreur d'accs la base de donnes (" + e.Message + ")")
End Try
)ans OcontenuQ1 nous avons la ta-le OmpotsQ ramene par le OselectQ. Kn o-9et ODataTa-leQ est une ta-le )onc un ensem-le
)e lgnes. *elles-c sont access-les va la proprt Oro0sQ )e ODataTa-leQ +
' on rcupre le contenu de la table impots
Dim lignesImpots As DataRowCollection = contenu.Rows
cha/ue lment )e la collecton Olgnes(mpotsQ est un o-9et )e tDpe ODataBo0Q reprsentant une lgne )e la ta-le. *elle-c a
)es colonnes access-les va l,o-9et ODataBo0Q va sa proprt O(temQ. ODataBo0Q.O(tem:;Q est la colonne nR )e la lgne
E%emples 1HH&1'"
ODataBo0Q. En parcourant la collecton )es lgnes :la collecton DataBo0s )e lgnes(mpots;1 et la collecton )es colonnes
)e cha/ue lgne1 on est capa-le ),o-tenr la totalt )e la ta-le +
' on dimensionne les tableaux de rception
Me.limites = New Decimal(lignesImpots.Count - 1) {}
Me.coeffr = New Decimal(lignesImpots.Count - 1) {}
Me.coeffn = New Decimal(lignesImpots.Count - 1) {}
' on transfre le contenu de la table impots dans les tableaux
Dim i As Integer
Dim ligne As DataRow
Try
For i = 0 To lignesImpots.Count - 1
' ligne i de la table
ligne = lignesImpots.Item(i)
' on rcupre le contenu de la ligne
limites(i) = CType(ligne.Item(0), Decimal)
coeffr(i) = CType(ligne.Item(1), Decimal)
coeffn(i) = CType(ligne.Item(2), Decimal)
Next
Catch
Throw New Exception("Les donnes des tranches d'impts n'ont pas le bon type")
End Try

une !os les )onnes )e la ta-le OmpotsQ arrves )ans les tros ta-leau%1 l ne reste plus /u,= vr!er le contenu )e ceu%-c =
l,a)e )e la mtho)e Ochec[DataQ )e la classe )e -ase OmpotsDataQ +
' on vrifie les donnes acquises
Dim erreur As Integer = checkData()
' si donnes pas valides7 alors on lance une exception
If Not valide Then Throw New Exception("Les donnes des tranches d'impts sont invalides (" +
erreur.ToString + ")")
' sinon on rend les trois tableaux
Return New Object() {limites, coeffr, coeffn}
&.3.% Tests #e "a c"asse #9acc3s aux #$nn1es
Kn programme )e test pourrat 4tre le suvant +
Option Explicit On
Option Strict On
' espaces de noms
Imports System
Imports Microsoft.VisualBasic
Namespace st.istia.univangers.fr
' pg de test
Module testimpots
Sub Main(ByVal arguments() As String)
' programme interactif de calcul d'imp9t
' l'utilisateur tape trois donnes au clavier . mari nbBnfants salaire
' le programme affiche alors l'imp9t pa"er
Const syntaxe1 As String = "pg bdACCESS"
Const syntaxe2 As String = "syntaxe : mari nbEnfants salaire" + ControlChars.Lf + "mari : o pour
mari, n pour non mari" + ControlChars.Lf + "nbEnfants : nombre d'enfants" + ControlChars.Lf + "salaire
: salaire annuel en F"
' vrification des paramtres du programme
If arguments.Length <> 1 Then
' msg d'erreur
Console.Error.WriteLine(syntaxe1)
' fin
Environment.Exit(1)
End If
' on rcupre les arguments
Dim chemin As String = arguments(0)
' on prpare la chaAne de connexion
Dim chaineConnexion As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source="
+ chemin
' cration d'un ob8et imp9t
Dim objImpot As impot = Nothing
Try
objImpot = New impot(New impotsOLEDB(chaineConnexion))
Catch ex As Exception
E%emples 1HI&1'"
Console.Error.WriteLine(("L'erreur suivante s'est produite : " + ex.Message))
Environment.Exit(2)
End Try
' boucle infinie
While True
' au dpart pas d'erreurs
Dim erreur As Boolean = False
' on demande les paramtres du calcul de l'imp9t
Console.Out.Write("Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour
arrter :")
Dim paramtres As String = Console.In.ReadLine().Trim()
' qq chose faire %
If paramtres Is Nothing Or paramtres = "" Then
Exit While
End If
' vrification du nombre d'arguments dans la ligne saisie
Dim args As String() = paramtres.Split(Nothing)
Dim nbParamtres As Integer = args.Length
If nbParamtres <> 3 Then
Console.Error.WriteLine(syntaxe2)
erreur = True
End If
Dim mari As String
Dim nbEnfants As Integer
Dim salaire As Integer
If Not erreur Then
' vrification de la validit des paramtres
' mari
mari = args(0).ToLower()
If mari <> "o" And mari <> "n" Then
Console.Error.WriteLine((syntaxe2 + ControlChars.Lf + "Argument mari incorrect : tapez o ou
n"))
erreur = True
End If
' nbBnfants
nbEnfants = 0
Try
nbEnfants = Integer.Parse(args(1))
If nbEnfants < 0 Then
Throw New Exception
End If
Catch
Console.Error.WriteLine(syntaxe2 + "\nArgument nbEnfants incorrect : tapez un entier positif
ou nul")
erreur = True
End Try
' salaire
salaire = 0
Try
salaire = Integer.Parse(args(2))
If salaire < 0 Then
Throw New Exception
End If
Catch
Console.Error.WriteLine(syntaxe2 + "\nArgument salaire incorrect : tapez un entier positif ou
nul")
erreur = True
End Try
End If
If Not erreur Then
' les paramtres sont corrects # on calcule l'imp9t
Console.Out.WriteLine(("impt=" & objImpot.calculer(mari = "o", nbEnfants, salaire).ToString +
" euro(s)"))
End If
End While
End Sub
End Module
End Namespace
7,applcaton est lance avec un param.tre +
-)A**ESS + nom )u !cher A**ESS = e%ploter
7e calcul )e l,mp<t est !at = l,a)e ),un o-9et )e tDpe OmpotQ cr ).s le lancement )e l,applcaton +
' on rcupre les arguments
E%emples 1HG&1'"
Dim chemin As String = arguments(0)
' on prpare la chane de connexion
Dim chaineConnexion As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source="
+ chemin
' cration d'un objet impt
Dim objImpot As impot = Nothing
Try
objImpot = New impot(New impotsOLEDB(chaineConnexion))
Catch ex As Exception
Console.Error.WriteLine(("L'erreur suivante s'est produite : " + ex.Message))
Environment.Exit(2)
End Try
7a chaVne )e conne%on = la source ?7EDB a t construte = partr )es n!ormatons o-tenues avec OWe-8atr%Q.
Kne !os ntalse1 l,applcaton )eman)e )e !aon rpte = l,utlsateur )e taper au claver les tros n!ormatons )ont on a -eson
pour calculer son mp<t +
son statut martal + o pour mar1 n pour non mar
son nom-re ),en!ants
son salare annuel
7,ensem-le )es classes est compl +
dos>vbc /r:system.dll /r:system.data.dll /t:library /out:impot.dll impots.vb impotsArray.vb impotsData.vb
impotsOLEDB.vb
dos>vbc /r:impot.dll testimpots.vb
7e !cher Ompots.m)-Q est plac )ans le )osser )e l,applcaton )e test et celle-c est lance )e la !aLon suvante +
dos>testimpots impots.mdb
Paramtres du calcul de l'impt au format mari nbEnfants salaire ou rien pour arrter :o 2 60000
impt=4300 euro(s)
?n peut lancer l,applcaton avec un !cher A**ESS ncorrect +
dos>testimpots xx
L'erreur suivante s'est produite : Erreur d'accs la base de donnes (Ficher
'D:\data\serge\devel\aspnet\poly\chap5\impots\3\xx' introuvable.)
&.3.& Les vues #e "9app"icati$n 8e-
*e sont celles )e l,applcaton prc)ente + O!ormulare.asp%Q et Oerreurs.asp%Q
&.3.( Les c$ntr0"eurs #9app"icati$n ?g"$-a".asax/ 2ain.aspx@
Seul le contr<leur Oglo-al.asa%Q )ot 4tre mo)!. (l a en e!!et en charge )e crer l,o-9et OmpotQ lors )u )marrage )e l,applcaton.
7e constructeur )e cet o-9et a pour un/ue param.tre l,o-9et )e tDpe OmpotsDataQ charg )e rcuprer les )onnes. *e param.tre
change )onc pus/u,on change )e sources )e )onnes. 7e contr<leur Oglo-al.asa%.v-Q )event le suvant +
Imports System
Imports System.Web
Imports System.Web.SessionState
Imports st.istia.univangers.fr
Imports System.Configuration
Public Class Global
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' on cre un ob8et impot
Dim objImpot As impot
Try
objImpot = New impot(New impotsOLEDB(ConfigurationSettings.AppSettings("chaineConnexion")))
' on met l'ob8et dans l'application
Application("objImpot") = objImpot
' pas d'erreur
Application("erreur") = False
Catch ex As Exception
'il " a eu erreur7 on le note dans l'application
Application("erreur") = True
Application("message") = ex.Message
E%emples 1HS&1'"
End Try
End Sub
End Class
7a source )e )onnes )e l,o-9et OmpotQ est mantenant un o-9et Ompot?7EDBQ. *e )erner a pour param.tre la chaVne )e
conne%on )e la source )e )onnes ?7EDB = e%ploter. *elle-c est place )ans le !cher )e con!guraton O0e-.con!gQ )e
l,applcaton +
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="chaineConnexion"
value="Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data
Source=D:\data\serge\devel\aspnet\poly\chap5\impots2\impots.mdb" />
</appSettings>
</configuration>
7e contr<leur Oman.asp%Q ne change pas.
&.3.* Ei"an #es 2$#i:icati$ns
7,applcaton est pr4te = 4tre teste. 7stons les mo)!catons amenes = la verson prc)ente +
1. une nouvelle classe ),acc.s au% )onnes a t construte
". le contr<leur Oglo-al.asa%.v-Q a t mo)! en un en)rot + constructon )e l,o-9et OmpotQ
F. un !cher O0e-.con!gQ a t a9out
&.3.A Test #e "9app"icati$n 8e-
7,ensem-le )es !chers prc)ents est plac )ans un )osser Mapplcaton-pathN.

Dans ce )osser1 est cr un sous-)osser O-nQ )ans le/uel est plac l,assem-lage Ompot.)llQ ssu )e la complaton )es !chers )es
classes mter + Ompots.v-1 mpotsData.v-1 mpotsArraD.v-1 mpots?7EDB.v-Q. ?n rappelle c-)essous1 la comman)e )e
complaton ncessare +
dos>vbc /r:system.dll /r:system.data.dll /t:library /out:impot.dll impots.vb impotsArray.vb impotsData.vb
impotsOLEDB.vb
7e !cher Ompot.)llQ pro)ut par cette comman)e )ot 4tre plac )ans Mapplcaton-pathNP-n a!n /ue l,applcaton 0e- D at
acc.s. 7e serveur *assn est lanc avec les param.tres :Mapplcaton-pathN1&mpotsF;. 7es tests )onnent les m4mes rsultats /ue
)ans la verson prc)ente.
-., Exemple ,
&.%.1 Le pr$-"32e
Nous nous proposons mantenant )e trans!ormer notre applcaton en applcaton )e smulaton )e calculs ),mp<t. Kn utlsateur
pourra !are )es calculs success!s ),mp<ts et ceu%-c lu seront prsents sur une nouvelle vue ressem-lant = cec +
E%emples 1H'&1'"
&.%.2 La structure M.+ #e "9app"icati$n
7a structure 8V* )e l,applcaton )event la suvante +
ApparaVt une nouvelle vue Osmulatons.asp%Q )ont nous venons )e )onner une cope ),cran. 7a classe ),acc.s au% )onnes sera la
classe Ompots?DB*Q )e l,e%emple ".
&.%.3 Les vues #e "9app"icati$n 8e-
7a vue Oerreurs.asp%Q ne change pas. 7a vue O!ormulare.asp%Q change lg.rement. En e!!et1 le montant )e l,mp<t n,apparaVt
)sormas plus sur cette vue. (l est mantenant sur la vue Osmulatons.asp%Q. Ans au )marrage1 la page prsente = l,utlsateur est
la suvante +
Par alleurs1 la vue O!ormulareQ transporte avec elle un scrpt 9avascrpt /u vr!e la val)t )es )onnes sases avant )e les envoDer
au serveur comme le montre l,e%emple suvant +
E%emples 1I#&1'"
*lasse
mter
OmpotQ
Oman.asp%Q
*lent 7og/ue applcatve
*lasse ),acc.s
au% )onnes
Ompots?DB*Q
(nter!ace
clent
Donnes
Sources )e
)onnes
C04T56L/35
%/3ELE
Osmulatons.asp%Q
23/1
O!ormulare.asp%Q
Oerreurs.asp%Q
7e co)e )e prsentaton est le suvant +
<%@ page src="formulaire.aspx.vb" inherits="formulaire" AutoEventWireup="false"%>
<html>
<head>
<title>Impt</title>
<script language="javascript">
function calculer(){
// vrification des paramtres avant de les envo"er au serveur
with(document.frmImpots){
//nbre d'enfants
champs=/^\s*(\d+)\s*$/.exec(txtEnfants.value);
if(champs==null){
// le modle n'est pas vrifi
alert("Le nombre d'enfants n'a pas t donn ou est incorrect");
txtEnfants.focus();
return;
}//if
//salaire
champs=/^\s*(\d+)\s*$/.exec(txtSalaire.value);
if(champs==null){
// le modle n'est pas vrifi
alert("Le salaire n'a pas t donn ou est incorrect");
txtSalaire.focus();
return;
}//if
// c'est bon # on envoie le formulaire au serveur
submit();
}//with
}//calculer
</script>
</head>
<body>
<P>Calcul de votre impt</P>
<HR width="100%" SIZE="1">
<form name="frmImpots" method="post" action="main.aspx?action=calcul">
<TABLE border="0">
<TR>
<TD>Etes-vous mari(e)</TD>
<TD>
<INPUT type="radio" value="oui" name="rdMarie" <%=rdouichecked%>>Oui
<INPUT type="radio" value="non" name="rdMarie" <%=rdnonchecked%>>Non</TD>
</TR>
<TR>
<TD>Nombre d'enfants</TD>
<TD><INPUT type="text" size="3" maxLength="3" name="txtEnfants" value="<%=txtEnfants%>"></TD>
</TR>
<TR>
<TD>Salaire annuel (euro)</TD>
<TD><INPUT type="text" maxLength="12" size="12" name="txtSalaire" value="<%=txtSalaire%>"></TD>
</TR>
</TABLE>
<hr>
<P>
<INPUT type="button" value="Calculer" onclick="calculer()">
</P>
</form>
<form method="post" action="main.aspx?action=effacer">
<INPUT type="submit" value="Effacer">
</form>
</body>
</html>
E%emples 1I1&1'"
7es champs )Dnam/ues )e la page sont ceu% )es versons prc)entes. 7e champ )Dnam/ue )u montant )e l,mp<t a )sparu. 7e
-outon O*alculerQ n,est plus un -outon )e tDpe Osu-mtQ. (l est )e tDpe O-uttonQ et lors/u,l est cl/u1 la !oncton 9avascrpt
Ocalculer:;Q est e%cute +
<INPUT type="button" value="Calculer" onclick="calculer()">
?n a )onn au !ormulare un nom O!rm(mpotsQ a!n )e pouvor le r!rencer )ans le scrpt OcalculerQ +
<form name="frmImpots" method="post" action="main.aspx?action=calcul">
7a !oncton 9avascrpt OcalculerQ utlse )es e%presson rgul.res pour vr!er la val)t )es champs )u !ormulare
O)ocument.!rm(mpots.t%tEn!antsQ et O)ocument.!rm(mpots.t%tSalareQ. S les valeurs sases sont correctes1 elles sont envoDes au
serveur par O)ocument.!rm(mpots.su-mt:;Q.
7a page )e prsentaton o-tent ses champs )Dnam/ues aupr.s )e son contr<leur O!ormulare.asp%.v-Q suvant +
Imports System.Collections.Specialized
Public Class formulaire
Inherits System.Web.UI.Page
' champs de la page
Protected rdouichecked As String
Protected rdnonchecked As String
Protected txtEnfants As String
Protected txtSalaire As String
Protected txtImpot As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' on rcupre la prcdente requte dans le contexte
Dim form As NameValueCollection = Context.Items("formulaire")
' on prpare la page afficher
' boutons radio
rdouichecked = ""
rdnonchecked = "checked"
If form("rdMarie").ToString = "oui" Then
rdouichecked = "checked"
rdnonchecked = ""
End If
' le reste
txtEnfants = CType(form("txtEnfants"), String)
txtSalaire = CType(form("txtSalaire"), String)
End Sub
End Class
7e contr<leur O!ormulare.asp%.v-Q est )ent/ue au% versons prc)entes s ce n,est /u,l n,a plus = rcuprer le champ Ot%t(mpotQ
)ans le conte%te1 ce champ aDant )sparu )e la page.
7a vue Osmulatons.asp%Q se prsente vsuellement comme sut +
et correspon) au co)e )e prsentaton suvant +
<%@ page src="simulations.aspx.vb" inherits="simulations" autoeventwireup="false" %>
<HTML>
<HEAD>
<title>simulations</title>
</HEAD>
<body>
<P>Rsultats des simulations</P>
<HR width="100%" SIZE="1">
<table>
<tr>
<th>
Mari</th>
E%emples 1I"&1'"
<th>
Enfants</th>
<th>
Salaire annuel (euro)</th>
<th>
Impt payer (euro)</th>
</tr>
<%=simulationsHTML%>
</table>
<p></p>
<a href="<%=href%>">
<%=lien%>
</a>
</body>
</HTML>
*e co)e prsente tros champs )Dnam/ues +
simulationsHTML
co)e 3T87 ),une lste )e smulatons sous la !orme )e lgnes )e ta-le 3T87
href
url ),un len
lien
te%te )u len
(ls sont gnrs par la parte contr<leur Osmulatons.asp%.v-Q +
Imports System.Collections
Imports Microsoft.VisualBasic
Public Class simulations
Inherits System.Web.UI.Page
Protected simulationsHTML As String = ""
Protected href As String
Protected lien As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'on rcupre les simulations dans le contexte
Dim simulations As ArrayList = CType(context.Items("simulations"), ArrayList)
' chaque simulation est un tableau de D lments string
Dim simulation() As String
Dim i, j As Integer
For i = 0 To simulations.Count - 1
simulation = CType(simulations(i), String())
simulationsHTML += "<tr>"
For j = 0 To simulation.Length - 1
simulationsHTML += "<td>" + simulation(j) + "</td>"
Next
simulationsHTML += "</tr>" + ControlChars.CrLf
Next
' on rcupre les autres lments du contexte
href = context.Items("href").ToString
lien = context.Items("lien").ToString
End Sub
End Class
7e contr<leur )e la page rcup.re )es n!ormatons places par le contr<leur )e l,applcaton )ans le conte%te )e la page +
Context.Items("simulations")
o-9et ArraD7st contenant la lste )es smulatons = a!!cher. *ha/ue lment est un ta-leau )e $
chaVnes )e caract.res reprsentant les n!ormatons :mar1 en!ants1 salare1 mpot; )e la
smulaton.
Context.Items("href")
url ),un len
Context.Items("lien")
te%te )u len
&.%.% Les c$ntr0"eurs ?g"$-a".asax/ 2ain.aspx@
Bappelons le schma 8V* )e notre applcaton +
E%emples 1IF&1'"
7e contr<leur Oman.asp%Q a = trater tros actons +
init + correspon) = la prem.re re/u4te )u clent. 7e contr<leur a!!che la vue O!ormulare.asp%Q
calcul + correspon) = la )eman)e )e calcul )e l,mp<t. S les )onnes )u !ormulare )e sase sont correctes1 l,mp<t est
calcul grYce = la classe mter Ompots?DB*Q. 7e contr<leur retourne au clent la vue Osmulatons.asp%Q avec le rsultat )e
la smulaton courante plus toutes les prc)entes. S les )onnes )u !ormulare )e sase sont ncorrectes1 le contr<leur
retourne la vue Oerreurs.asp%Q avec la lste )es erreurs et un len pour retourner au !ormulare.
retour + correspon) au retour au !ormulare apr.s une erreur. 7e contr<leur a!!che la vue O!ormulare.asp%Q telle /u,elle a
t val)e avant l,erreur.
Dans cette nouvelle verson1 seule l,acton OcalculQ a chang. En e!!et1 s les )onnes sont val)es1 elle )ot a-outr = la vue
Osmulatons.asp%Q alors /u,auparavant elle a-outsat = la vue O!ormulare.asp%Q. 7e contr<leur Oman.asp%.v-Q )event le suvant +
Imports System
...
Public Class main
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' avant tout7 on regarde si l'application a pu s'initialiser correctement
...
' on excute l'action
Select Case action
Case "init"
' init application
initAppli()
Case "calcul"
' calcul impot
calculImpot()
Case "retour"
' retour au formulaire
retourFormulaire()
Case "effacer"
' init application
initAppli()
Case Else
' action inconnue 2 init
initAppli()
End Select
End Sub
...
Private Sub calculImpot()
' on sauvegarde les saisies
Session.Item("formulaire") = Request.Form
' on vrifie la validit des donnes saisies
Dim erreurs As ArrayList = checkData()
' s'il " a des erreurs7 on le signale
If erreurs.Count <> 0 Then
' on prpare la page d'erreurs
context.Items("href") = "main.aspx?action=retour"
context.Items("lien") = "Retour au formulaire"
context.Items("erreurs") = erreurs
Server.Transfer("erreurs.aspx")
End If
' ici pas d'erreurs # on calcule l'imp9t
Dim impot As Long = CType(Application("objImpot"), impot).calculer( _
E%emples 1I$&1'"
*lasse
mter
OmpotQ
Oman.asp%Q
*lent 7og/ue applcatve
*lasse ),acc.s
au% )onnes
Ompots?DB*Q
(nter!ace
clent
Donnes
Sources )e
)onnes
C04T56L/35
%/3ELE
Osmulatons.asp%Q
23/1
O!ormulare.asp%Q
Oerreurs.asp%Q
Request.Form("rdMarie") = "oui", _
CType(Request.Form("txtEnfants"), Integer), _
CType(Request.Form("txtSalaire"), Long))
' on ra8oute le rsultat aux simulations existantes
Dim simulations As ArrayList
If Not Session.Item("simulations") Is Nothing Then
simulations = CType(Session.Item("simulations"), ArrayList)
Else
simulations = New ArrayList
End If
' a8out de la simulation courante
Dim simulation() As String = New String() {Request.Form("rdMarie").ToString, _
Request.Form("txtEnfants").ToString, Request.Form("txtSalaire").ToString, _
impot.ToString}
simulations.Add(simulation)
' on met les simulations dans la session et le contexte
context.Items("simulations") = simulations
Session.Item("simulations") = simulations
' on affiche la page de rsultat
context.Items("href") = "main.aspx?action=retour"
context.Items("lien") = "Retour au formulaire"
Server.Transfer("simulations.aspx", True)
End Sub
...
End Class
Nous n,avons conserv c-)essus /ue ce /u tat ncessare pour compren)re les mo)!catons /u se trouvent un/uement )ans la
!oncton Ocalcul(mpotsQ +
tout ),a-or) la !oncton sauve le !ormulare OBe/uest.]ormQ )ans la sesson1 cec a!n )e pouvor rgnrer le !ormulare
)ans l,tat o6 l a t val). *,est = !are )ans tous les cas1 pus/ue /ue l,opraton a-outsse sur la rponse Oerreurs.asp%Q
ou sur la rponse Osmulatons.asp%Q1 on revent au !ormulare par le len OBetour au !ormulareQ. Pour resttuer
correctement celu-c1 l !aut avor sauvegar) ses valeurs auparavant )ans la sesson.
s les )onnes sases s,av.rent correctes1 la !oncton met la smulaton courante :mar1 en!ants1 salare1 mp<t; )ans la lste
)es smulatons. *elle-c est trouve )ans la sesson assoce = la cl >smulatons>.
la lste )es smulatons est replace )ans la sesson pour un usage !utur. Elle est galement place )ans le conte%te courant
car c,est l= /ue l,atten) la vue Osmulatons.asp%Q
la vue Osmulatons.asp%Q est a!!che une !os mses )ans le conte%tes les autres n!ormatons /u,elle atten)
&.%.& Ei"an #es 2$#i:icati$ns
7,applcaton est pr4te = 4tre teste. 7stons les mo)!catons amenes au% versons prc)entes +
1. une nouvelle vue a t construte
". le contr<leur Oman.asp%.v-Q a t mo)! en un en)rot + tratement )e l,acton OcalculQ
&.%.( Test #e "9app"icati$n 8e-
7e lecteur est nvt = !are les tests. ?n rappelle la )marche. 7,ensem-le )es !chers )e l,applcaton sont placs )ans un )osser
Mapplcaton-pathN. Dans ce )osser1 est cr un sous-)osser O-nQ )ans le/uel est plac l,assem-lage Ompot.)llQ ssu )e la
complaton )es !chers )es classes mter + Ompots.v-1 mpotsData.v-1 mpotsArraD.v-1 mpots?DB*.v-. 7e !cher Ompot.)llQ
pro)ut par cette comman)e )ot 4tre plac )ans Mapplcaton-pathNP-n a!n /ue l,applcaton 0e- D at acc.s. 7e serveur *assn
est lanc avec les param.tres :Mapplcaton-pathN1&mpots$;.
-.- Conclusion
7es e%emples prc)ents ont montr sur un cas concret )es mcansmes couramment utlss )ans le )veloppement 0e-. Nous
avons utls sDstmat/uement l,archtecture 8V* pour son ntr4t p)agog/ue. ?n aurat pu trater ces m4mes e%emples
)!!remment et peut-4tre plus smplement sans cette archtecture. 8as celle-c apporte )e gran)s avantages ).s /ue l,applcaton
)event un peu comple%e avec )e multples pages.
Nous pourrons poursuvre nos e%emples )e )!!rentes !aLons. En voc /uel/ues unes +
l,utlsateur pourrat voulor gar)er ses smulatons au !l )u temps. (l !erat )es smulatons un 9our 2 et pourrat les
retrouver le 9our 2@F par e%emple. Kne soluton poss-le = ce pro-l.me est l,utlsaton )e coo[es. Nous savons /ue le
9eton )e sesson entre le serveur et un clent est transport par ce mcansme. ?n pourrat utlser galement celu-c pour
transporter les smulatons entre le clent et le serveur.
E%emples 1IH&1'"
o en m4me temps /ue le serveur envoe la page rsultat )es smulatons1 l envoe )ans ses ent4tes 3TTP un coo[e
contenant une chaVne )e caract.res reprsentant les smulatons. *omme celles-c sont )ans un o-9et OArraD7stQ
l D a un traval )e trans!ormaton )e cet o-9et en OStrngQ = oprer. 7e serveur )onnerat au coo[e une )ure )e
ve1 par e%emple F# 9ours.
o le navgateur clent stoc[e les coo[es reLus )ans un !cher et les renvoe = cha/ue !os /u,l !at une re/u4te = un
serveur/u les lu a envoDs s,ls sont encore val)es :)ure )e ve pas )passe;. 7e serveur recevra pour les
smulatons une chaVne )e caract.res OStrngQ /u,l )evra trans!ormer en o-9et OArraD7stQ.
7es coo[es sont grs par OBesponse.*oo[esQ lors )e leur envo vers le clent et par OBe/uest.*oo[esQ lors )e leur
rcepton sur le serveur.
le mcansme prc)ent peut )evenr asse5 lour) s l D a un nom-re mportant )e smulatons. Par alleurs1 l est !r/uent
/u,un utlsateur nettoe pro)/uement ses coo[es en les supprmant tous m4me s par alleurs l autorse son navgateur
= les utlser. Donc un 9our ou l,autre on per)ra le coo[e )es smulatons. ?n peut voulor alors stoc[er celles-c sur le
serveur plut<t /ue sur le clent1 )ans une -ase )e )onnes par e%emple. Pour ler )es smulatons = un utlsateur
partculer1 l,applcaton pourrat )marrer par une phase ),)ent!caton rclamant un logn et un mot )e passe eu%-m4mes
stoc[s )ans une -ase )e )onnes ou tout autre tDpe )e )p<t )e )onnes.
nous pourrons galement voulor scurser le !onctonnement )e notre applcaton. *elle-c !at actuellement )eu%
hDpoth.ses +
1. l,utlsateur passe tou9ours par le contr<leur Oman.asp%Q
". et )ans ce cas1 l utlse tou9ours les actons proposes )ans la page /u,on lu a envoDe
Eue se passe-t-l par e%emple1 s l,utlsateur )eman)e )rectement l,url Ohttp+&&localhost&mpots$&!ormulare.asp%Q W *e
cas est peu propa-le pus/ue l,utlsateur ne connaVt pas l,e%stence )e cette url. *epen)ant l )ot 4tre prvu. (l peut 4tre
gr par le contr<leur ),applcaton Oglo-al.asa%Q /u vot passer toutes les re/u4tes !ates = l,applcaton. l peut ans
vr!er /ue la ressource )eman)e est -en Oman.asp%Q.
Kn cas plus pro-a-le est /u,un utlsateur n,utlse pas les actons prsentes sur la page /ue le serveur lu a envoDe. Par
e%emple1 /ue se passe-t-l s l,utlsateur )eman)e )rectement l,url Ohttp+&&localhost&mpots$&man.asp%WactonTretourQ
sans passer auparavant par le remplssage )u !ormulare W EssaDons. Nous o-tenons la rponse suvante +
?n a un plantage )u serveur. *,est normal. Pour l,acton OretourQ le contr<leur s,atten) = trouver )ans la sesson un o-9et
ONameValue*ollectonQ reprsentant les valeurs )u !ormulare /u,l )ot a!!cher. (l ne les trouve pas. 7e mcansme )u
contr<leur permet )e )onner une soluton lgante = ce pro-l.me. Pour cha/ue re/u4te1 le contr<leur Oman.asp%Q peut
vr!er /ue l,acton )eman)e est -en l,une )es actons )e la page prc)emment envoDe = l,utlsateur. ?n peut utlser
le mcansme suvant +
le contr<leur avant ),envoDer sa rponse au clent1 stoc[e )ans la sesson )e celu-c une n!ormaton )ent!ant
cette page
lors/u,l reLot une nouvelle )eman)e )u clent1 l vr!e /ue l,acton )eman)e appartent -en = la )ern.re page
envoDe = ce clent
les n!ormatons lant pages et actons autorses )ans ces pages peuvent 4tre ntro)utes )ans le !cher )e
con!guraton O0e-.con!gQ )e l,applcaton.
l,e%prence montre /ue les contr<leurs ),applcatons ont une large -ase commune et /u,l est poss-le )e construre un
contr<leur gnr/ue1 la spcalsaton )e celu-c pour une applcaton )onne se !asant va un !cher )e con!guraton.
*,est la voe suve par e%emple1 par l,outl OStrutsQ )ans le )omane )e la programmaton 0e- en 2ava.
E%emples 1II&1'"
9 4nnexe . Les outils du d"eloppement !eb
Nous n)/uons c o6 trouver et comment nstaller )es outls gratuts permettant )e !are )u )veloppement 0e- en 9ava1 php1 asp
et asp.net. *ertans outls ont vu leurs versons voluer et l se peut /ue les e%plcatons )onnes c ne convennent plus pour les
versons les plus rcentes. 7e lecteur sera alors amen = s,a)pater... +
un na"iateur rcent capa-le ),a!!cher )u J87. 7es e%emples )u cours ont t tests avec (nternet E%plorer I.
un O3P :2ava Development Xt; rcent. 7e 2DX am.ne avec lu le Plug-n 2ava 1.$ pour les navgateurs ce /u permet =
ces )erners ),a!!cher )es applets 2ava utlsant le 2DX 1.$.
un en"ironnement de d"eloppement Oa"a pour crre )es servlets 2ava. (c c,est 2Bul)er G.
)es ser"eurs !eb + Apache1 PWS :Personal We- Server1 *assn;1 Tomcat.
o Apache peut 4tre utls pour le )veloppement ),applcatons 0e- en PEB7 :Practcal E%tractng an) Beportng
7anguage; ou P3P :Personal 3ome Page;
o PWS peut 4tre utls pour le )veloppement ),applcatons 0e- en ASP :Actve Server Pages; ou P3P sur les
plate-!ormes Wn)o0s. *assn lu permet le )veloppement en ASP.NET.
o Tomcat est utls pour le )veloppement ),applcatons 0e- = l,a)e )e servlets 2ava ou )e pages 2SP :2ava Server
pages;
un s*stme de estion de base de donnes + 8DSE7
Eas*(5( + un outl /u am.ne ensem-le le serveur We- Apache1 le langage P3P et le SABD 8DSE7
9.1 &er"eurs Web) Na"iateurs) Lanaes de scripts
1. &er"eurs Web principaux
Apache :7nu%1 Wn)o0s;
(nterner (n!ormaton Server ((S :NT;1 Personal We- Server PWS :Wn)o0s '%;1 *assn :palte-!ormes .NET;
$. Na"iateurs principaux
(nternet E%plorer :Wn)o0s;
Netscape :7nu%1 Wn)o0s;
8o5lla :7nu%1 Wn)o0s;
?pera :7nu%1 Wn)o0s;
'. Lanaes de scripts ct ser"eur
VBScrpt :((S1 PWS;
2avaScrpt :((S1 PWS;
Perl :Apache1 ((S1 PWS;
P3P :Apache1 ((S1 PWS;
2ava :Apache1 Tomcat;
7angages .NET
,. Lanaes de scripts ct na"iateur
VBScrpt :(E;
2avascrpt :(E1 Netscape;
Perlscrpt :(E;
2ava :(E1 Netscape;
9.$ /Q trou"er les outils
Netscape
http6++!!!.netscape.com+ Blien do!nloadsC
Internet Explorer
http6++!!!.microso#t.com+!indo!s+ie+de#ault.asp
Mozilla
http6++!!!.mo>illa.or
PHP
http6++!!!.php.net
Active PERL
http6++!!!.acti"estate.com
Vbscript, Javascript
http6++msdn.microso#t.com+scriptin Bsui"re le lien !indo!s scriptC
JAVA
http6++Ra"a.sun.com+
Apache
http6++!!!.apache.or+
PWS
inclus dans N1 ,.? /ption pac@ #or Windo!s N-
inclus dans le C3 de Windo!s NM
http6++!!!.microso#t.com+ntser"er+nts+do!nloads+recommended+N1,/pt(@+!in
N-.asp
IIS (windows NT/2000)
http6++!!!.microso#t.com
Tomcat
http6++Ra@arta.apache.or+tomcat+
JBuilder
http6++!!!.borland.com+Rbuilder+
EasyPHP
http6++!!!.eas*php.or+
Cassini
http6++!!!.asp.net
E%emples 1IG&1'"
9.' Eas*(5(
*ette applcaton est tr.s prat/ue en ce /u,elle am.ne )ans un m4me pa/uetage +
le serveur We- Apache
un nterprteur P3P
le SABD 8DSE7 :F."F.%;
un outl ),a)mnstraton )e 8DSE7 + Php8DA)mn
7,applcaton ),nstallaton se prsente sous la !orme suvante +
7,nstallaton ),EasDP3P ne pose pas )e pro-l.me et une ar-orescence est cre )ans le sDst.me )e !chers +
easyphp.exe
l,e%cuta-le )e l,applcaton
apache
l,ar-orescence )u serveur apache
mysql
l,ar-orescence )u SABD mDs/l
phpmyadmin
l,ar-orescence )e l,applcaton phpmDa)mn
php
l,ar-orescence )e php
www
racne )e l,ar-orescence )es pages 0e- )lvres par le serveur apache ),EasDP3P
cgi-bin
ar-orescence o6 l,on peut palcer )es scrpt *A( pour le serveur Apache
7,ntr4t prncpal ),EasDP3P est /ue l,applcaton arrve prcon!gure. Ans Apache1 P3P1 8DSE7 sont )9= con!gurs pour
travaller ensem-le. 7ors/u,on lance Aas7/hp par son len )ans le menu )es programmes1 une c<ne se met en place en -as = )rote
)e l,cran.
*,est le E avec un pont rouge /u )ot clgnoter s le serveur 0e- )pache et la -ase )e )onnes =7!G; sont opratonnels.
7ors/u,on cl/ue )essus avec le -outon )rot )e la sours1 on acc.)e = )es optons )e menu +
E%emples 1IS&1'"
7,opton )'ministration permet )e !are )es rglages et )es tests )e -on !onctonnement +
(.3.1 +$n:igurati$n #e "9interpr1teur PHP
7e -outon in#os php )ot vous permettre )e vr!er le -on !onctonnement )u couple Apache-P3P + une page ),n!ormatons
P3P )ot apparaVtre +
7e -outon extensions )onne la lste )es e%tensons nstalles pour php. *e sont en !at )es --loth./ues )e !onctons.
7,cran c-)essus montre par e%emple /ue les !onctons ncessares = l,utlsaton )e la -ase 8DSE7 sont -en prsentes.
7e -outon paramtres )onne le login/mot'epasse )e l,a)mnstrateur )e la -ase )e )onnes 8DSE7.
E%emples 1I'&1'"
7,utlsaton )e la -ase 8DSE7 )passe le ca)re )e cette prsentaton rap)e mas l est cla c /u,l !au)rat mettre un mot )e passe
= l,a)mnstrateur )e la -ase.
(.3.2 A#2inistrati$n Apac=e
Tou9ours )ans la page ),a)mnstraton ),EasDP3P1 le len "os alias permet )e )!nr )es alas assocs = un rpertore. *ela permet
)e mettre )es pages We- alleurs /ue )ans le rpertore 000 )e l,ar-orescence ),easDPhp.
S )ans la page c-)essus1 on met les n!ormatons suvantes +
et /u,on utlse le -outon vali'er les lgnes suvantes sont a9outes au !cher <eas7php>\apache\conf\http'.conf +
Alias /st/ "e:/data/serge/web/"
<Directory "e:/data/serge/web">
Options FollowSymLinks Indexes
AllowOverride None
Order deny,allow
allow from 127.0.0.1
deny from all
</Directory>
<eas7php> )sgne le rpertore ),nstallaton ),EasDP3P. http'.conf est le !cher )e con!guraton )u serveur Apache. ?n peut )onc
!are la m4me chose en )tant )rectement ce !cher. Kne mo)!caton )u !cher http'.conf est normalement prse en compte
mm)atement par Apache. S ce n,tat pas le cas1 l !au)rat l,arr4ter pus le relancer1 tou9ours avec l,c<ne ),easDphp +
Pour termner notre e%emple1 on peut mantenant placer )es pages 0e- )ans l,ar-orescence e:\'ata\serge\$eb +
dos>dir e'(data(serge()eb(*tml(balises+*tm
,-/.//0..0 ,/'.0 1 /2/ balises+*tm
et )eman)er cette page en utlsant l,alas st +
E%emples 1G#&1'"
Dans cet e%emple1 le serveur Apache a t con!gur pour travaller sur le port S1. Son port par )!aut est S#. *e pont est contr<l
par la lgne suvante )u !cher http'.conf )9= rencontr +
Port 81
(.3.3 Le :ic=ier ?=tp#.c$n:@ #e c$n:igurati$n #9Apac=e =tp#.c$n:
7ors/u,on veut con!gurer un peu !nement Apache1 on est o-lg ),aller mo)!er >= la man> son !cher )e con!guraton http'.conf
stu c )ans le )osser <eas7php>\apache\conf +
Voc /uel/ues ponts = retenr )e ce !cher )e con!guraton +
ligne(s)
rle
ServerRoot "D:/Program Files/Apache Group/Apache"
n)/ue le )osser o6 se trouve l,ar-orescence )e Apache
Port 80
n)/ue sur /uel port va travaller le serveur We-. *lass/uement
c,est S#. En changeant cette lgne1 on peut !are travaller le serveur
We- sur un autre port
ServerAdmin root@istia.univ-angers.fr
l,a)resse emal )e l,a)mnstrateur )u serveur Apache
ServerName stahe.istia.uang
le nom )e la machne sur la/uelle >tourne> le serveur Apache
ServerRoot "E:/Program Files/EasyPHP/apache"
le rpertore ),nstallaton )u serveur Apache. 7ors/ue )ans le
!cher )e con!guraton1 apparassent )es noms relat!s )e !chers1
ls sont relat!s par rapport = ce )osser.
DocumentRoot "E:/Program Files/EasyPHP/www"
le )osser racne )e l,ar-orescence )es pages We- )lvres par le
serveur. (c1 l,url http://machine/rep1/fic1.html correspon)ra au
!cher A:\/rogram Hiles\Aas7/E/\$$$ \rep1\fic1.html
<Directory "E:/Program Files/EasyPHP/www">
!%e les proprts )u )osser prc)ent
ErrorLog logs/error.log
)osser )es logs1 )onc en !at <!erverRoot>\logs\error.log + A:\/rogram
Hiles\Aas7/E/\apache\logs\error.log. *,est le !cher = consulter s
E%emples 1G1&1'"
vous constate5 /ue le serveur Apache ne !onctonne pas.
ScriptAlias /cgi-bin/ "E:/Program
Files/EasyPHP/cgi-bin/"
A:\/rogram Hiles\Aas7/E/\cgi-bin sera la racne )e l,ar-orescence o6
l,on pourra mettre )es scrpts *A(. Ans l,KB7 http://machine/cgi-
bin/rep1/script1.pl sera l,url )u scrpt *A( A:\/rogram
Hiles\Aas7/E/\cgi-bin \rep1\script1.pl.
<Directory "E:/Program Files/EasyPHP/cgi-bin/">
!%e les proprts )u )osser c-)essus
LoadModule php4_module "E:/Program
Files/EasyPHP/php/php4apache.dll"
AddModule mod_php4.c
lgnes )e chargement )es mo)ules permettant = Apache )e
travaller avec P3P$.
AddType application/x-httpd-php .phtml .pwml
.php3 .php4 .php .php2 .inc
!%e les su!!%es )es !chers = cons)rer comme )es !chers
comme )evant 4tre trats par P3P
(.3.% A#2inistrati$n #e MySFL avec P=pMyA#2in
Sur la page ),a)mnstraton ),EasDPhp1 on cl/ue sur le -outon (hp%*4dmin +
7a lste )roulante sous )ccueil permet )e vor les -ases )e
)onnes actuelles.
7e nom-re entre parenth.ses est le nom-re )e ta-les. S on
chost une -ase1 les ta-les )e celles-c s,a!!chent +
7a page We- o!!re un certan nom-re ),opratons sur la -ase +
E%emples 1G"&1'"
S on cl/ue sur le len )fficher )e user +
(l n,D a c /u,un seul utlsateur + root1 /u est l,a)mnstrateur )e 8DSE7. En suvant le len =o'ifier1 on pourrat changer son mot
)e passe /u est actuellement v)e1 ce /u n,est pas consell pour un a)mnstrateur. Nous n,en )rons pas plus sur /hp=7)'min /u
est un logcel rche et /u mrterat un )veloppement )e pluseurs pages.
9., (5(
Nous avons vu comment o-tenr P3P au travers )e l,applcaton EasDPhp. Pour o-tenr P3P )rectement1 on ra sur le ste
http6++!!!.php.net. P3P n,est pas utlsa-le /ue )ans le ca)re )u We-. ?n peut l,utlser comme langage )e scrpts sous
Wn)o0s. *re5 le scrpt suvant et sauvegar)e5-le sous le nom 'ate.php +
<?
// script php affichant l'heure
$maintenant=date("j/m/y, H:i:s",time());
echo "Nous sommes le $maintenant";
?>
Dans une !en4tre D?S1 place5-vous )ans le rpertore )e O)ate.phpQ et e%cute5-le 6
dos>"e'(program files(easyp*p(p*p(p*p+e3e" date+p*p
456o)ered57y' 686/-+0+.
9ontent5type' te3t/*tml
:ous sommes le ,;/.//.0< .='1,'.,
9.- (ERL
(l est pr!ra-le /ue (nternet E%plorer sot )9= nstall. S,l est prsent1 Actve Perl va le con!gurer a!n /u,l accepte )es scrpts
PEB7 )ans les pages 3T871 scrpts /u seront e%cuts par (E lu-m4me c<t clent. 7e ste )e Actve Perl est = l,KB7
http6++!!!.acti"estate.comA l,nstallaton1 PEB7 sera nstall )ans un rpertore /ue nous appelerons :perl;. (l content
l,ar-orescence suvante +
>?@AB, @AC 10 -.1 01/.2/.. ,/',2 >e@sB,+isu
7@: <D?6> 01/.2/.. ,/',E bin
B@7 <D?6> 01/.2/.. ,/',E lib
8FGB <D?6> 01/.2/.. ,/',E *tml
?H <D?6> 01/.2/.. ,/',E eg
E%emples 1GF&1'"
A@F? <D?6> 01/.2/.. ,/',E site
8FGB8?B6 <D?6> 0;/.2/.. ,;'1/ *tml*elp
7,e%cuta-le perl.e"e est )ans :perl;Sbin. Perl est un langage )e scrpts !onctonnant sous Wn)o0s et Kn%. (l est )e plus utls
)ans la programmaton WEB. acrvons un premer scrpt +
# script PERL affichant l'heure
# modules
use strict;
# programme
my ($secondes,$minutes,$heure)=localtime(time);
print "Il est $heure:$minutes:$secondes\n";
Sauvegar)e5 ce scrpt )ans un !cher heure.pl. ?uvre5 une !en4tre D?S1 place5-vous )ans le rpertore )u scrpt prc)ent et
e%cute5-le +
dos>e'(perl(bin(perl+e3e *eure+pl
@l est ='1-'0,
9.9 Abscript) Oa"ascript) (erlscript
*es langages sont )es langages )e scrpt pour 0n)o0s. (ls peuvent !onctonner )ans )!!rents conteneurs tels
Fin'o$s !cripting Eost pour une utlsaton )recte sous Wn)o0s notamment pour crre )es scrpts ),a)mnstraton
sDst.me
nternet A"plorer. (l est alors utls au sen )e pages 3T87 au%/uelles l am.ne une certane nteractvt mposs-le =
atten)re avec le seul langage 3T87.
nternet nformation !erver :((S; le serveur We- )e 8croso!t sur NT&"### et son /uvalent /ersonal Feb !erver :PWS; sur
Wn'%. Dans ce cas1 v-scrpt est utls pour !are )e la programmaton c<t serveur 0e-1 technologe appele ASP :)ctive
!erver /ages; par 8croso!t.
?n rcup.re le !cher ),nstallaton = l,KB7 + http://ms'n.microsoft.com/scripting et on sut les lens Fin'o$s !cript. Sont nstalls +
le conteneur Fin'o$s !cripting Eost1 conteneur permettant l,utlsaton )e )vers langages )e scrpts1 tels V-scrpt et
2avascrpt mas auss ),autres tel PerlScrpt /u est amen avec Actve Perl.
un nterprteur VBscrpt
un nterprteur 2avascrpt
Prsentons /uel/ues tests rap)es. *onstrusons le programme vbscript suvant +
' une classe
class personne
Dim nom
Dim age
End class
' cration d'un objet personne
Set p1=new personne
With p1
.nom="dupont"
.age=18
End With
' affichage proprits personne p1
With p1
wscript.echo "nom=" & .nom
wscript.echo "age=" & .age
End With
*e programme utlse )es o-9ets. Appelons-le ob#ets.vbs :le su!!%e v-s )sgne un !cher v-scrpt;. Postonnons-nous sur le
rpertore )ans le/uel l se trouve et e%cutons-le +
dos>cscript ob!ets+vbs
Gicrosoft "D# Iindo)s Acript 8ost Version E+2
9opyrig*t "9# Gicrosoft 9orporation ,==250..,+ Jll rig*ts reserved+
nom=dupont
E%emples 1G$&1'"
age=,;
8antenant construsons le programme 9avascrpt suvant /u utlse )es ta-leau% +
// tableau dans un variant
// tableau vide
tableau=new Array();
affiche(tableau);
// tableau crot dynamiquement
for(i=0;i<3;i++){
tableau.push(i*10);
}
// affichage tableau
affiche(tableau);
// encore
for(i=3;i<6;i++){
tableau.push(i*10);
}
affiche(tableau);
// tableaux plusieurs dimensions
WScript.echo("-----------------------------");
tableau2=new Array();
for(i=0;i<3;i++){
tableau2.push(new Array());
for(j=0;j<4;j++){
tableau2[i].push(i*10+j);
}//for j
}// for i
affiche2(tableau2);
// fin
WScript.quit(0);
// ---------------------------------------------------------
function affiche(tableau){
// affichage tableau
for(i=0;i<tableau.length;i++){
WScript.echo("tableau[" + i + "]=" + tableau[i]);
}//for
}//function
// ---------------------------------------------------------
function affiche2(tableau){
// affichage tableau
for(i=0;i<tableau.length;i++){
for(j=0;j<tableau[i].length;j++){
WScript.echo("tableau[" + i + "," + j + "]=" + tableau[i][j]);
}// for j
}//for i
}//function
*e programme utlse )es ta-leau%. Appelons-le tableau".#s :le su!!%e 9s )sgne un !cher 9avascrpt;. Postonnons-nous sur le
rpertore )ans le/uel l se trouve et e%cutons-le +
dos>cscript tableaux.js
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. Tous droits rservs.
tableau[0]=0
tableau[1]=10
tableau[2]=20
tableau[0]=0
tableau[1]=10
tableau[2]=20
tableau[3]=30
tableau[4]=40
tableau[5]=50
-----------------------------
tableau[0,0]=0
tableau[0,1]=1
tableau[0,2]=2
tableau[0,3]=3
tableau[1,0]=10
tableau[1,1]=11
tableau[1,2]=12
tableau[1,3]=13
tableau[2,0]=20
E%emples 1GH&1'"
tableau[2,1]=21
tableau[2,2]=22
tableau[2,3]=23
Kn )erner e%emple en Perlscrpt pour termner. (l !aut avor nstall Actve Perl pour avor acc.s = Perlscrpt.
<job id="PERL1">
<script language="PerlScript">
# du Perl classique
%dico=("maurice"=>"juliette","philippe"=>"marianne");
@cles= keys %dico;
for ($i=0;$i<=$#cles;$i++){
$cle=$cles[$i];
$valeur=$dico{$cle};
$WScript->echo ("cl=".$cle.", valeur=".$valeur);
}
# du perlscript utilisant les objets Windows Script
$dico=$WScript->CreateObject("Scripting.Dictionary");
$dico->add("maurice","juliette");
$dico->add("philippe","marianne");
$WScript->echo($dico->item("maurice"));
$WScript->echo($dico->item("philippe"));
</script>
</job>
*e programme montre la craton et l,utlsaton )e )eu% )ctonnares + l,un = la mo)e Perl class/ue1 l,autre avec l,o-9et !cripting
Dictionar7 )e Wn)o0s Scrpt. Sauvegar)ons ce co)e )ans le !cher 'ico.$sf :0s! est le su!!%e )es !chers Wn)o0s Scrpt;.
Postonnons-nous )ans le )osser )e ce programme et e%cutons-le +
dos>cscript dico+)sf
Gicrosoft "D# Iindo)s Acript 8ost Version E+2
9opyrig*t "9# Gicrosoft 9orporation ,==250..,+ Fous droits rservs+
cl=p*ilippe< valeur=marianne
cl=maurice< valeur=!uliette
!uliette
marianne
Perlscrpt peut utlser les o-9ets )u conteneur )ans le/uel l s,e%cute. (c c,tat )es o-9ets )u conteneur Wn)o0s Scrpt. Dans le
conte%te )e la programmaton We-1 les scrpts VBscrpt1 2avascrpt1 Perlscrpt peuvent 4tre e%cuts sot au sen )u navgateur (E1
sot au sen ),un serveur PWS ou ((S. S le scrpt est un peu comple%e1 l peut 4tre 9u)ceu% )e le tester hors )u conte%te We-1 au
sen )u conteneur Wn)o0s Scrpt comme l a t vu prc)emment. ?n ne pourra tester ans /ue les !onctons )u scrpt /u
n,utlsent pas )es o-9ets propres au navgateur ou au serveur. 84me avec cette restrcton1 cette poss-lt reste ntressante car l
est en gnral asse5 peu prat/ue )e )-oguer )es scrpts s,e%cutant au sen )es serveurs 0e- ou )es navgateurs.
9.F O4A4
2ava est )spon-le = l,KB7 + http6++!!!.sun.com et s,nstalle )ans une ar-orescence /u,on appellera :Ra"a; /u content les
lments suvants +
00/.E/0..0 .E'E, <>@D> +
00/.E/0..0 .E'E, <>@D> ++
00/.E/0..0 .E'E, <>@D> bin
00/.E/0..0 .E'E, <>@D> !re
.//.0/0..0 ,0'E0 ; 0// D?J>G?+t3t
.//.0/0..0 ,0'E0 ,1 ;E1 B@9?:A?
.//.0/0..0 ,0'E0 - E,2 9O6KD@H8F
.//.0/0..0 ,0'E0 ,E 0=. readme+*tml
00/.E/0..0 .E'E, <>@D> lib
00/.E/0..0 .E'E, <>@D> include
00/.E/0..0 .E'E, <>@D> demo
.//.0/0..0 ,0'E0 ,. 1// ;-; src+zip
,,/.0/0..0 ,0'EE <>@D> docs
Dans bin1 on trouvera Ra"ac.exe1 le complateur 2ava et Ra"a.exe la machne vrtuelle 2ava. ?n pourra !are les tests suvants +
1. acrre le scrpt suvant +
//programme Java affichant l'heure
import java.io.*;
import java.util.*;
E%emples 1GI&1'"
public class heure{
public static void main(String arg[]){
// on rcupre date & heure
Date maintenant=new Date();
// on affiche
System.out.println("Il est "+maintenant.getHours()+
":"+maintenant.getMinutes()+":"+maintenant.getSeconds());
}//main
}//class
". Sauvegar)er ce programme sous le nom heure.#ava. ?uvrr une !en4tre D?S. Se mettre )ans le rpertore )u !cher heure.#ava et
le compler +
dos>c'(!d,+1(bin(!avac *eure+!ava
:ote' *eure+!ava uses or overrides a deprecated J6@+
:ote' Decompile )it* 5deprecation for details+
Dans la comman)e c-)essus Oc:\jdk1.3\bin\javac] )ot 4tre remplac par le chemn e%act )u complateur #avac.e"e. Vous
)eve5 o-tenr )ans le m4me rpertore /ue heure.#ava un !cher heure.class /u est le programme /u va mantenant 4tre e%cut
par la machne vrtuelle #ava.e"e.
F. E%cuter le programme +
dos>c'(!d,+1(bin(!ava *eure
@l est ,.'--'0
Dans la comman)e c-)essus Oc:\jdk1.3\bin\java] )ot 4tre remplac par le chemn e%act )e la machne vrtuelle 9ava O9ava.e%eQ.
9.M &er"eur 4pache
Nous avons vu /ue l,on pouvat o-tenr le serveur Apache avec l,applcaton EasDPhp. Pour l,avor )rectement1 on ra sur le ste
),Apache + http6++!!!.apache.or. 7,nstallaton cre une ar-orescence o6 on trouve tous les !chers ncessares au serveur.
Appelons :apache; ce rpertore. (l content une ar-orescence analogue = la suvante +
C:@:AF @AC ,,; ;.E 01/.2/.. ,/'.= Cninst+isu
8F>O9A <D?6> 01/.2/.. ,/'.= *tdocs
J6J98?L, >BB 0== ..; 0E/.0/.. 0,',, Jpac*e9ore+dll
J::OC:L, 1 ... 01/.0/.. ,2'E, Jnnouncement
J7OCFML, ,1 ,=/ 1,/.1/== ,;'-0 J7OCFMJ6J98?
J6J98? ?4? 0. -;. 0E/.0/.. 0,'.- Jpac*e+e3e
K?KA 12 -1/ 0./.;/== ,,'E/ K?KA
B@9?:A? 0 =./ .,/.,/== ,1'.- B@9?:A?
GJK?N@L, FG6 0/ 1/. ,,/.,/.. ,1'-/ Gaefile+tmpl
D?J>G? 0 ,.= .,/.-/=; 2'E= D?J>G?
D?J>G? :F 1 001 ,=/.1/== ='EE D?J>G?+:F
IJD:@:L, F4F 11= 0,/.=/=; ,1'.= IJD:@:H5:F+F4F
7@: <D?6> 01/.2/.. ,/'.= bin
GO>CB?A <D?6> 01/.2/.. ,/'.= modules
@9O:A <D?6> 01/.2/.. ,/'.= icons
BOHA <D?6> 01/.2/.. ,/'.= logs
9O:N <D?6> 01/.2/.. ,/'.= conf
9H@57@: <D?6> 01/.2/.. ,/'.= cgi5bin
6DO4K <D?6> 01/.2/.. ,/'.= pro3y
@:AFJBB BOH 1 //= 01/.2/.. ,/'.= install+log
conf
)osser )es !chers )e con!guraton ),Apache
logs
)osser )es !chers )e logs :suv; ),Apache
bin
les e%cuta-les ),Apache
(.A.1 +$n:igurati$n
Dans le )osser :4pache;Scon#1 on trouve les !chers suvants + http'.conf5 srm.conf5 access.conf. Dans les )ern.res versons
),Apache1 les tros !chers ont t runs )ans http'.conf. Nous avons )9= prsent les ponts mportants )e ce !cher )e
con!guraton. Dans les e%emples /u suvent c,est la verson Apache ),EasDPhp /u a serv au% tests et )onc son !cher )e
con!guraton. Dans celu-c DocumentRoot /u )sgne la racne )e l,ar-orescence )es pages We- est e:\program files\eas7php\$$$.
(.A.2 Lien PHP ; Apac=e
Pour tester1 crer le !cher intro.php avec la seule lgne suvante +
E%emples 1GG&1'"
:T phpin#oBC T;
et le mettre = la racne )es pages )u serveur Apache:DocumentRoot c-)essus;. Deman)er lUKB7 http6++localhost+intro.php. ?n
)ot vor une lste )Un!ormatons php +
7e scrpt P3P suvant a!!che l,heure. Nous l,avons )9= rencontr +
<?
// time : nb de millisecondes depuis 01/01/1970
// "format affichage date-heure
// d: jour sur 2 chiffres
// m: mois sur 2 chiffres
// y : anne sur 2 chiffres
// H : heure 0,23
// i : minutes
// s: secondes
print "Nous sommes le " . date("d/m/y H:i:s",time());
?>
PlaLons ce !cher te%te = la racne )es pages )u serveur Apache :DocumentRoot ; et appelons-le )ate.php. Deman)ons avec un
navgateur lUKB7 http6++localhost+date.php. ?n o-tent la page suvante +
(.A.3 Lien P!L;APA+H
(l est !at grYce = une lgne )e la !orme + !cript)lias /cgi-bin/ 3A://rogram Hiles/Aas7/E//cgi-bin/3 )u !cher
:apache;Scon#Shttpd.con#. Sa sDnta%e est &cript4lias +ci.bin+ =:ci.bin;= o6 :ci.bin; est le )osser o6 on pourra
placer )es scrpts *A(. *A( :*ommon Aate0aD (nter!ace; est une norme )e )alogue serveur WEB M--N Applcatons. Kn clent
)eman)e au serveur We- une page )Dnam/ue1 c.a.). une page gnre par un programme. 7e serveur WEB )ot )onc )eman)er =
un programme )e gnrer la page. *A( )!nt le )alogue entre le serveur et le programme1 notamment le mo)e )e transmsson
)es n!ormatons entre ces )eu% entts. S -eson est1 mo)!e5 la lgne !cript)lias /cgi-bin/ 3<cgi-bin>3 et relance5 le serveur
Apache. ]ates ensute le test suvant +
1. acrre le scrpt +
#!c:\perl\bin\perl.exe
# script PERL affichant l'heure
# modules
use strict;
# programme
my ($secondes,$minutes,$heure)=localtime(time);
print <<FINHTML
Content-Type: text/html
<html>
E%emples 1GS&1'"
<head>
<title>heure</title>
</head>
<body>
<h1>Il est $heure:$minutes:$secondes</h1>
</body>
FINHTML
;
". 8ettre ce scrpt )ans <cgi-bin>\heure.pl o6 <cgi-bin> est le )osser pouvant recevor )es scrpts *A( :c! http'.conf;. 7a prem.re
lgne IJc:\perl\bin\perl.e"e )sgne le chemn )e l,e%cuta-le perl.e"e. 7e mo)!er s -eson est.
F. 7ancer Apache s ce n,est !at
$. Deman)er avec un navgateur l,KB7 http://localhost/cgi-bin/heure.pl. ?n o-tent la page suvante +

9.N Le ser"eur (W&
(.B.1 5nsta""ati$n
7e serveur PWS :Personal We- Server; est une verson personnelle )u serveur ((S :(nternet (n!ormaton server; )e 8croso!t. *e
)erner est )spon-le sur les machnes NT et "###. Sur les machnes 0n'%1 PWS est normalement )spon-le avec le pa/uetage
),nstallaton (nternet E%plorer. *epen)ant l n,est pas nstall par )!aut. (l !aut pren)re une nstallaton personnalse ),(E et
)eman)er l,nstallaton )e PWS. (l est par alleurs )spon-les )ans le >9 *.- 8ption pac+ for Fin'o$s 64.
(.B.2 Pre2iers tests
7a racne )es pages We- )u serveur PWS est lecteur:\inetpub\$$$root o6 lecteur est le )s/ue sur le/uel vous ave5 nstall PWS. Nous
supposons )ans la sute /ue ce lecteur est D. Ans l,url http://machine/rep1/page1.html correspon)ra au !cher
':\inetpub\$$$root\rep1\page1.html. 7e serveur PWS nterpr.te tout !cher )e su!!%e .asp :Actve Server pages; comme tant un
scrpt /u,l )ot e%cuter pour pro)ure une page 3T87. PWS travalle par )!aut sur le port S#. 7e serveur 0e- Apache auss... (l
!aut )onc arr4ter Apache pour travaller avec PWS s vous ave5 les )eu% serveurs. 7,autre soluton est )e con!gurer Apache pour
/u,l travalle sur un autre port. Ans )ans le !cher Ohttp).con!Q )e con!guraton ),Apache1 on remplace la lgne Port S# par Port
S11 Apache travallera )sormas sur le port S1 et pourra 4tre utls en m4me temps /ue PWS. S PWS aDant t lanc1 on )eman)e
l,KB7 http+&&localhost1 on o-tent une page analogue = la suvante +
(.B.3 Lien PHP ; P,S
1. *-)essous on trouvera un !cher .re )estn = mo)!er la -ase )e regstres. Dou-le-cl/uer sur ce !cher pour mo)!er la
-ase. (c la 'll ncessare se trouve )ans ':\php* avec l,e%cuta-le )e php. 8o)!er s -eson est. 7es P )ovent 4tre )ou-ls
)ans le chemn )e la )ll.
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map]
".php"="d:\\php4\\php4isapi.dll"
". Belancer la machne pour /ue la mo)!caton )e la -ase )e regstres sot prse en compte.
F. *rer un )osser php )ans ':\inetpub\$$$root /u est la racne )u serveur PWS. *ec !at1 actve5 PWS et pren)re lUonglet
e Avanc f. Slectonner le -outon e A9outer f pour crer un )osser vrtuel +
E%emples 1G'&1'"
R.pertoire//arcourir : ':\inetpub\$$$root\php
)lias : php
?ocher la case e".cuter.
$. Val)er le tout et relancer PWS. 8ettre )ans ':\inetpub\$$$root\php le !cher intro.php aDant la seule lgne suvante +
:T phpin#oBC T;
H. Deman)er au serveur PWS lUKB7 http://localhost/php/intro.php. ?n )ot vor la lste )Un!ormatons php )9= prsentes avec
Apache.
9.1? 1omcat 6 ser"lets Oa"a et paes O&( BOa"a &er"er (aesC
Tomcat est un serveur We- permettant )e gnrer )es pages 3T87 grYce = )es servlets :programmes 2ava e%cuts par le serveur
0e-; o6 )es pages 2SP :2ava Server Pages;1 pages mlangeant co)e 2ava et co)e 3T87. *,est l,/uvalent )es pages ASP :Actve
Server Pages; )u serveur ((S&PWS )e 8croso!t o6 l= on mlange co)e VBScrpt ou 2avascrpt avec )u co)e 3T87.
(.1C.15nsta""ati$n
Tomcat est )spon-le = l,KB7 + http6++Ra@arta.apache.or. ?n rcup.re un !cher .e%e ),nstallaton. 7ors/u,on lance ce
programme1 l commence par n)/uer /uel 2DX l va utlser. En e!!et Tomcat a -eson ),un 2DX pour s,nstaller et ensute
compler et e%cuter les servlets 2ava. (l !aut )onc /ue vous aDe5 nstall un 2DX 2ava avant ),nstaller Tomcat. 7e 2DX le plus
rcent est consell. 7,nstallaton va crer une ar-orescence MtomcatN +
consste smplement = )compresser cette archve )ans un rpertore. Prene5 un rpertore ne contenant )ans son chemn /ue )es
noms sans espace :pas par e%emple >Program ]les>;1 cec parce /u,l D a un -ogue )ans le processus ),nstallaton )e Tomcat.
Prene5 par e%emple *+Ptomcat ou D+Ptomcat. Appelons ce rpertore :tomcat;. ?n D trouvera )e)ans un )osser appel Ra@arta.
tomcat et )ans celu-c l,ar-orescence suvante +
BOHA <D?6> ,E/,,/.. ='.- logs
B@9?:A? 0 ;/2 ,;/.-/.. ,E'E2 B@9?:A?
9O:N <D?6> ,E/,,/.. ;'E1 conf
>O9 <D?6> ,E/,,/.. ;'E1 doc
B@7 <D?6> ,E/,,/.. ;'E1 lib
AD9 <D?6> ,E/,,/.. ;'E1 src
I?7J66A <D?6> ,E/,,/.. ;'E1 )ebapps
7@: <D?6> ,E/,,/.. ;'E1 bin
IODK <D?6> ,E/,,/.. ='.- )or
(.1C.2D12arrage6Arr<t #u serveur ,e- T$2cat
Tomcat est un serveur We- comme l,est Apache ou PWS. Pour le lancer1 on )spose )e lens )ans le menu )es programmes +
Start Tomcat
pour lancer Tomcat
Stop Tomcat
pour l,arr4ter
7ors/u,on lance Tomcat1 une !en4tre Dos s,a!!che avec le contenu suvant +
E%emples 1S#&1'"
?n peut mettre cette !en4tre Dos en c<ne. Elle restera prsente pen)ant tant /ue Tomcat sera act!. ?n peut alors passer au%
premers tests. 7e serveur We- Tomcat travalle sur le port S#S#. Kne !os Tomcat lanc1 prene5 un navgateur We- et )eman)e5
l,KB7 http6++localhost6M?M?. Vous )eve5 o-tenr la page suvante +
Suve5 le len &er"let Examples +
*l/ue5 sur le len A"ecute )e Re0uest/arameters pus sur celu )e !ource. Vous aure5 un premer aperLu )e ce /u,est une servlet 2ava.
Vous pourre5 !are )e m4me avec les lens sur les pages 2SP.
Pour arr4ter Tomcat1 on utlsera le len !top 9omcat )ans le menu )es programmes.
9.11 Obuilder
2-ul)er est un envronnement )e )veloppement ),applcatons 2ava. Pour construre )es servlets 2ava o6 l n,D a pas ),nter!aces
graph/ues1 l n,est pas n)spensa-le ),avor un tel envronnement. Kn )teur )e te%tes et un 2DX !ont l,a!!are. Seulement 2Bul)er
apporte avec lu /uel/ues plus par rapport = la techn/ue prc)ente +
!aclt )e )-ogage + le complateur sgnale les lgnes errones ),un programme et l est !acle )e s,D postonner
suggeston )e co)e + lors/u,on utlse un o-9et 2ava1 2Bul)er )onne en lgne la lste )es proprts et mtho)es )e celu-c.
*ela est tr.s prat/ue lors/u,on sat /ue la plupart )es o-9ets 2ava ont )e tr.s nom-reuses proprts et mtho)es /u,l est
)!!cle )e se rappeler.
?n trouvera 2Bul)er sur le ste http6++!!!.borland.com+Rbuilder. (l !aut remplr un !ormulare pour o-tenr le logcel. Kne cl
),actvaton est envoDe par ml. Pour nstaller 2Bul)er G1 l a par e%emple t proc) ans +
tros !chers 5p ont t o-tenus + pour l,applcaton1 pour la )ocumentaton1 pour les e%emples. *hacun )e ces 5p !at
l,o-9et ),un len spar sur le ste )e 2Bul)er.
on a nstall ),a-or) l,applcaton1 pus la )ocumentaton et en!n les e%emples
lors/u,on lance l,applcaton la prem.re !os1 une cl ),actvaton est )eman)e + c,est celle /u vous a t envoDe par ml.
Dans la verson G1 cette cl est en !at la totalt ),un !cher te%te /ue l,on peut placer1 par e%emple1 )ans le )osser
),nstallaton )e 2BG. Au moment o6 la cl est )eman)e1 on )sgne alors le !cher en /ueston. *ec !at1 la cl ne sera
plus re)eman)e.
(l D a /uel/ues con!guratons utles = !are s on veut utlser 2Bul)er pour construre )es servlets 2ava. En e!!et1 la verson )te
2-ul)er personnel est une verson allge /u ne vent notamment pas avec toutes les classes ncessares pour !are )u
E%emples 1S1&1'"
)veloppement 0e- en 2ava. ?n peut !are en sorte /ue 2Bul)er utlse les --loth./ues )e classes amenes par Tomcat. ?n
proc.)e ans +
lancer 2Bul)er
actver l,opton 9ools/?onfigure KDLs
Dans la parte KDL !ettings c-)essus1 on a normalement )ans le champ >ame un 2DX 1.F.1. S vous ave5 un 2DX plus rcent1
utlse5 le -outon ?hange pour )sgner le rpertore ),nstallaton )e ce )erner. *-)essus1 on a )sgn le rpertore A:\/rogram
Hiles\#'+1* o6 avat nstall un 2DX 1.$. Dsormas1 2Bul)er utlsera ce 2DX pour ses complatons et e%cutons. Dans la parte
:*lass1 Surce1 Documentaton; on a la lste )e toutes les --loth./ues )e classes /u seront e%plores par 2Bul)er1 c les classes )u
2DX 1.$. 7es classes )e celu-c ne su!!sent pas pour !are )u )veloppement 0e- en 2ava. Pour a9outer ),autres --loth./ues )e
classes on utlse le -outon )'' et on )sgne les !chers .#ar supplmentares /ue l,on veut utlser. 7es !chers .9ar sont )es
--loth./ues )e classes. Tomcat $.% am.ne avec lu toutes les --loth./ues )e classes ncessares au )veloppement 0e-. Elles se
trouvent )ans <tomcat>\common\lib o6 <tomcat> est le rpertore ),nstallaton )e Tomcat +
Avec le -outon )''1 on va a9outer ces --loth./ues1 une = une1 = la lste )es --loth./ues e%plores par 2Bul)er +
E%emples 1S"&1'"
A partr )e mantenant1 on peut compler )es programmes 9ava con!ormes = la norme 2"EE1 notamment les servlets 2ava. 2-ul)er
ne sert /u,= la complaton1 l,e%cuton tant ultreurement assure par Tomcat selon )es mo)alts e%pl/ues )ans le cours.
9.1$ Le ser"eur Web Cassini
Pour travaller avec la plate-!orme .NET )e 8croso!t1 on peut utlser le serveur 0e- *assn. *elu-c est )spon-le va un autre
pro)ut appel OWe-8atr%Q /u est un envronnement gratut )e )veloppement 0e- sur les plate-!ormes .NET )spon-le = l,url +
?n suvra attentvement la )marche ),nstallaton )u pro)ut +
tlcharger et nstaller la plate-!orme .NET :1.1 en mars "##$;
tlcharger et nstaller We-8atr%
tlcharger et nstaller 8SDE :8croso!t Data Engne; /u est une verson lmte )e SE7 Server.
Kne !os l,nstallaton termne1 le pro)ut OWe-8atr%Q est )spon-le )ans les programmes nstalls +
7e len OASP.NETQ We- 8atr% lance l,(DE )e )veloppement ASP.NET +
E%emples 1SF&1'"
7e len O*lass Bro0serQ lance un outl ),e%ploraton )es classes .NET +
Pour tester l,nstallaton1 lanLons OWe-8atr%Q +
7ors )u )marrage ntal1 OWe-8atr%Q )eman)e les caractrst/ues )u nouveau pro9et.*,est sa con!guraton par )!aut. ?n peut
le con!gurer pour /u,l ne !asse pas apparaVtre cette -oVte )e )alogue au )marrage. ?n l,o-tent alors par l,oton O]le&Ne0 ]leQ.
OWe-8atr%Q permet )e construre )es s/uelettes pour )!!rentes applcatons 0e-. *-)essus1 nous avons prcs avec :1; /ue
nous voulons construre une applcaton OASP.ET PageQ /u est une page We-. Avec :";1 nous prcsons le )osser )ans le/uel
sera place cette page We-. Dans :F; nous )onnons le nom )e la page. Elle )ot avor le su!!%e .asp%. En!n )ans :$;1 nous
prcsons /ue nous voulons travaller avec le langage VB.NET1 OWe-8atr%Q supportant par alleurs les langages *C et 2C.
*ec !at1 OWe-8atr%Q a!!che une page ),)ton )u !cher O)emo1.asp%Q. Nous D plaLons le co)e suvant +
E%emples 1S$&1'"
1
"
F
$
l,onglet ODesgnQ permet )e >)essner> la page 0e- /ue l,on veut construre. *ela se passe comme avec un (DE )e
constructon ),applcatons 0n)o0s.
la concepton graph/ue )e la page We- )ans ODesgnQ va gnrer )u co)e 3T87 )ans l,onglet O3T87Q
la page We- peut contenr )es contr<les gnrant )es vnements au%/uels l !aut ragr1 un -outon par e%emple. *es
vnements seront grs par )u co)e VB.NET /u sera plac )ans l,onglet O*o)eQ
au !nal1 le !cher )emo1.asp% est un !cher te%te mlangeant co)e 3T87 et co)e VB.NET1 rsultat )e la concepton
graph/ue !ate )ans ODesgnQ1 )u co)e 3T87 /u,on a pu a9outer = la man )ans O3T87Q et )u co)e VB.NET plac
)ans O*o)eQ. 7a totalt )u !cher est )spon-le )ans l,onglet OAllQ.
un )veloppeur ASP.ET e%prment peut construre le !cher )emo1.asp% )rectement avec un )teur )e te%te sans
l,a)e ),aucun (DE.
Slectonnons l,opton OAllQ ?n constate /ue OWe-8atr%Q a )9= gnr )u co)e +
<%@ Page Language="VB" %>
<script runat="server">
' Insert page code here
'
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<!-- Insert content here -->
</form>
</body>
</html>
Nous n,allons pas essaDer c ),e%pl/uer ce co)e. Nous le trans!ormons )e la !aLon suvante +
<html>
<head>
<title>Dmo asp.net </title>
</head>
<body>
Il est <% =Date.Now.ToString("hh:mm:ss") %>
</body>
</html>
7e co)e c-)essus est un mlange )e 3T87 et )e co)e VB.NET. *elu-c a t plac )ans les -alses MZ ... ZN. Pour e%cuter ce
co)e1 nous utlsons l,opton OVe0&StartQ. OWe-8atr%Q lance alors le serveur We- *assn s,l n,est pas )9= lanc
?n peut accepter les valeurs par )!aut proposes )ans cette -oVte )e )alogue et chosr l,opton OStartQ. 7e serveur We- est alors
act!. OWe-8atr%Q va alors lancer le navgateur par )!aut )e la machne sur la/uelle l se trouve et )eman)er l,KB7
http+&&localhost+S#S#&)emo1.asp% +
E%emples 1SH&1'"
(l est poss-le ),utlser le serveur *assn en-)ehors )e OWe-8atr%Q. 7,e%cuta-le )u serveur se trouve )ans
MWe-8atr%NPMversonNPWe-Server.e%e o6 MWe-8atr%N est le rpertore ),nstallaton )e OWe-8atr%Q et MversonN son nR )e
verson +
?uvrons une !en4tre Dos et postonnons-nous )ans le )osser )u serveur *assn +
E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>dir
...
29/05/2003 11:00 53 248 WebServer.exe
...
7anLons OWe-Server.e%eQ sans param.tres +
E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>webserver
Nous o-tenons une !en4tre ),a)e +
7,applcaton OWe-ServerQ appele galement serveur 0e- *assn a)met tros param.tres +
+port + nR )e port )u servce 0e-. Peut-4tre /uelcon/ue. A par )!aut la valeur S#
&path + chemn phDs/ue ),un )osser )u )s/ue
&"path + )osser vrtuel assoc au )osser phDs/ue prc)ent. ?n pr4tera attenton au !at /ue la sDnta%e n,est pas
&pathTchemn mas &vpath+chemn1 contrarement = ce /ue )t le panneau ),a)e c-)essus.
PlaLons le !cher O)emo1.asp%Q )ans le )osser suvant +
E%emples 1SI&1'"
Assocons au )osser phDs/ue O)+P)ataP)evelP0e-matr%Q le )osser vrtuel O&0e-matr%Q. 7e serveur 0e- pourrat 4tre lanc )e la
!aLons suvante +
E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>webserver /port:100 /path:"d:\data\devel\webmatrix"
/vpath:"/webmatrix"
7e serveur *assn est alors act! et son c<ne apparaVt )ans la -arre )es tYches. S on )ou-le-cl/ue )essus +
?n retrouve les param.tres )e lancement )u serveur. ?n )spose galement )e la poss-lt ),arr4ter OStopQ ou )e relancer OBestartQ
le serveur 0e-. S on cl/ue sur le len OBoot KB7Q1 on o-tent la racne )e l,ar-orescence 0e- )u serveur )ans un navgateur +
Suvons le len O)emosQ +
pus le len O)emo1.asp%Q +
E%emples 1SG&1'"
?n vot )onc /ue s le )osser phDs/ue PTO)+P)ataP)evelP0e-matr%Q a t assoc au )osser vrtuel VTO&0e-matr%Q et /ue le
serveur travalle sur le port 1##1 la page 0e- O)emo1.asp%Q se trouvant phDs/uement )ans OPP)emosQ sera access-le localement va
l,KB7 Ohttp+&&localhost+1##&V&)emos&)emo1.asp%Q.
Nous avons montr1 sur ce cas partculer1 /ue le )veloppement 0e- ASP.NET pouvat 4tre !at avec un smple )teur )e te%te
pour l,crture )es pages We- et le serveur We- *assn pour tester celles-c. *ec est vra /uel/ue sot la comple%t )e l,applcaton.
7,(DE OWe-8atr%Q am.ne certanes !aclts )ans le )veloppement mas peu. Kn outl comme Vsual Stu)o.NET est -eaucoup
plus per!ormant mas c,est un pro)ut commercal.
E%emples 1SS&1'"
Ta-"e #es 2ati3res
1 L/1 ";1/1 .................................................................................................................................................................................. 3
1.1 L/1 C0-P01;4T/1 8'34/ ;PPL<C;T<04 =/"....................................................................................................................................3
1.1 L/1 >CH;4./1 8/ 8044>/1 8;41 34/ ;PPL<C;T<04 =/" ;2/C ?05-3L;<5/....................................................................................... !
1.2 40T;T<041....................................................................................................................................................................................!
1.3 P;./1 =/" 1T;T<@3/1: P;./1 =/" 8A4;-<@3/1........................................................................................................................... 5
1.3.1 PAGE STATIQUE HTML (HYPERTEXT MARKUP LANGUAGE).............................................................................................................5
1.3.2 UNE PAGE ASP (ATI!E SER!ER PAGES).......................................................................................................................................6
1.3.3 UN SRIPT PERL (PRATIAL EXTRATING AN" REP#RTING LANGUAGE).......................................................................................... 6
1.3.4 UN SRIPT PHP (HYPERTEXT PR#ESS#R).....................................................................................................................................7
1.3.5 UN SRIPT $SP ($A!A SER!ER PAGES)........................................................................................................................................... 8
1.3.6 UNE PAGE ASP.NET.................................................................................................................................................................. 9
1.3.7 #NLUSI#N................................................................................................................................................................................9
1.! 1C5<PT1 C6T> 4;2<.;T/35............................................................................................................................................................. *
1.4.1 UNE PAGE %E& A!E UN SRIPT !&SRIPT' (T) NA!IGATEUR........................................................................................................ 10
1.4.2 UNE PAGE %E& A!E UN SRIPT $A!ASRIPT' (T) NA!IGATEUR......................................................................................................11
1.5 L/1 >CH;4./1 CL</4TB1/52/35....................................................................................................................................................11
1.5.1 LE M#"*LE #SI........................................................................................................................................................................ 12
1.5.2 LE M#"*LE TP+IP...................................................................................................................................................................13
1.5.3 LE PR#T##LE HTTP................................................................................................................................................................ 15
1.5.3.1L, -./0123 4561 23-736- HTTP........................................................................................................................................... 15
1.5.3.2L, 438,143 4561 9:;31< HTTP............................................................................................................................................ 19
1.5.4 #NLUSI#N..............................................................................................................................................................................21
1.6 L/ L;4.;./ HT-L...................................................................................................................................................................21
1.6.1 UN EXEMPLE..............................................................................................................................................................................21
1.6.1.1L3 =0-86:,;-3...................................................................................................................................................................... 26
1.6.1.2>,8/ 43 2,;2;3.................................................................................................................................................................. 26
1.6.1.3>,8/ 43 2,;2;3 86:<;:;?132............................................................................................................................................... 27
1.6.1.4&06<012 -,4;0...................................................................................................................................................................... 27
1.6.1.5,232 @ 909>3-.....................................................................................................................................................................27
1.6.1.6L;2<3 4.-06:,1<3 (908A0).................................................................................................................................................... 28
1.6.1.7L;2<3 @ 2.:39<;01 61;B63.......................................................................................................................................................28
1.6.1.8L;2<3 @ 2.:39<;01 86:<;/:3.................................................................................................................................................... 28
1.6.1.9&06<01 43 <C/3 A6<<01......................................................................................................................................................... 29
1.6.1.10&06<01 43 <C/3 26A8;<...................................................................................................................................................... 29
1.6.1.11&06<01 43 <C/3 -323<..........................................................................................................................................................30
1.6.1.12>,8/ 9,9>...................................................................................................................................................................... 30
1.6.2 EN!#I D UN SER!EUR %E& PAR UN LIENT %E& "ES !ALEURS "5UN E#RMULAIRE.................................................................................. 30
1.6.2.1M.<>043 GET......................................................................................................................................................................31
1.6.2.2M.<>043 P#ST....................................................................................................................................................................35
1.' C04CL31<04................................................................................................................................................................................36
2 <4T5083CT<04 ;3 8>2/L0PP/-/4T =/" ;1P.4/T ............................................................................................ 3'
2.1 <4T5083CT<04............................................................................................................................................................................. 3'
2.2 L/1 03T<L1..................................................................................................................................................................................3)
2.3 P5/-</51 /C/-PL/1.................................................................................................................................................................... !,
2.3.1 EXEMPLE "E &ASE F !ARIANTE 1.................................................................................................................................................. 41
2.3.2 EXEMPLE "E &ASE F !ARIANTE 2.................................................................................................................................................. 41
2.3.3 EXEMPLE "E &ASE F !ARIANTE 3.................................................................................................................................................. 42
2.3.4 EXEMPLE "E &ASE F !ARIANTE 4.................................................................................................................................................. 43
2.3.5 EXEMPLE "E &ASE F !ARIANTE 5.................................................................................................................................................. 43
2.3.6 EXEMPLE "E &ASE F !ARIANTE 6.................................................................................................................................................. 45
2.3.7 #NLUSI#N..............................................................................................................................................................................46
3 L/1 ?048;-/4T;3C 83 8>2/L0PP/-/4T ;1P.4/T ............................................................................................ !'
Anne%es 1S'&1'"
3.1 L; 40T<04 8';PPL<C;T<04 =/" ;1P.4/T................................................................................................................................... !'
3.1.1 INTR#"UTI#N........................................................................................................................................................................... 47
3.1.2 #NEIGURER UNE APPLIATI#N %E&.............................................................................................................................................. 48
3.1.3 APPLIATI#N' SESSI#N' #NTEXTE............................................................................................................................................... 49
3.1.3.1L3 =;9>;3- ?:0A,:.,2,G..........................................................................................................................................................49
3.1.3.2EG38/:3 1........................................................................................................................................................................... 50
3.1.3.3U13 763 4531238A:3............................................................................................................................................................ 53
3.1.3.4EG38/:3 2........................................................................................................................................................................... 54
3.1.3.5"3 :, 1.9322;<. 43 2C19>-01;23- :32 9:;31<2 45613 ,//:;9,<;01............................................................................................. 56
3.1.3.6SC19>-01;2,<;01 432 9:;31<2.................................................................................................................................................57
3.1.3.7G32<;01 46 H3<01 43 2322;01.................................................................................................................................................60
3.2 5>C3P>5/5 L/1 <4?05-;T<041 8'34/ 5/@3DT/ CL</4T.................................................................................................................. 6)
3.2.1 LE YLE REQUITEFR)P#NSE "U LIENTFSER!EUR %E&.................................................................................................................... 68
3.2.2 R)UP)RER LES INE#RMATI#NS TRANSMISES PAR LE LIENT...............................................................................................................69
3.2.3 EXEMPLE 1................................................................................................................................................................................70
3.2.4 EXEMPLE 2................................................................................................................................................................................72
3.3 -<1/ /4 0/325/ 8'34/ ;5CH<T/CT35/ -2C............................................................................................................................... '5
3.3.1 LE #NEPT.............................................................................................................................................................................. 75
3.3.2 #NTR(LER UNE APPLIATI#N M! SANS SESSI#N.........................................................................................................................76
3.3.3 #NTR(LER UNE APPLIATI#N M! A!E SESSI#N........................................................................................................................ 78
3.! C04CL31<04................................................................................................................................................................................)1
! ./1T<04 8/ L'<4T/5?;C/ 3T<L<1;T/35 .................................................................................................................... )1
!.1 <4T5083CT<04............................................................................................................................................................................. )1
!.2 L/ L;4.;./ HT-L...................................................................................................................................................................)1
4.2.1 UN EXEMPLE..............................................................................................................................................................................81
4.2.2 #NSTRUTI#N "5UN E#RMULAIRE.................................................................................................................................................90
4.2.2.1L3 =0-86:,;-3...................................................................................................................................................................... 93
4.2.2.2>,8/ 43 2,;2;3.................................................................................................................................................................. 93
4.2.2.3>,8/ 43 2,;2;3 86:<;:;?132............................................................................................................................................... 93
4.2.2.4&06<012 -,4;0...................................................................................................................................................................... 94
4.2.2.5,232 @ 909>3-.....................................................................................................................................................................94
4.2.2.6L;2<3 4.-06:,1<3 (908A0).................................................................................................................................................... 94
4.2.2.7L;2<3 @ 2.:39<;01 61;B63.......................................................................................................................................................95
4.2.2.8L;2<3 @ 2.:39<;01 86:<;/:3.................................................................................................................................................... 95
4.2.2.9&06<01 43 <C/3 A6<<01......................................................................................................................................................... 95
4.2.2.10&06<01 43 <C/3 26A8;<...................................................................................................................................................... 96
4.2.2.11&06<01 43 <C/3 -323<..........................................................................................................................................................96
4.2.2.12>,8/ 9,9>...................................................................................................................................................................... 96
!.3 /420< E 34 1/52/35 =/" P;5 34 4;2<.;T/35 8/1 2;L/351 8'34 ?05-3L;<5/............................................................................... *'
4.3.1 M)TH#"E GET.........................................................................................................................................................................97
4.3.2 M)TH#"E P#ST.....................................................................................................................................................................102
!.! T5;<T/-/4T C6T> 1/52/35 8/1 2;L/351 8'34 ?05-3L;<5/.........................................................................................................1,!
4.4.1 PR)SENTATI#N "E L5EXEMPLE..................................................................................................................................................... 104
4.4.2 LE #NTR(LEUR "E L5APPLIATI#N..............................................................................................................................................105
4.4.3 TRAITEMENT "E L5ATI#N INIT....................................................................................................................................................106
4.4.4 TRAITEMENT "E L5ATI#N !ALI"ATI#N.........................................................................................................................................107
4.4.5 TESTS..................................................................................................................................................................................... 109
!.5 -;<4T/4<5 L'>T;T 8'34/ P;./...................................................................................................................................................112
4.5.1 MAINTENIR L5)TAT "5UNE PAGE A!E UNE SESSI#N........................................................................................................................ 112
4.5.2 LE N#U!EAU #NTR(LEUR "5APPLIATI#N....................................................................................................................................114
4.5.3 LE N#U!EAU E#RMULAIRE......................................................................................................................................................... 115
4.5.4 LA PAGE "E !ALI"ATI#N........................................................................................................................................................... 119
4.5.5 LES TESTS............................................................................................................................................................................... 120
4.5.6 #NLUSI#N............................................................................................................................................................................122
5 /C/-PL/1 .............................................................................................................................................................................. 123
5.1 /C/-PL/ 1................................................................................................................................................................................123
5.1.1 LE PR#&L*ME.......................................................................................................................................................................... 123
Anne%es 1'#&1'"
5.1.2 LA STRUTURE M! "E L5APPLIATI#N......................................................................................................................................123
5.1.3 LA LASSE M)TIER....................................................................................................................................................................124
5.1.4 LA LASSE "5A*S AUX "#NN)ES.............................................................................................................................................. 124
5.1.5 TESTS "ES LASSES M)TIER ET "ES LASSES "5A*S AUX "#NN)ES................................................................................................. 126
5.1.6 LES !UES "E L5APPLIATI#N %E&................................................................................................................................................ 128
5.1.7 LA !UE JE#RMULAIRE.ASPXK...................................................................................................................................................... 129
5.1.8 LA !UE JERREURS.ASPXK............................................................................................................................................................131
5.1.9 LES #NTR(LEURS JGL#&AL.ASAX' MAIN.ASPXK............................................................................................................................ 131
5.1.9.1L32 ,9<;012 ;1;<' 3==,93-..................................................................................................................................................... 135
5.1.9.2L5,9<;01 9,:96:................................................................................................................................................................... 135
5.1.9.3L5,9<;01 -3<06-................................................................................................................................................................... 136
5.1.10 TEST "E L5APPLIATI#N %E&.................................................................................................................................................... 136
5.1.11 UTILISATI#N "U LIENT JURLK................................................................................................................................................ 138
5.2 /C/-PL/ 2................................................................................................................................................................................1!1
5.2.1 LE PR#&L*ME.......................................................................................................................................................................... 141
5.2.2 LA S#URE "E "#NN)ES #"&................................................................................................................................................ 141
5.2.3 UNE N#U!ELLE LASSE "5A*S AUX "#NN)ES............................................................................................................................. 144
5.2.4 TESTS "E LA LASSE "5A*S AUX "#NN)ES................................................................................................................................. 147
5.2.5 LES !UES "E L5APPLIATI#N %E&................................................................................................................................................ 150
5.2.6 LES #NTR(LEURS "5APPLIATI#N JGL#&AL.ASAX' MAIN.ASPXK........................................................................................................150
5.2.7 &ILAN "ES M#"IEIATI#NS.........................................................................................................................................................151
5.2.8 TEST "E L5APPLIATI#N %E&...................................................................................................................................................... 151
5.3 /C/-PL/ 3................................................................................................................................................................................152
5.3.1 LE PR#&L*ME.......................................................................................................................................................................... 152
5.3.2 LA S#URE "E "#NN)ES #LE"&..............................................................................................................................................152
5.3.3 LA LASSE "5A*S AUX "#NN)ES.............................................................................................................................................. 152
5.3.4 TESTS "E LA LASSE "5A*S AUX "#NN)ES................................................................................................................................. 156
5.3.5 LES !UES "E L5APPLIATI#N %E&................................................................................................................................................ 158
5.3.6 LES #NTR(LEURS "5APPLIATI#N JGL#&AL.ASAX' MAIN.ASPXK........................................................................................................158
5.3.7 &ILAN "ES M#"IEIATI#NS.........................................................................................................................................................159
5.3.8 TEST "E L5APPLIATI#N %E&...................................................................................................................................................... 159
5.! /C/-PL/ !................................................................................................................................................................................15*
5.4.1 LE PR#&L*ME.......................................................................................................................................................................... 159
5.4.2 LA STRUTURE M! "E L5APPLIATI#N......................................................................................................................................160
5.4.3 LES !UES "E L5APPLIATI#N %E&................................................................................................................................................ 160
5.4.4 LES #NTR(LEURS JGL#&AL.ASAX' MAIN.ASPXK............................................................................................................................ 163
5.4.5 &ILAN "ES M#"IEIATI#NS.........................................................................................................................................................165
5.4.6 TEST "E L5APPLIATI#N %E&...................................................................................................................................................... 165
5.5 C04CL31<04..............................................................................................................................................................................165
6 ;44/C/ B L/1 03T<L1 83 8>2/L0PP/-/4T =/" ................................................................................................. 16'
6.1 1/52/351 =/": 4;2<.;T/351: L;4.;./1 8/ 1C5<PT1................................................................................................................ 16'
6.2 0F T5032/5 L/1 03T<L1............................................................................................................................................................ 16'
6.3 /;1APHP.................................................................................................................................................................................16)
6.3.1 #NEIGURATI#N "E L5INTERPR)TEUR PHP................................................................................................................................... 169
6.3.2 A"MINISTRATI#N APAHE......................................................................................................................................................... 170
6.3.3 LE EIHIER JHTP".#NEK "E #NEIGURATI#N "5APAHE HTP".#NE................................................................................................. 171
6.3.4 A"MINISTRATI#N "E MYSQL A!E PHPMYA"MIN..................................................................................................................... 172
6.! PHP.........................................................................................................................................................................................1'3
6.5 P/5L...................................................................................................................................................................................... 1'3
6.6 2"1C5<PT: G;2;1C5<PT: P/5L1C5<PT........................................................................................................................................... 1'!
6.' G;2;...................................................................................................................................................................................... 1'6
6.) 1/52/35 ;P;CH/...................................................................................................................................................................... 1''
6.8.1 #NEIGURATI#N....................................................................................................................................................................... 177
6.8.2 LIEN PHP F APAHE................................................................................................................................................................177
6.8.3 LIEN PERLFAPAHE...........................................................................................................................................................178
6.* L/ 1/52/35 P=1..................................................................................................................................................................... 1'*
6.9.1 INSTALLATI#N.......................................................................................................................................................................... 179
6.9.2 PREMIERS TESTS....................................................................................................................................................................... 179
6.9.3 LIEN PHP F P%S................................................................................................................................................................... 179
6.1, T0-C;T H 1/52L/T1 G;2; /T P;./1 G1P $G;2; 1/52/5 P;./1&............................................................................................... 1),
6.10.1 INSTALLATI#N........................................................................................................................................................................ 180
Anne%es 1'1&1'"
6.10.2 ")MARRAGE+ARRIT "U SER!EUR %E& T#MAT........................................................................................................................ 180
6.11 G"3<L8/5.................................................................................................................................................................................1)1
6.12 L/ 1/52/35 =/" C;11<4<....................................................................................................................................................... 1)3
Anne%es 1'"&1'"

Vous aimerez peut-être aussi