Vous êtes sur la page 1sur 26

Jsp Exercice1 1. crire un programme qui crit 500 fois Je dois faire des sauvegardes rgulires de mes fichiers..

2. crire un programme JSP qui affiche tous les nombres impairs entre 0 et 15000, par ordre croissant : 1 3 5 7 ... 14995 14997 14999. 3. crire un programme qui calcule 20! 4. Afficher la table de multiplication complte de {1,...,14} par {1,...,14}. 5. Afficher un cadre 10x10. a. avec <PRE>. b. avec un tableau. Correction Tous ces exercices supposent l'existence du fichier commun.jsp suivant:
<%! String entete(String titre) { return "<HTML><HEAD>\n<TITLE>Premiers exercices de JSP : " +titre +"</TITLE>\n</HEAD><BODY>\n" +"<H1>Premiers exercices de JSP&nbsp;: "+titre+"</H1>"; } String pied() { return "</BODY></HTML>"; } %> <\%@ include file="commun.jsp"\%> <\%=entete("1er exercice")\%> <\% for (int i=1;i<=500;i++) { out.println(i +". Je dois faire des sauvegardes rgulires de mes fichiers<BR>"); } \%> <\%=pied()\%> <%@ include file="commun.jsp"%> <%=entete("2me exercice")%> <% for (int i=1;i<15000;i+=2) { out.println(i); } %> <%=pied()%> <%@ include file="commun.jsp"%> <%=entete("3me exercice")%> <% int n=20; long f=1; for (int i=1;i<=n;f*=i,i++) ; out.println (n+"!="+f);

1. 2. 3. 4. 5. 6. 7. 8. 9.

10.
11. 12. 13. 14. 15. 16. 17. 18.

19.
20. 21. 22. 23. 24. 25. 26.

27. %> 28. <%=pied()%>

29.

30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.

44.
45. 46. 47. 48. 49.

<%@ include file="commun.jsp"%> <%=entete("4me exercice")%> <%!String couleur="#DDDDDD"; int MAX=14;%> <TABLE BORDER><TR BGCOLOR="<%=couleur%>"> <TD></TD> <% for (int i=1;i<=MAX;i++) { out.println("\t<TH>"+i+"</TH>"); } out.println("</TR>"); for (int i=1;i<=MAX;i++) { out.println("<TR>\n\t<TH BGCOLOR=\""+couleur+"\">"+i+"</TH>"); for (int j=1;j<=MAX;j++) { out.println("\t<TD ALIGN=\"center\">"+(i*j)+"</TD>"); } out.println("</TR>"); } %> </TABLE> <%=pied()%>

50. 51. Cadre 10x10... a. avec <PRE>:


b. c. d. e. f. g. h. <%@ include file="commun.jsp"%> <%=entete("5me exercice (1re version)")%> <PRE><TT> <% String k="*"; int MAX=10; for (int i=1;i<=MAX;i++) { out.print(k); } out.println(""); for (int i=2;i<MAX;i++) { out.print(k); for (int j=2;j<MAX;j++) { out.print(" "); } out.println(k); } for (int i=1;i<=MAX;i++) { out.print(k); } %> </TT></PRE> <%=pied()%>

i.
j. k. l.

m.
n.

o.
p. q. r. s.

t.
u. v. w. x.

y. avec un tableau:

z. <%@ include file="commun.jsp"%> aa. <%=entete("5me exercice (2me version)")%> bb. <BLOCKQUOTE><TABLE BORDER><TR> cc. <% dd. String k="*"; ee. int MAX=10; ff. for (int i=1;i<=MAX;i++) { gg. out.println("\t<TD>"+k+"</TD>"); hh. }

ii. jj.

kk. ll. mm.


nn. oo. pp. qq. rr.

ss.
tt. uu. vv. ww. xx.

out.println("</TR>"); for (int i=2;i<MAX;i++) { out.println("<TR>\n\t<TD>"+k+"</TD>"); for (int j=2;j<MAX;j++) { out.println("\t<TD></TD>"); } out.println("\t<TD>"+k+"</TD>\n</TR>"); } out.println("<TR>"); for (int i=1;i<=MAX;i++) { out.println("\t<TD>"+k+"</TD>"); } %> </TR> </TABLE></BLOCKQUOTE> <%=pied()%>

Exercice 2

JSP: exercices sur les formulaires


1. crire un formulaire qui demande le nom et l'ge de l'utilisateur. Le bouton submit de ce formulaire provoquera l'affichage d'une page qui saluera l'utilisateur avec cette phrase : Bonjour machin, vous avez xx ans... (avec les bonnes valeurs, bien entendu): 2. Deux vacanciers ont abandonn Montpellier leur bb de 9 mois, qui n'avait pas t sage. Quelle ne fut pas leur surprise quand 6 mois plus tard, rentrs chez eux Lille, ils ont vu arriver leur enfant qui avait fait quatre pattes le trajet Montpellier-Lille par l'autoroute. crire un formulaire qui permet de saisir la distance parcourue par le bb, le nombre d'heures o il marchait par jour, et le nombre de jours qu'il a passs sur la route. Le formulaire affichera alors la vitesse du bb: 3. crire un formulaire qui demande le nom et le sexe de l'utilisateur (M ou Mme). Ce formulaire appelle une page qui affichera Bonjour monsieur Truc ou Bonjour madame Bidule suivant le cas (avec le vrai nom de la personne, bien entendu!): 4. crire un formulaire qui demande deux nombres : une base et une limite. Ce formulaire appelle une page qui affichera toutes les puissances de la base infrieures la limite. Par exemple si on donne 2 comme base et 300 comme limite on devra obtenir la suite 2, 4, 8, 16, 32, 64, 128, 256: 5. crire un formulaire calculatrice : 2 cases pour la saisie des oprandes, un groupe de 4 cases cocher (ou une liste droulante) pour le choix de l'opration, et affichage du rsultat de l'opration: 6. Un permis de chasse points remplace dsormais le permis de chasse traditionnel. Chaque chasseur possde au dpart un capital de 100 points. S'il tue une poule il perd 1 point, 3 points pour un chien, 5 points pour une vache et 10 points s'il tue son meilleur ami. Le permis cote 200 euros. crire un formulaire qui permet de saisir la liste des victimes du chasseur et calcule le prix payer pour les permis supplmentaires ncessaires:

Correction
1. 2. 3. 4. 5. 6. 7.

<%@ include file="commun.jsp"%> <%=entete("6me exercice")%> <B>Le formulaire&nbsp;:</B><BR> <FORM METHOD="get"> <TABLE><TR> <TD ALIGN="right">Votre nom</TD> <TD><INPUT NAME="nom"></TD> 8. </TR><TR> 9. <TD ALIGN="right">Votre ge</TD> 10. <TD><INPUT NAME="age"></TD> 11. </TR><TR> 12. <TD ALIGN="center" COLSPAN="2"><INPUT TYPE="submit" VALUE="envoyer"> 13. <INPUT TYPE="reset" VALUE="vider"></TD> 14. </TR></TABLE> 15. </FORM> 16. <% 17. String nom=request.getParameter("nom"); 18. String age=request.getParameter("age"); 19. if (nom!=null) { 20. %> 21. <P><B>Le traitement&nbsp;:</B><BR> 22. Bonjour <%=nom%>, vous avez <%=age%> ans. 23. <% 24. } 25. %> 26. <%=pied()%>

27.

28. 29. 30. 31. 32. 33. 34. 35.

<%@ include file="commun.jsp"%> <%=entete("7me exercice")%> <B>Le formulaire&nbsp;:</B><BR>

<FORM METHOD="get"> <TABLE><TR> <TD ALIGN="right">Distance</TD> <TD><INPUT NAME="distance"></TD> 36. </TR><TR> 37. <TD ALIGN="right">Heures/Jour</TD> 38. <TD><INPUT NAME="heures"></TD> 39. </TR><TR> 40. <TD ALIGN="right">Jours</TD> 41. <TD><INPUT NAME="jours"></TD> 42. </TR><TR> 43. <TD ALIGN="center" COLSPAN="2"><INPUT TYPE="submit" VALUE="envoyer"> 44. <INPUT TYPE="reset" VALUE="vider"></TD> 45. </TR></TABLE> 46. </FORM> 47. <% 48. String distanceS=request.getParameter("distance"); 49. String heuresS=request.getParameter("heures"); 50. String joursS=request.getParameter("jours"); 51. 52. if (distanceS!=null) { 53. int distance=Integer.parseInt("0"+distanceS); 54. int heures=Integer.parseInt("0"+heuresS); 55. int jours=Integer.parseInt("0"+joursS); 56. %>

57. <P><B>Le traitement&nbsp;:</B><BR> 58. Le bb a parcouru <%=distance%> km, raison de <%=heures%> heures par jour, 59. pendant <%=jours%> jours.<BR> 60. Sa vitesse est donc de <%=1.0*distance/heures/jours%> km/h. 61. <% 62. } 63. %> 64. <%=pied()%>

65.
66. 67. 68. 69. 70. 71. 72. <%@ include file="commun.jsp"%> <%=entete("8me exercice")%> <B>Le formulaire&nbsp;:</B><BR> <FORM METHOD="get"> <TABLE><TR VALIGN="top"> <TD ALIGN="right">Sexe</TD> <TD><INPUT NAME="sexe" VALUE="M" TYPE="radio" CHECKED>Monsieur<BR> 73. <INPUT NAME="sexe" VALUE="Mme" TYPE="radio">Madame</TD> 74. </TR><TR> 75. <TD ALIGN="right">Nom</TD> 76. <TD><INPUT NAME="nom"></TD> 77. </TR><TR> 78. <TD ALIGN="center" COLSPAN="2"><INPUT TYPE="submit" VALUE="envoyer"> 79. <INPUT TYPE="reset" VALUE="vider"></TD> 80. </TR></TABLE> 81. </FORM> 82. <% 83. String nom=request.getParameter("nom"); 84. String sexe=request.getParameter("sexe"); 85. if (sexe!=null) { 86. %> 87. <P><B>Le traitement&nbsp;:</B><BR> 88. Bonjour <%=sexe%> <%=nom%>. 89. <% 90. } 91. %> 92. <%=pied()%>

93.
94. 95. 96. 97. 98. 99. 100. 101. <%@ include file="commun.jsp"%> <%=entete("9me exercice")%> <B>Le formulaire&nbsp;:</B><BR>

<FORM METHOD="get"> <TABLE><TR VALIGN="top"> <TD ALIGN="right">Base</TD> <TD><INPUT NAME="base"></TD> 102. </TR><TR> 103. <TD ALIGN="right">Limite</TD> 104. <TD><INPUT NAME="limite"></TD> 105. </TR><TR> 106. <TD ALIGN="center" COLSPAN="2"><INPUT TYPE="submit" VALUE="envoyer"> 107. <INPUT TYPE="reset" VALUE="vider"></TD> 108. </TR></TABLE> 109. </FORM> 110. <% 111. String baseStr=request.getParameter("base");

112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133.

String limiteStr=request.getParameter("limite"); if (baseStr!=null) { %> <P><B>Le traitement&nbsp;:</B><BR> <% int base=Integer.parseInt("0"+baseStr); int limite=Integer.parseInt("0"+limiteStr); if (base<=1) { %> <B><FONT COLOR="red">Calcul impossible, la base doit tre suprieure 1.</FONT></B> <% } else { int produit=1; while (produit<=limite) { out.println(produit+" "); produit*=base; } } } %> <%=pied()%> <%@ include file="commun.jsp"%> <%=entete("10me exercice")%> <B>Le formulaire&nbsp;:</B><BR> Avec liste droulante&nbsp;:<BR> <FORM METHOD="get"> <CENTER> <INPUT NAME="a" SIZE="5"> <SELECT NAME="par"> <OPTION VALUE="+">+ <OPTION VALUE="-"><OPTION VALUE="*">* <OPTION VALUE="/">/ </SELECT> <INPUT NAME="b" SIZE="5"> <BR> <INPUT TYPE="submit" VALUE="envoyer"> <INPUT TYPE="reset" VALUE="vider"> </CENTER> </FORM> <P> Avec boutons radios&nbsp;:<BR> <FORM METHOD="get"> <CENTER> <TABLE><TR> <TD> <INPUT NAME="a" SIZE="5"> </TD><TD> <INPUT TYPE="radio" NAME="par" VALUE="+" CHECKED>+<BR> <INPUT TYPE="radio" NAME="par" VALUE="-">-<BR> <INPUT TYPE="radio" NAME="par" VALUE="*">*<BR> <INPUT TYPE="radio" NAME="par" VALUE="/">/ </TD><TD> <INPUT NAME="b" SIZE="5"> </TD> </TR><TR> <TD COLSPAN="3" ALIGN="center"> <INPUT TYPE="submit" VALUE="envoyer">

134.

135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151.

152.
153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165.

166.
167. 168. 169. 170. 171.

172.

173.
174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204.

<INPUT TYPE="reset" VALUE="vider"> </TD> </TABLE></CENTER> </FORM> <% String aStr=request.getParameter("a"); String bStr=request.getParameter("b"); String par=request.getParameter("par"); if (par!=null) { %> <P><B>Le traitement&nbsp;</><BR> <% int a=Integer.parseInt("0"+aStr); int b=Integer.parseInt("0"+bStr); %> <CENTER>Le rsultat du calcul prcdent est&nbsp;: <TT><%=a%><%=par%><%=b%>=<% if (par.equals("+")) { out.println(a+b); } else if (par.equals("-")) { out.println(a-b); } else if (par.equals("*")) { out.println(a*b); } else if (b==0) { out.println("Impossible.."); } else { out.println(a/b); } %></TT></CENTER> <% } %> <%=pied()%>

205.

206. 207. 208. 209. 210. 211. 212.

<%@ include file="commun.jsp"%> <%=entete("11me exercice")%> <B>Le formulaire&nbsp;:</B><BR> <FORM METHOD="get"> <TABLE><TR> <TD ALIGN="right">Poules</TD> <TD><INPUT NAME="poules"></TD> 213. </TR><TR> 214. <TD ALIGN="right">Chiens</TD> 215. <TD><INPUT NAME="chiens"></TD> 216. </TR><TR> 217. <TD ALIGN="right">Vaches</TD> 218. <TD><INPUT NAME="vaches"></TD> 219. </TR><TR> 220. <TD ALIGN="right">Amis</TD> 221. <TD><INPUT NAME="amis"></TD> 222. </TR><TR> 223. <TD ALIGN="center" COLSPAN="2"><INPUT TYPE="submit" VALUE="envoyer"> 224. <INPUT TYPE="reset" VALUE="vider"></TD> 225. </TR></TABLE></FORM> 226. <% 227. String vachesStr=request.getParameter("vaches"); 228. String poulesStr=request.getParameter("poules"); 229. String amisStr=request.getParameter("amis");

230. 231. 232. 233. 234. 235. 236. 237. 238.

String chiensStr=request.getParameter("chiens"); if ((vachesStr!=null) &&(poulesStr!=null) &&(amisStr!=null) &&(chiensStr!=null)) { %> <P><B>Le traitement&nbsp;:</B><BR> <% int vaches=Integer.parseInt("0"+vachesStr); 239. int poules=Integer.parseInt("0"+poulesStr); 240. int amis=Integer.parseInt("0"+amisStr); 241. int chiens=Integer.parseInt("0"+chiensStr); 242. int unePoule=1; 243. int unChien=3; 244. int uneVache=5; 245. int unAmi=10; 246. int prix=200; 247. int points=100; 248. int perdus=uneVache*vaches+unAmi*amis+unePoule*poules+unChien*chiens; 249. %> 250. Vous avez tu&nbsp;: 251. <UL> 252. <LI><%=poules%> poule<%=(poules>1?"s":"")%>, 253. <LI><%=chiens%> chien<%=(chiens>1?"s":"")%>, 254. <LI><%=vaches%> vache<%=(vaches>1?"s":"")%>, 255. <LI><%=amis%> ami<%=(amis>1?"s":"")%>. 256. </UL> 257. Vous avez perdus&nbsp;: 258. <%=poules%>*<%=unePoule%>+<%=chiens%>*<%=unChien%>+<%=vaches%>*< %=uneVache%> 259. +<%=amis%>*<%=unAmi%>=<%=perdus%> point<%=(perdus>1?"s":"")%>.<BR> 260. <% 261. if (perdus<points) { 262. %> 263. Votre permis est encore valable. 264. <% 265. } else { 266. %> 267. Vous devrez payer <%=perdus/points%> permis, c'est--dire 268. <%=(perdus/points)*prix%> euros. 269. <% 270. } 271. } 272. %> 273. <%=pied()%>

274. Exercice 3 (jsp et servlet) l'application sera compose : d'une page JSP form.jsp contenant un formulaire de saisie d'un login et d'un mot de passe, d'une page JSP hello.jsp affichant les donnes saisies dans le formulaire, d'une Servlet Login.java charge de traiter les donnes envoyes par le formulaire et de vrifier leur validit : si les deux champs ont t saisis, elle renvoie sur la page hello.jsp et affiche les donnes saisies ; sinon, elle renvoie sur le formulaire en affichant un message d'erreur.

Correction Cration du projet HelloWorld V2


Comme nous l'avions fait prcdemment pour le projet HelloWorld V1, nous allons crer un projet de type Dynamic Web Project, li au serveur Tomcat local que nous utilisions jusqu' prsent. L'arborescence vers laquelle nous tendons est celle-ci :

La page form.jsp
Commenons par crer un fichier form.jsp la racine de WebContent et par y insrer le code suivant :

Formulaire HTML

<form method="post"> Login : <input name="login" type="text" /> Mot de passe : <input name="password" type="password" /> <input name="Valider" type="submit" /> </form>

La page affichera donc un formulaire (ligne 9) comportant un champ texte (ligne 10) et un champ de type mot de passe (ligne 11), ainsi qu'un bouton de validation (ligne 12). Notons qu' la validation, le formulaire enverra une requte HTTP de type POST l'URL /login (ligne 9).

La Servlet Login
Crons maintenant la Servlet qui recevra les donnes de ce formulaire. Nous avons dcid que ce dernier enverra une requte de type POST, nous devons donc implmenter une mthode doPost dans la Servlet. Cette mthode devra: 1. 2. 3. Rcuprer les donnes saisies dans le formulaire Si les deux champs n'ont pas t remplis, renvoyer l'utilisateur vers le formulaire Sinon, renvoyer vers la page hello.jsp

Ce qui correspond la structure de code suivante :

package fr.mistra.helloworld.servlets; import import import import import java.io.IOException; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

public class Login extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Rcuprer les donnes reues du formulaire String loginEntered = (String) request.getParameter("login"); String passwordEntered = (String) request.getParameter("password"); // Si l'un des champs est vide if ("".equals(loginEntered) || "".equals(passwordEntered)) { request.setAttribute("erreur", "Vous devez remplir les deux champs."); // Redirection vers le formulaire form.jsp getServletContext().getRequestDispatcher("/form.jsp") .forward(request, response); } // Sinon else { request.setAttribute("login", loginEntered); request.setAttribute("password", passwordEntered); // Redirection vers la page hello.jsp getServletContext().getRequestDispatcher("/hello.jsp") .forward(request, response); }

} }

Aux lignes 17 et 18, notons que les attributs de la mthode request.getParameter() correspondent aux valeurs des attributs "name" dans les balises input de form.jsp:

<input name="login" type="text" /> <input name="password" type="password" />


Lors de la validation du formulaire, ils ont en effet t envoys en tant que paramtres de la requte HTTP et sont donc ainsi rcuprables dans la Servlet. Dans le cas o l'un des champs du formulaire, n'a pas t rempli (ligne 21), nous crons un attribut la requte, dont le nom sera "erreur" et la valeur un objet String contenant le texte "Vous devez remplir les deux champs.". De cette manire, la requte HTTP contient dsormais les deux paramtres envoys en POST par le formulaire et ce nouvel attribut, que nous utiliserons pour afficher l'erreur de saisie grce l'appel suivant:

request.getAttribute("erreur");<
Nous redirigeons ensuite vers le formulaire form.jsp (qui aura donc maintenant accs l'attribut erreur et pourra afficher le message d'erreur qui n'existait pas auparavant) grce l'appel suivant :

getServletContext().getRequestDispatcher("/form.jsp").forward(request, response);

Prendre en compte l'attribut "erreur" dans form.jsp


Nous avons fait en sorte que la Servlet redirige vers la page form.jsp en ayant pralablement ajout un attribut "erreur". Toutefois, dans la premire version du fichier form.jsp, cet attribut

n'est pas utilis. Nous allons donc modifier le code pour ajouter l'affichage du message d'erreur si celui-ci existe:

Formulaire HTML <% // Rcupration du message d'erreur String erreur = (String) request.getAttribute("erreur"); // Affichage du message s'il existe if (erreur != null) { %> <strong>Erreur : </strong> <% } %> <form method="post"> Login : <input name="login" type="text" /> Mot de passe : <input name="password" type="password" /> <input name="Valider" type="submit" /> </form>

Comme nous l'avions dcouvert dans le chapitre prcdent, nous insrons aux lignes 7 15 du code Java dans la page JSP:

ligne 7 : dbut du fragment de code Java, appel scriptlet ligne 9 : rcupration de l'objet correspondant l'attribut "erreur" ; nous savons (puisque nous avons crit le code de la Servlet...) que c'est un objet String et nous le stockons donc dans une variable String. ligne 11 : on vrifie que le message d'erreur existe. En effet, l'excution de l'application, nous chargerons une premire fois la page form.jsp, sans passer par la Servlet : l'attribut "erreur" n'existera pas encore ligne 12 : la balise de scriptlet vient d'tre ferme la fin de la ligne 11 ; nous pouvons donc insrer directement code HTLM en crivant Erreur : . De plus, la syntaxe permet d'afficher une chaine de caractres correspondant la valeur de l'expression. Ici, nous affichons donc la valeur de la variable String appele erreur. lignes 14-15 : ouverture d'une nouvelle scriptlet avec <% pour fermer l'accolade du if de la ligne 11

La page hello.jsp

Bonjour ! <% String login = (String) request.getAttribute("login"); String password = (String) request.getAttribute("password"); %> <h2>Bonjour <hr /> Vous avez tap le mot de passe : !</h2>

Le fichier de configuration web.xml


http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> HelloWorld V2 form.jsp

Login fr.mistra.helloworld.servlets.Login

Login /login

Servlet

Sacrifions la tradition, et crivons de suite une premire servlet. Il sagira dune servlet de type HTTP. Elle pourra tre appele dun navigateur web, et renverra une page sur laquelle sera juste crit Bonjour le monde . Linstallation de cette premire servlet peut paratre complexe, tout simplement parce que nous sommes oblig de crer une application web pour la faire fonctionner, et que ce processus est assez lourd.

2.1. Le code

Une servlet est une classe Java qui doit tendre la classe HttpServlet. Elle comporte trois mthodes fondamentales :

une mthode init(), qui est appele une fois que Tomcat a instanci cette servlet, la charge en
mmoire. Cette mthode est appele avant tout traitement dune requte par la servlet. Il existe une mthode quivalente, destroy(), appele avant la destruction de cette servlet. Surcharger cette mthode est facultatif.

une mthode doGet() et une mthode doPost(). Ces deux mthodes sont celles qui font le
travail . La premire est appele lors dune requte de type GET, et la seconde lors dune requte de type POST. Elles reoivent en paramtres deux objets qui correspondent au flux de sortie et au flux dentre vers le navigateur client. Les informations envoyes par le navigateur sont sur le flux dentre, tout ce qui est crit sur le flux de sortie sera reu par lui. Les types de ces flux sont

HttpServletRequest et HttpServletResponse. Ces mthodes sont en fait appeles par la


mthode service() de la classe Servlet, que lon a pas surcharger. Notons que sur notre exemple, la mthode doPost() appelle la mthode doGet(), ce qui est parfaitement lgal. Exemple 17. Une premire servlet

package org.galilee.servlet ; import java.io.* ; import java.text.* ; import java.util.* ; import javax.servlet.* ; import javax.servlet.http.* ; public Bonjour extends HttpServlet { public response) throws ServletException, IOException { response.setContentType("text/html") ; PrintWriter out = response.getWriter() ; out.println("<html>") ; out.println("<head>") ; out.println("<title>Bonjour le monde !</title>") ; out.println("</head>") ; out.println("<body>") ; out.println("<h1>Bonjour le monde !</h1>") ; void doGet(HttpServletRequest request, HttpServletResponse

out.println("</body>") ; out.println("</html>") ; } public response) throws ServletException, IOException { doGet(request, response) ; } } void doPost(HttpServletRequest request, HttpServletResponse

2.2. Cration de l'application web


Pour que cette servlet fonctionne dans Tomcat, il nous faut crer un fichier WAR (web archive). Le format d'un tel fichier est dfini dans les spcifications de l'API Servlet. Un fichier WAR est un fichier JAR standard, dans lequel doit se trouver un rpertoire WEB-INF. Ce rpertoire WEB-INF doit contenir un fichier de configuration web.xml dont nous allons voir un exemple. Il peut enfin contenir :

des fichiers JSP, HTML, ou tout autre fichier statique qui sera servi via les bonnes URL ; un rpertoire lib, qui contient des fichiers JAR. Les classes de ces fichiers sont charges par le class
loader propre cette application web ;

un rpertoire classes contenant une hirarchie de classes Java. Ces classes sont charges par le class
loader de cette application web. En cas de collision avec des classes contenues dans un JAR, c'est la classe dclare dans ce rpertoire qui a la priorit. Voici donc la structure de rpertoire de notre fichier WAR.

Figure 5. Structure d'une premire archive WAR

Voici enfin le contenu du fichier web.xml. Exemple 18. Fichier web.xml

<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.5//EN" "http://java.sun.com/dtd/web-app_2_5.dtd"> <web-app> <servlet> <servlet-name>Hello</servlet-name> <servlet-class>org.galilee.servlet.Bonjour</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/bonjour</url-pattern> </servlet-mapping> </web-app>

Ce fichier est un fichier XML, dont l'lment racine est web-app. On trouve deux lments fils : servlet et

servlet-mapping.
Llment servlet permet de dclarer des servlets, et de les associer des classes Java. Dans notre cas, nous crons une servlet appele Hello, associe la classe Java org.galilee.servlet.Bonjour, qui doit donc se trouver dans un fichier Bonjour.class et dans la bonne structure de rpertoire. Llment servlet-mapping permet dassocier une servlet une URL. Cette dclaration doit bien sr tre cohrente avec ce qui a t dclar dans Tomcat (et ventuellement Apache). Dans notre exemple, notre servlet est associe lURL

/bonjour.
Ces deux lments sont en relation l'un avec l'autre grce au fait qu'ils ont mme valeur pour le sous-lment servlet-

name. Notons enfin que deux servlets diffrentes peuvent se rfrer la mme classe Java. Nous verrons lintrt de ce
genre de choses dans la suite.

2.3. Dploiement dans Tomcat


Il ne reste plus qu compiler notre classe Java, la copier dans le bon rpertoire cest dire WEB-INF/classes, dmarrer Tomcat, et linvoquer dans un navigateur par lURL http://localhost/bonjour/bonjour .

Ajouter d'autres servlets cette application web est ensuite trs simple : il suffit dajouter les deux lments servlet et

servlet-mapping dans le fichier web.xml, et la classe Java dans le bon rpertoire.

JSP

2.1. Une premire JSP statique


crivons une premire page JSP simple. Exemple 31. Une premire page JSP simple

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Une premire JSP</title> </head> <body> <h1>Bonjour le monde !</h1> </body> </html>

Cette page peut tre sauvegarde dans un fichier bonjour.jsp, et range la racine de notre application web. On y accde par l'URL de cette application web, laquelle il suffit d'ajouter le nom du fichier : bonjour.jsp. Nous avons donc partiellement rsolu notre problme : nous n'avons plus crire du code HTML dans du code Java pour produire nos pages web. Cela dit, les JSP proposent de nombreuses fonctionnalits supplmentaires.

2.2. Une premire JSP dynamique


Incluons le code suivant notre page. Exemple 32. Une premire JSP dynamique

<p>Bonjour, il est <%=new java.util.Date()%></p>

On observe cette fois-ci un affichage qui ressemble a :

Il est Thu Oct 28 14:00:58 CEST 2010


Il est possible d'inclure des variables Java dans une page JSP, en les plaant entre les marqueurs <%= et %>. Ce code Java est alors invoqu, et le rsultat plac dans la rponse. Voyons un dernier exemple, qui nous permet d'crire trois fois "Bonjour le monde" sans effort. Exemple 33. Une deuxime JSP dynamique

<p>Trois fois <br> <% for (int i = 0 ; i < 3 ; i++) { %> Bonjour le monde ! <br> <% } %> sans effort !</p>

Le tag ouvrant utilis ici est lgrement diffrent : <%. Il indique que la suite est du code Java, qui doit tre excut en l'tat. D'o l'affichage :

Trois fois Bonjour le monde ! Bonjour le monde ! Bonjour le monde ! sans effort !

2.3. Fonctionnement interne des JSP


Comment tout ceci fonctionne-t-il ? Si l'on explore l'arborescence de Tomcat (ou d'un projet Eclipse ou Netbeans, si l'on travaille avec l'un de ces deux IDE), on se rend compte de la prsence de deux fichiers : index_jsp.java et

index_jsp.class. Dans une installation standard de Tomcat, ces deux fichiers sont dans la sous-arborescence du
rpertoire work. Le premier fichier index_jsp.java contient le code d'une servlet classique, dans laquelle on trouve le code suivant : Exemple 34. Gnration d'une servlet partir d'une JSP

out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n");

out.write(" \"http://www.w3.org/TR/html4/loose.dtd\">\n"); out.write("\n"); out.write("<html>\n"); out.write(" <head>\n"); out.write(" 8\">\n"); out.write(" <title>JSP Page</title>\n"); out.write(" </head>\n"); out.write(" <body>\n"); out.write(" <h1>Bonjour le monde !</h1>\n"); out.write(" </body>\n"); out.write("</html>\n"); <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-

Pour chaque page JSP, Tomcat gnre automatiquement une servlet, dans laquelle se trouve le code que l'on aurait eu crire pour gnrer le contenu HTML de notre page. Cette servlet est ensuite compile, et publie sous le nom de notre page JSP. C'est bien cette servlet qui nous rpond quand on invoque l'URL "index.jsp". Chaque modification de notre page JSP est dtecte par Tomcat, qui reprend la gnration de ce code Java et sa compilation. Ce traitement est donc un surcot sur la premire requte. Observons le nouveau code gnr lorsque nous avons ajout <%= new java.util.Date()%> dans notre JSP. On ne reproduit ici que le contenu de la balise <h1> Exemple 35. Modification du code gnr - 1

out.write("<h1>Bonjour le monde !"); out.print(new java.util.Date() ); out.write("</h1>\n");

On constate bien que le contenu de la balise <%= ... %> a t ajout en paramtre des appels out.write(). Observons enfin la modification du code gnr lorsque nous avons ajout notre boucle. Exemple 36. Modification du code gnr - 2

out.write("<p>Trois fois <br>\n"); for (int i = 0 ; i < 3 ; i++) { out.write("\tBonjour le monde ! <br>\n");

} out.write("sans effort</p>\n");

Cette fois, le contenu du code Java plac dans les balises <% ... %> a t recopi sans modification dans le code de la servlet. C'est ainsi que ces deux balises fonctionnent.

Servlet et JSP

On se propose dans cette partie de crer un projet Web dans Netbeans, permettant de mettre en place une premire servlet et un premier formulaire. On suppose que l'on a cr un projet web sous Netbeans, avec les fichiers suivants.

Figure 6. Organisation du projet Netbeans

Ce projet est compos d'une premire page JSP : register.jsp, qui contient un formulaire d'enregistrement. Voici le code de cette page. Exemple 59. Page register.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Registration</title> </head> <body> <p>Registration form</p> <form action="/cours-servlet/register" method="post"> <p>Nom : <input type="text" name="nom" /></p> <p>Prnom : <input type="text" name="prenom" /></p> <p><input type="submit" value="valider" /></p> </form>

</body> </html>

On veillera mettre jour le champ action de ce formulaire, si ncessaire. Ce formulaire envoie ses donnes la servlet RegistrationServlet, dont voici le code. Exemple 60. Servlet RegistrationServlet

protected response)

void processRequest(HttpServletRequest request, HttpServletResponse

throws ServletException, IOException { // permet de dcoder les paramtres en UTF-8 request.setCharacterEncoding("UTF-8") ; RequestDispatcher rd = request.getRequestDispatcher("validate.jsp") ; String nom = request.getParameter("nom") ; String prenom = request.getParameter("prenom") ;

request.setAttribute("nom", nom) ; request.setAttribute("prenom", prenom) ; rd.forward(request, response) ; }

Cette servlet dcode les paramtres du formulaire et les recopie en tant qu'attributs de la requte. Puis elle redirige la requte vers la page validate.jsp. Voyons enfin le code de la page validate.jsp. Exemple 61. Page validate.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <p>Registering <%= request.getParameter("nom")%> ; <%= request.getParameter("prenom") %></p> <p>Registering <%= request.getAttribute("nom")%> ; <%= request.getAttribute("prenom") %></p> </body> </html>

On dclarera enfin la servlet RegistrationServlet dans le descripteur web.xml, sous un nom et une URL choisies. On vrifiera que l'action du formulaire pointe bien vers cette servlet

Beans

4.1. Introduction

Afin de simplifier l'utilisation des scriptlets, l'API JSP introduit la notion de bean attach une page. Un bean attach une page se comporte comme une variable que l'on peut utiliser en tout endroit de cette page. Ce bean est attach un contexte, qui peut tre la page, la requte, la session ou l'application. Enfin ce bean peut tre un bean existant, ou cr dans le cadre mme de la page. Rappelons qu'un bean est un objet Java simple, qui doit possder les proprits suivantes :

il doit implmenter Serializable ; il doit possder un constructeur vide, soit celui qui existe par dfaut, soit dclar explicitement ; il doit exposer des proprits, sous forme de paires getters / setters .

4.2. Dclaration d'un bean existant


Un bean est dclar en utilisant le tag <jsp:userBean>. Cette dclaration permet d'associer un nom un bean. Ce nom peut tre ensuite utilis dans la page, comme s'il s'agissait d'un champ normal. Exemple 41. Dclaration d'un bean dans une page

<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <jsp:useBean id="marin" beanName="marin" scope="request" type="org.paumard.cours.model.Marin"/> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <p>Using <%=marin%> ; </p> </body> </html>

La dclaration prcdente comporte plusieurs lments, sous forme d'attributs XML :

id : dsigne le nom du champ qui porte la rfrence ce bean. Ici marin.

beanName : la prsence de cet attribut indique que l'on utilise un bean qui a t cr par ailleurs.
Ce bean doit se trouver sur l'un des contextes dfinis dans l'API servlet : la page, la requte, la session ou l'application. La valeur de cet attribut donne la cl laquelle ce bean a t associ, par invocation d'une mthode setAttribute(beanName, ...).

scope : attribut qui indique le contexte dans lequel le bean existe. Cet attribut peut prendre les
valeurs page, request, session ou application. Dans le cas d'un bean existant, ce contexte doit obligatoirement tre prcis. Le moteur de JSP ira chercher ce bean dans le contexte indiqu, par invocation d'une mthode getAttribute().

type : cet attribut indique la classe du bean dclar. Cette classe doit bien sr tre connue de
l'application Web. Dans notre exemple, on affiche simplement ce bean dans la page. Sa mthode

toString() sera automatiquement appele.


Une fois ce bean dclar, il peut tre utilis le corps de la page JSP, comme indiqu sur l'exemple.

4.3. Cration d'un nouveau bean


La cration d'un nouveau bean suit un processus lgrement diffrent. Tout d'abord, on ne dclare pas l'attribut

beanName, qui indique que le bean doit exister dans un contexte donn par l'attribut scope. Ensuite, plutt que
d'indiquer la classe de ce bean dans l'attribut type, on le dclare dans l'attribut class. Dans ce cas, le moteur de JSP cre ce bean, et le range en tant qu'attribut du contexte indiqu dans l'attribut scope. On peut enfin prciser les valeurs des proprits de ce bean de ceux faons :

explicitement, en utilisant une valeur dans l'attribut value de l'lment setProperty ; en l'associant une valeur prsente dans les paramtres de la requte, en utilisant l'attribut param de
l'lment setProperty. Voyons tout ceci sur un exemple. Exemple 42. Cration d'un bean dans une page

<jsp:useBean id="marin" scope="page" class="org.paumard.cours.model.Marin"> <jsp:setProperty name="marin" property="nom" <jsp:setProperty name="marin" property="age" </jsp:useBean> value="Surcouf"/> param="age"/> <jsp:setProperty name="marin" property="prenom" param="prenom"/>

Dans ce deuxime exemple, on cre un bean de type Marin, et on l'associe au nom de champ marin. Le contexte de ce bean est la page, il ne sera donc pas disponible ailleurs que dans cette page. En particulier, si cette page fait appel d'autres pages, ou d'autres servlets, ces autres lments n'auront pas accs ce bean. Les trois proprits nom, prenom et age de ce bean sont fixes par les sous-lments setProperty . Ces souslements prennent en attribut :

name : le nom du bean, tel que dclar dans l'attribut id de l'lment useBean. property : le nom de la proprit que l'on fixe. Il doit exister un setter associ. value : si cet attribut est prcis, alors la proprit prendra la valeur indique. param : si cet attribut est utilis, alors la proprit prendra la valeur du paramtre de la requte donc
le nom est indiqu. Cela permet de crer directement un pont entre les paramtres prsents sur la requte et les proprits d'un bean.

4.4. Utilisation des proprits d'un bean


Jusqu' prsent nous avons utilis des lments de scripts entre les tags JSP particuliers <%= et >. On peut utiliser une syntaxe plus lgre, comme dans l'exemple suivant. Exemple 43. Lecture d'une proprit

<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <jsp:useBean id="marin" beanName="marin" scope="session" type="org.paumard.cours.model.Marin"/> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <p>Nom = ${marin.nom}</p> </body> </html>

Cette syntaxe consiste rfrencer un bean par son nom dans la page (valeur de l'attribut id de l'lment useBean qui a servi le dclarer), et indiquer la proprit que l'on veut exploiter en utilisant le sparateur .. Le tout doit tre mis entre accolades, et prcd par le caractre $. Dans ce cas, la proprit sera affiche dans la page. Si elle est non nulle, alors le moteur de JSP utilisera sa mthode

toString().