• Aucun résultat trouvé

Coopération servlet et pages JSP Lectures [ref1] : chapitre 2 : 2.

Aucune de ces deux architectures n'est satisfaisante. Elles présentent toutes les deux l'inconvénient de mélanger deux technologies : celles de la programmation Java qui s'occupe de la logique de l'application web et celle du codage HTML qui s'occupe de la présentation d'informations dans un navigateur.

• la solution [1] à base de page JSP a l'inconvénient de mélanger code HTML et code Java au sein d'une même page. Nous ne l'avons pas vu sur l'exemple traité qui était basique. Mais si [formulaire.jsp] avait du vérifier la validité des paramètres [txtNom, txtAge] de la requête du client, nous aurions été obligés de mettre du code Java dans la page. Cela devient très vite ingérable.

• la solution [2] à base de servlet présente le même problème. Bien qu'il n'y ait que du code Java dans la classe, celle-ci doit générer un document HTML. Là encore, à moins que le document HTML soit basique, sa génération devient compliquée et quasi impossible à maintenir.

Nous allons éviter le mélange des technologies Java et HTML en adoptant l'architecture suivante :

• l'utilisateur envoie sa requête à la servlet. Celle-ci la traite et construit les valeurs des paramètres dynamiques de la page JSP [formulaire.jsp] qui va servir à générer la réponse HTML au client. Ces valeurs forment ce qu'on appelle le modèle de la page JSP.

• une fois terminé son travail, la servlet va demander à la page JSP [formulaire.jsp] de générer la réponse HTML au client. Elle va lui fournir en même temps les éléments dont la page JSP a besoin pour générer cette réponse, ces éléments qui forment le modèle de la page.

Nous explorons maintenant cette nouvelle architecture.

3.7.1 La servlet [ServletFormulaire2]

Dans l'architecture ci-dessus, la servlet s'appellera [ServletFormulaire2]. Elle sera construite dans le même projet [personne] que précédemment, ainsi que toutes les servlets à venir :

1

2

Utilisateur

formulaire.jsp

Application web

ServletFormulaire.java

Utilisateur

Modèle

formulaire.jsp

Application web

ServletFormulaire.java

Utilisateur

[ServletFormulaire2] est tout d'abord obtenu par un copier / coller de [ServletFormulaire] au sein d'Eclipse : • sélection [ServletFormulaire.java] -> clic droit -> Copy

• sélection [istia.st.servlets.personne] -> clic droit -> Paste -> changer le nom en [ServletFormulaire2.java] Puis ensuite, nous en modifions le code de [ServletFormulaire2] de la façon suivante :

1. package istia.st.servlets.personne; 2. 3. import java.io.IOException; 4. import javax.servlet.ServletConfig; 5. import javax.servlet.ServletException; 6. import javax.servlet.http.HttpServlet; 7. import javax.servlet.http.HttpServletRequest; 8. import javax.servlet.http.HttpServletResponse; 9. 10. @SuppressWarnings("serial")

11. public class ServletFormulaire2 extends HttpServlet { 12.

13. // paramètres d'instance

14. private String defaultNom = null;

15.

16. private String defaultAge = null;

17.

18. // init

19. public void init() {

20. // on récupère les paramètres d'initialisation de la servlet

21. ServletConfig config = getServletConfig();

22. defaultNom = config.getInitParameter("defaultNom"); 23. if (defaultNom == null) 24. defaultNom = "NNNNNNNNNNNNNNN"; 25. defaultAge = config.getInitParameter("defaultAge"); 26. if (defaultAge == null) 27. defaultAge = "AAA"; 28. } 29. 30. // GET

31. public void doGet(HttpServletRequest request, HttpServletResponse response)

32. throws IOException, ServletException {

33.

34. // on récupère les paramètres du formulaire

35. String nom = request.getParameter("txtNom");

36. if (nom == null) {

37. nom = defaultNom;

38. }

39. String age = request.getParameter("txtAge");

40. if (age == null) { 41. age = defaultAge; 42. } 43. // on affiche le formulaire 44. request.setAttribute("nom", nom); 45. request.setAttribute("age", age); 46. getServletContext().getRequestDispatcher("/formulaire2.jsp").forward(request, response); 47. } 48. 49. // POST

50. public void doPost(HttpServletRequest request, HttpServletResponse response)

51. throws IOException, ServletException {

52. // on passe la main au GET

53. doGet(request, response);

54. }

Seule la partie génération de la réponse HTTP a changé (lignes 44-46) :

ligne 46 : la génération de la réponse est confiée à la page JSP formulaire2.jsp. Celle-ci pas encore étudiée, sera chargée d'afficher les paramètres récupérés dans la requête du client, un nom (lignes 35-38) et un âge (lignes 39-42). • ces deux valeurs sont placées dans les attributs de la requête [request], associées à des clés. Les attributs d'une requête

sont gérés comme un dictionnaire.

• ligne 44 : le nom est mis dans la requête associé à la clé "nom" • ligne 45 : l'âge est mis dans la requête associé à la clé "age"

• ligne 46 : demande l'affichage de la page JSP [formulaire2.jsp]. On passe en paramètre à celle-ci :

• la requête [request] du client, ce qui va permettre à la page JSP d'avoir accès aux attributs de celle-ci qui viennent d'être initialisés par la servlet

• la réponse [response] qui va permettre à la page JSP de générer la réponse HTTP au client Une fois la classe [ServletFormulaire2] écrite, son code compilé apparaît dans [build/classes] :

3.7.2 La page JSP [formulaire2.jsp]

La page JSP formulaire2.jsp est obtenue par copier / coller de la page [formulaire.jsp]

puis transformée de la façon 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. <%

5. // on récupère les valeurs nécessaire à l'affichage

6. String nom=(String)request.getAttribute("nom"); 7. String age=(String)request.getAttribute("age"); 8. %> 9. 10.<html> 11. <head>

12. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

13. <title>Personne - formulaire2</title>

14. </head>

15. <body>

16. <center>

17. <h2>Personne - formulaire2</h2>

18. <hr>

19. <form action="" method="post">

20. <table>

21. <tr>

22. <td>Nom</td>

23. <td><input name="txtNom" value="<%= nom %>" type="text" size="20"></td>

24. </tr>

25. <tr>

26. <td>Age</td>

27. <td><input name="txtAge" value="<%= age %>" type="text" size="3"></td>

28. </tr>

29. </table>

30. <table>

31. <tr>

32. <td><input type="submit" value="Envoyer"></td>

33. <td><input type="reset" value="Rétablir"></td>

34. <td><input type="button" value="Effacer"></td>

35. </tr>

37. </form>

38. </center>

39. </body>

40.</html>

Seules les lignes 4-8 ont changé vis à vis de [formulaire.jsp] :

• ligne 6 : récupère la valeur de l'attribut nommé "nom" dans la requête [request], attribut créé par la servlet [ServletFormulaire2].

• ligne 7 : fait de même pour l'attribut "age"

3.7.3 Configuration de l'application

Le fichier de configuration [web.xml] est modifié de la façon suivante : 1. <?xml version="1.0" encoding="UTF-8"?>

2. <web-app id="WebApp_ID" version="2.4" 3. xmlns="http://java.sun.com/xml/ns/j2ee"

4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

5. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web- app_2_4.xsd">

6. <display-name>personne</display-name>

7. <!-- ServletFormulaire --> 8. <servlet>

9. <servlet-name>formulairepersonne</servlet-name>

10. <servlet-class>

11. istia.st.servlets.personne.ServletFormulaire

12. </servlet-class>

13. <init-param>

14. <param-name>defaultNom</param-name>

15. <param-value>inconnu</param-value>

16. </init-param>

17. <init-param>

18. <param-name>defaultAge</param-name>

19. <param-value>XXXX</param-value> 20. </init-param> 21. </servlet> 22. <!-- ServletFormulaire 2--> 23. <servlet> 24. <servlet-name>formulairepersonne2</servlet-name> 25. <servlet-class> 26. istia.st.servlets.personne.ServletFormulaire2 27. </servlet-class> 28. <init-param> 29. <param-name>defaultNom</param-name> 30. <param-value>inconnu</param-value> 31. </init-param> 32. <init-param> 33. <param-name>defaultAge</param-name> 34. <param-value>XXX</param-value> 35. </init-param> 36. </servlet> 37. <!-- Mapping ServletFormulaire --> 38. <servlet-mapping>

39. <servlet-name>formulairepersonne</servlet-name>

40. <url-pattern>/formulaire</url-pattern>

41. </servlet-mapping> 42. <!-- Mapping ServletFormulaire 2--> 43. <servlet-mapping> 44. <servlet-name>formulairepersonne2</servlet-name> 45. <url-pattern>/formulaire2</url-pattern> 46. </servlet-mapping> 47. <!-- fichiers d'accueil --> 48. <welcome-file-list>

49. <welcome-file>index.html</welcome-file>

50. </welcome-file-list>

51.</web-app>

Nous avons conservé l'existant et ajouté :

 lignes 22-36 : une section <servlet> pour définir la nouvelle servlet ServletFormulaire2  lignes 42-46 : une section <servlet-mapping> pour lui associer l'URL /formulaire2 Lancez ou relancez le serveur Tomcat si besoin est. Nous demandons l'URL

Nous obtenons le même résultat que précédemment mais la structure de notre application est désormais plus claire : une servlet qui contient de la logique applicative et délègue à une page JSP l'envoi de la réponse au client. Nous procèderons désormais toujours de cette façon.

4 Développement MVC (Modèle – Vue – Contrôleur)