• Aucun résultat trouvé

La vue [erreurs] Cette vue n'a pas changé :

9 Application web MVC [personne] – version 4 Cette versions utilise la bibliothèque de balises JSTL présentée précédemment.

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

9.3.3 La vue [erreurs] Cette vue n'a pas changé :

La nouvelle page JSP [erreurs.jsp] est la suivante :

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>

18. <form name="frmPersonne" method="post">

19. <input type="hidden" name="action" value="retourFormulaire">

20. </form> 21. <a href="javascript:document.frmPersonne.submit();"> 22. ${lienRetourFormulaire} 23. </a> 24. </body> 25.</html> 26. Les nouveautés :

• ligne 4 : déclaration de la bibliothèque de balises JSTL / Core • lignes 13-15 : affichage de la liste d'erreurs à l'aide de JSTL

• il n'y a plus de code Java en début de page JSP pour récupérer le modèle de celle-ci.

9.4 Tests des vues

Pour réaliser les tests des vues précédentes, nous dupliquons leurs pages JSP dans le dossier /WebContent/JSP du projet Eclipse :

Puis dans le dossier JSP, les pages sont modifiées de la façon suivante : [formulaire.jsp] :

1. ... 2. <%

3. // -- test : on crée le modèle de la page

4. session.setAttribute("nom","tintin"); 5. session.setAttribute("age","30"); 6. %> 7. 8. <html> 9. <head> 10.

Les lignes 4-5 ont été ajoutées pour créer le modèle dont a besoin la page. [reponse.jsp] :

1. ... 2. <%

3. // -- test : on crée le modèle de la page

4. request.setAttribute("nom","milou"); 5. request.setAttribute("age","10"); 6. request.setAttribute("lienRetourFormulaire","Retour au formulaire"); 7. %> 8. 9. 10.<html> 11. <head> 12. 13. ...

Les lignes 4-6 ont été ajoutées pour créer le modèle dont a besoin la page. [erreurs.jsp] :

1. 2. <%

3. // -- test : on crée le modèle de la page

4. ArrayList<String> erreurs1=new ArrayList<String>(); 5. erreurs1.add("erreur1"); 6. erreurs1.add("erreur2"); 7. request.setAttribute("erreurs",erreurs1); 8. request.setAttribute("lienRetourFormulaire","Retour au formulaire"); 9. %> 10. 11.<html> 12. <head> 13.

Les lignes 4-8 ont été ajoutées pour créer le modèle dont a besoin la page. Lançon Tomcat si ce n'est déjà fait puis demandons les url suivantes :

Nous obtenons bien les vues attendues.

9.5 Le contrôleur [ServletPersonne]

Le contrôleur [ServletPersonne] de l'application web [/personne3] va traiter les actions suivantes :

demande origine traitement

1 [GET /personne4/main] url tapée par l'utilisateur - envoyer la vue [formulaire] vide 2 [POST /personne4/main]

avec paramètres [txtNom, txtAge,

action=validationFormulaire] postés

clic sur le bouton [Envoyer] de la vue [formulaire]

- vérifier les valeurs des paramètres [txtNom, txtAge] - si elles sont incorrectes, envoyer la vue [erreurs(erreurs)] - si elles sont correctes, envoyer la vue [reponse(nom,age)]

3 [POST /personne4/main] avec paramètres

[action=retourFormulaire] postés

clic sur le lien [Retour au formulaire] des vues [réponse] et [erreurs].

- envoyer la vue [formulaire] pré-remplie avec les dernières valeurs saisies

Le squelette du contrôleur [ServletPersonne] est identique à celui de la version précédente. Nous passons en revue les modifications amenées aux méthodes [doInit, doValidationFormulaire, doRetourFormulaire], les méthodes [init, doGet, doPost] ne changeant pas.

9.5.1 La méthode [doInit]

Cette méthode traite la requête n° 1 [GET /personne4/main]. Son code est le suivant : 1. // affichage formulaire vide

2. void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 3. getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward( 4. request, response); 5. return; 6.} Les nouveautés :

• ligne 3 : on affiche la vue [formulaire]. Celle-ci attend dans son modèle des attributs " nom " et " age ". Elle ne va pas les y trouver puisqu'ici le contrôleur ne les y met pas. Dans ce cas, la bibliothèque JSTL va récupérer des pointeurs

null pour ces attributs. Cela ne provoque pas d'erreurs et des valeurs vides seront affichées pour les éléments ${nom}

et ${age} de la vue [formulaire]. Cela nous convient. Nous évitons ainsi d'avoir à initialiser le modèle de la vue [formulaire].

9.5.2 La méthode [doValidationFormulaire]

Cette méthode traite la requête n° 2 [POST /personne4/main] avec [action, txtNom, txtAge] dans les éléments postés. Son code est le suivant :

1. // validation du formulaire

2. void doValidationFormulaire(HttpServletRequest request,

3. HttpServletResponse response) throws ServletException, IOException{

4. // on récupère les paramètres

5. String nom = request.getParameter("txtNom"); 6. String age = request.getParameter("txtAge");

7. // qu'on mémorise dans la session

8. HttpSession session = request.getSession(true);

9. session.setAttribute("nom", nom); 10. session.setAttribute("age", age);

11. // vérification des paramètres

12....

13. // les paramètres sont corrects - on envoie la page réponse

14. request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire")); 15. getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request, 16. response); 17. return; 18. } Les nouveautés :

• ligne 15 : la méthode [doValidationFormulaire] envoie en réponse la vue [réponse]. Celle-ci a dans son modèle les éléments [nom, age, lienRetourFormulaire]. [lienRetourFormulaire] est mis dans le modèle ligne 14, via la requête. Les éléments [nom,age] sont eux mis dans le modèle lignes 8-10, via la session. Dans la version précédente, on avait placé les éléments [nom, age] également dans la requête lorsqu'on envoyait la vue [réponse] cat cette vue les attendait là. Ici, avec la bibliothèque JSTL, on sait que les différents contextes (request, session, application) vont être explorés pour trouver les éléments du modèle. Ils seront donc trouvés dans la session puisque le contrôleur les y a mis (lignes 8- 10).

9.5.3 La méthode [doRetourFormulaire]

Cette méthode traite la requête n° 3 [POST /personne4/main] avec [action=retourFormulaire] dans les éléments postés. Son code est le suivant :

1. // affichage formulaire pré-rempli

2. void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException{ 3. // on affiche le formulaire 4. getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward( 5. request, response); 6. return; 7. }

Les nouveautés :

• ligne 4 : on affiche la vue [formulaire]. Celle-ci attend dans son modèle des attributs " nom " et " age ". Elle les trouvera dans la session puisque la méthode [doValidationFormulaire] les y a mis et que cette méthode est forcément exécutée avant la méthode [doRetourFormulaire]. Il n'y a donc pas à initialiser le modèle de [formulaire] avant son affichage ligne 4. Du coup, les méthodes [doInit] et [doRetourFormulaire] sont identiques et on pourrait supprimer l'action [retourFormulaire] pour la remplacer par l'action [init]. La méthode [doRetourFormulaire] disparaîtrait alors.

9.6 Tests

Dans cette nouvelle version, seules les vues changent. Le contrôleur [ServletPersonne] lui ne change pas. L'utilisation de JSTL nous a simplement permis d'exploiter plus simplement dans les pages JSP, le modèle construit par le contrôleur.

Lancer ou relancer Tomcat après y avoir intégré le projet Eclipse [personne-mvc-04]. Demander l'url [http://localhost:8080/personne4].

10 Application web MVC [personne] – version 5