Академический Документы
Профессиональный Документы
Культура Документы
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 : "+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.
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()%>
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.
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
Correction
1. 2. 3. 4. 5. 6. 7.
<%@ include file="commun.jsp"%> <%=entete("6me exercice")%> <B>Le formulaire :</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 :</B><BR> 22. Bonjour <%=nom%>, vous avez <%=age%> ans. 23. <% 24. } 25. %> 26. <%=pied()%>
27.
<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 :</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 :</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 :</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 :</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 :</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 :</B><BR> Avec liste droulante :<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 :<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 </><BR> <% int a=Integer.parseInt("0"+aStr); int b=Integer.parseInt("0"+bStr); %> <CENTER>Le rsultat du calcul prcdent est : <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.
<%@ include file="commun.jsp"%> <%=entete("11me exercice")%> <B>Le formulaire :</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");
String chiensStr=request.getParameter("chiens"); if ((vachesStr!=null) &&(poulesStr!=null) &&(amisStr!=null) &&(chiensStr!=null)) { %> <P><B>Le traitement :</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 : 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 : 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.
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
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:
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);
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>
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
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
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.
<?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.
Ajouter d'autres servlets cette application web est ensuite trs simple : il suffit dajouter les deux lments servlet et
JSP
<!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.
<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 !
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(" \"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
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.
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)
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") ;
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 .
<%@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>
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
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.
<%@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().