12 Application web MVC [personne] – version 7 12.1 Introduction
12.3 Configuration de l'application web [personne7] Le fichier web.xml de l'application /personne7 est le suivant :
1. <?xml version="1.0" encoding="UTF-8"?>
2. ...
3. <display-name>mvc-personne-07</display-name>
4. ...
Ce fichier est identique à celui de la version précédente hormis la ligne 3 où le nom d'affichage de l'application web a changé en [mvc-personne-07]. La page d'accueil [index.jsp] ne change pas.
1. ...
2. <c:redirect url="/do/formulaire"/>
12.4 Le code des vues
Les vues [formulaire, réponse, erreurs] redeviennent ce qu'elles étaient dans la version 2, c.a.d. sans Javascript. Cependant elles conservent les balises JSTL des dernières versions.
12.4.1 La vue [formulaire]
On a enlevé les boutons associés à du code Javascript. [formulaire.jsp] :
1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4. <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> 5.
6. <html>
7. <head>
8. <title>Personne - formulaire</title>
9. </head>
10. <body>
11. <center>
12. <h2>Personne - formulaire</h2>
13. <hr>
14. <form name="frmPersonne" action="<c:url value="validationFormulaire"/>" method="post">
15. <table>
16. <tr>
17. <td>Nom</td>
18. <td><input name="txtNom" value="${nom}" type="text" size="20"></td>
19. </tr>
20. <tr>
21. <td>Age</td>
22. <td><input name="txtAge" value="${age}" type="text" size="3"></td>
23. </tr>
24. <tr>
25. </table>
26. <table>
27. <tr>
28. <td><input type="submit" name="bouton" value="Envoyer"></td>
29. <td><input type="reset" value="Rétablir"></td>
30. <td><input type="submit" name="bouton" value="Effacer"></td>
31. </tr> 32. </table> 33. </form> 34. </center> 35. </body> 36.</html>
• ligne 14 : l'Url cible du POST est écrite avec la balise <c:url> afin que le jeton de session y soit au cas où le client serait un navigateur n'envoyant pas l'entête HTTP [Cookie].
• le formulaire a deux boutons de type [submit] : [Envoyer] (ligne 28) et [Effacer] (ligne 30). Les deux boutons portent le même nom : bouton. Au moment du POST, le navigateur enverra le paramètre :
• bouton=Envoyer si le POST a été provoqué par le bouton [Envoyer]
• bouton=Effacer si le POST a été provoqué par le bouton [Effacer]
C'est ce paramètre qui nous aidera à définir l'action exacte à faire, l'Url [/do/validationFormulaire] correspondant maintenant à deux actions distinctes.
12.4.2 La vue [réponse]
[réponse.jsp] :
1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4. <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> 5.
6. <html>
7. <head>
8. <title>Personne</title>
9. </head> 10. <body> 11. <h2>Personne - réponse</h2> 12. <hr> 13. <table> 14. <tr> 15. <td>Nom</td> 16. <td>${nom}</td> 17. </tr> 18. <tr> 19. <td>Age</td> 20. <td>${age}</td> 21. </tr> 22. </table> 23. <br>
24. <a href="<c:url value="retourFormulaire"/>">${lienRetourFormulaire}</a>
25. </body>
26.</html>
27.
• ligne 24 : l'Url cible du HREF est écrite avec la balise <c:url> afin que le jeton de session y soit au cas où le client serait un navigateur n'envoyant pas l'entête HTTP [Cookie].
12.4.3 La vue [erreurs]
1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 2. pageEncoding="ISO-8859-1"%>
3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4. <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> 5.
6. <html>
7. <head>
8. <title>Personne</title>
9. </head>
10. <body>
11. <h2>Les erreurs suivantes se sont produites</h2>
12. <ul>
13. <c:forEach var="erreur" items="${erreurs}">
14. <li>${erreur}</li>
15. </c:forEach>
16. </ul>
17. <br>
18. <a href="<c:url value="retourFormulaire"/>">${lienRetourFormulaire}</a>
19. </body>
20.</html>
21.
• ligne 18 : l'Url cible du HREF est écrite avec la balise <c:url> afin que le jeton de session y soit au cas où le client serait un navigateur n'envoyant pas l'entête HTTP [Cookie].
Le lecteur est invité à tester ces nouvelles vues selon le principe vu dans les versions précédentes.
12.5 Le contrôleur [ServletPersonne]
Le contrôleur [ServletPersonne] de l'application web [/personne7] est le suivant : 1. package istia.st.servlets.personne;
2. 3. ... 4.
5. @SuppressWarnings("serial")
6. public class ServletPersonne extends HttpServlet {
7. // paramètres d'instance
8. private String urlErreurs = null;
9. private ArrayList erreursInitialisation = new ArrayList<String>();
10. private String[] paramètres={"urlFormulaire","urlReponse","lienRetourFormulaire"}; 11. private Map params=new HashMap<String,String>();
12.
13. // init
14. @SuppressWarnings("unchecked")
15. public void init() throws ServletException {
16. ...
17. }
18.
19. // GET
20. @SuppressWarnings("unchecked")
21. public void doGet(HttpServletRequest request, HttpServletResponse response)
22. throws IOException, ServletException {
23. 24. ...
25. // on récupère la méthode d'envoi de la requête
26. String méthode=request.getMethod().toLowerCase();
27. // on récupère l'action à exécuter
28. String action=request.getPathInfo();
29. ...
30. if(méthode.equals("post") && action.equals("/validationFormulaire")){
31. // validation du formulaire de saisie
32. doValidationFormulaire(request,response);
33. return;
34. }
35. if(méthode.equals("get") && action.equals("/retourFormulaire")){
36. // retour au formulaire de saisie
37. doRetourFormulaire(request,response); 38. return; 39. } 40. // autres cas 41. doInit(request,response); 42. } 43.
44. // affichage formulaire vide
45. void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException{ 46. ...
47. }
48.
50. void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 51. // on affiche le formulaire 52. getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward( 53. request, response); 54. return; 55. } 56.
57. // affichage formulaire vide
58. void doEffacer(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException{
59. // on prépare le modèle du formulaire
60. HttpSession session = request.getSession(true);
61. session.setAttribute("nom", ""); 62. session.setAttribute("age", ""); 63. // on affiche le formulaire 64. getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward( 65. request, response); 66. return; 67. } 68. 69. // validation du formulaire
70. void doValidationFormulaire(HttpServletRequest request,
71. HttpServletResponse response) throws ServletException, IOException{
72. // on récupère le bouton qui a provoqué le POST
73. String bouton = request.getParameter("bouton").toLowerCase();
74. // traitement selon le bouton qui a provoqué le POST
75. if(bouton==null){ 76. doInit(request,response); 77. return; 78. } 79. if("envoyer".equals(bouton)){ 80. doEnvoyer(request,response); 81. return; 82. } 83. if("effacer".equals(bouton)){ 84. doEffacer(request,response); 85. return; 86. } 87. } 88. 89. // validation du formulaire
90. void doEnvoyer(HttpServletRequest request,
91. HttpServletResponse response) throws ServletException, IOException{
92. // on récupère les paramètres
93. String nom = request.getParameter("txtNom"); 94. String age = request.getParameter("txtAge");
95. // qu'on mémorise dans la session
96. HttpSession session = request.getSession(true);
97. session.setAttribute("nom", nom); 98. session.setAttribute("age", age);
99. // le lien du retour au formulaire est mis dans le modèle des vues [réponse, erreurs]
100. request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
101. // vérification des paramètres
102. ArrayList<String> erreursAppel = new ArrayList<String>(); 103. ...
104. // des erreurs dans les paramètres ?
105. if (erreursAppel.size() != 0) {
106. // on envoie la page d'erreurs
107. request.setAttribute("erreurs", erreursAppel);
108. getServletContext().getRequestDispatcher(urlErreurs).forward(
109. request, response);
110. return;
111. }
112. // les paramètres sont corrects - on envoie la page réponse
113. getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request, 114. response); 115. return; 116. } 117. 118. // post
119. public void doPost(HttpServletRequest request, HttpServletResponse response)
120. throws IOException, ServletException {
121.... 122. } 123.}
• ligne 35 : l'action [/retourFormulaire] est faite par un GET et non plus par un POST comme dans la version précédente.
• lignes 70-87 : l'action [/validationFormulaire] est faite par un POST provoqué par un clic sur l'un des boutons [Envoyer] ou [Effacer] de la vue [formulaire]. La méthode [doValidationFormulaire] fait traiter ces deux cas par deux méthodes différentes.
• lignes 90-103 : la méthode [doEnvoyer] correspond à la méthode [doValidationFormulaire] de la version précédente. Les données saisies sont mises dans la session (lignes 96-98) alors dans la version précédente elles étaient placées dans la requête.
• lignes 58-67 : la nouvelle méthode [doEffacer] doit afficher un formulaire vide. On pourrait faire appel à la méthode [doInit] qui fait déjà ce travail. Ici, on en profite pour également effacer les éléments [nom, age] de la session afin que celle-ci continue à refléter le dernier état du formulaire.
• lignes 50-55 : demandent l'affichage de la vue [formulaire] sans initialisation apparente du modèle de cette vue. Ce modèle est en fait constitué des éléments [nom, age] déjà dans la session. Il n'y a pas lieu de faire davantage.
12.6 Tests
Lancer ou relancer Tomcat après y avoir intégré le projet Eclipse [personne-mvc-07] puis demander l'url [http://localhost:8080/personne7] avec un navigateur dont on a inhibé les cookies et supprimé ceux existant déjà. On obtient la réponse suivante :
Le code source reçu par le navigateur est le suivant :
1. <form name="frmPersonne" action="validationFormulaire;jsessionid=9D4CC83FEFB51AE78B1FD71EC66F9EF3" method="post"> 2. ...
3. </form>
Ligne 1, le jeton de session est dans l'Url cible du POST. Remplissons le formulaire et validons-le :
Le code source reçu par le navigateur est le suivant :
1. ... 2. <br>
3. <a href="retourFormulaire;jsessionid=9D4CC83FEFB51AE78B1FD71EC66F9EF3">Retour au formulaire</a> 4. </body>
Ligne 3, le jeton de session est dans l'Url cible du lien.