• Aucun résultat trouvé

Configuration de l'application web [personne7] Le fichier web.xml de l'application /personne7 est le suivant :

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.