Aller au menu - Aller au contenu

Icône Gérer l'affichage

Mise à jour : 24/07/2009
10 160 visites depuis 7 jours, dont 803 sur ce chapitre classé 25/786
Dans le précédent chapitre nous avons réussi à faire notre première servlet !
Les Zéros qui ont l'habitude de faire des pages web se sont vite rendu compte que, si nous poursuivons dans cette voie, les choses seront loin d'être simples...

En effet, dans le langage HTML, le caractère " sert TRÈS SOUVENT !
Or en Java aussi, donc si vos balises HTML ne sont pas "nature" sans CSS, voici ce que ça pourrait donner :

Code : Java
1
2
3
4
5
6
7
out.println("<html>");
out.println("<body onLoad=\"alert('bonjour');\">");
out.println("<p style=\"color:red\" id=\"monId\" onClick=\"alert('toto');\">");
out.println("Pas facile à lire tout ça...");
out.println("</p>");
out.println("</body>");
out.println("</html>");


D'ailleurs, pour être honnête, les servlets ne servent pas à écrire du code Java dans des pages web !
En fait, la plateforme JEE implémente le pattern MVC. Je vous invite très vivement à aller rejeter un coup d'oeil au tuto concerné...
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

MVC et JEE

Voici le schéma que je vous avais proposé dans le chapitre sur MVC :

Image utilisateur


Avec la plate-forme JEE, vous allez devoir utiliser ce pattern. Disons qu'il est plus ou moins encapsulé dedans !

Bon, si nous avons à utiliser ce pattern, à quoi correspond la servlet que nous venons de réaliser ?

Réfléchissez un peu... Dans le pattern MVC, il y a un objet qui a pour rôle de récupérer des demandes, de les traiter et de retourner ce qu'on lui a demandé : le contrôleur !
En effet, nous avons fait en sorte que notre servlet écrive elle-même du code HTML, mais dans la plupart des cas, les servlets ont pour rôle de récupérer les requêtes client et d'agir en conséquence.

Attends : dans ce cas, que sont le modèle et la vue du pattern MVC ?

Le modèle peut être divers et varié, comme tout modèle digne de ce nom :
  • un objet Java basique ;
  • un objet Java devant faire appel à une base de données ;
  • ...


La vue, elle, reste une page web contenant du code HTML, à la différence près que celle-ci contiendra aussi du code Java : on appelle ces pages web des Java Server Pages, ou JSP pour les intimes ! ^^

Donc, si nous appliquons le pattern MVC à l'architecture JEE, ça nous donne :

Image utilisateur


Vous remarquerez sûrement que des flèches de dépendance ont disparu ! En effet, vous allez voir que la vue est appelée par le contrôleur et reçoit les informations du modèle via ce dernier.
Je vous propose maintenant de voir à quoi ressemble une page JSP et comment la lier à notre servlet...

V comme JSP

Comme vous le savez déjà, une JSP est une page web contenant du code Java.
Le dit code est introduit dans des pages web via des balises spécifiques <% %> ; ensuite, tout ce que vous mettrez à l'intérieur est du pur code Java, voici un exemple :

Code : JSP
1
2
3
4
5
<html>
<body>
 <% out.println("<h1>Une JSP !</h1>"); %> 
</body>
</html>


Nous allons d'ailleurs l'ajouter dans notre projet ! ^^
Pour ce faire, il vous suffit de faire un clic droit sur votre projet et de choisir "new/other/web/JSP".

Image utilisateur


Appelez-la "firstJsp". Votre JSP se trouve donc à la racine du projet : à côté du fichier index.html pour ceux qui auraient continué de travailler sur le même projet Tomcat.

Image utilisateur


Eclipse vous génère du code, beaucoup de code, toutes les entêtes HTML en fait... pour notre test nous n'en avons pas besoin : effacez le contenu du fichier et remplacez-le par mon code (non mais ! ^^ ).

Ensuite, vous connaissez la musique, rendez-vous dans l'administration de Tomcat, rentrez dans votre projet !
Pour accéder à votre JSP, il suffit de rajouter son nom dans la barre d'adresse de votre navigateur :

Image utilisateur


Ce qui vous donne ceci :

Image utilisateur


Félicitations, vous avez votre première JSP ! :)

Ici, nous avons affiché un message, mais on peut faire plein d'autres choses dans une JSP... Utiliser des objets, faire des boucles...

Voici notre JSP avec un peu plus de code :

Code : JSP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<body>
 <% out.println("<h1>Une JSP !</h1>"); %>
 <p>Alors...</p>
 <%
   String[] list = new String[]{"Et de un", "Et de deux", "Et de trois"};
   out.println("<ul>");

   //On peut même y mettre des commentaires...   

   /* 
       Même des commentaires multilignes
    */

   //Allons-y pour une boucle...
   for(String str : list)
     out.println("<li>" + str + "</li>");

   out.println("</ul>");
 %>
</body>
</html>


Ce qui nous donne :

Image utilisateur


Les commentaires sont ignorés et n'apparaissent pas... Et encore heureux... ^^


Maintenant, je vous propose de voir comment faire en sorte qu'une servlet puisse utiliser une JSP afin de la fournir au client. Vous allez voir, c'est simple comme tout...
Pour ce faire, nous allons créer une nouvelle servlet que nous appellerons InvokeJsp, toujours dans le package com.servlet.test , dont voici le contenu :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package com.servlet.test;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class InvokeJsp extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
					throws IOException, ServletException{
		
		RequestDispatcher dispatch = request.getRequestDispatcher("firstJsp.jsp");
		dispatch.forward(request, response);
	}	
}


Il vous faut ensuite modifier le fichier web.xml comme ceci :

Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<web-app>

	<servlet>
		<servlet-class>com.servlet.test.DoIt</servlet-class>
		<servlet-name>firstServlet</servlet-name>
	</servlet>
	
	<servlet>
		<servlet-class>com.servlet.test.InvokeJsp</servlet-class>
		<servlet-name>invoke</servlet-name>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>firstServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>invoke</servlet-name>
		<url-pattern>/invoke</url-pattern>
	</servlet-mapping>

</web-app>


Nous avons conservé la configuration de notre première servlet et nous avons ajouté la configuration pour la seconde.
Vous devez remarquer l'ordre de la déclaration : le fichier commence par définir tous les noms internes de nos servlets (1) et ensuite tous les chemins (2) pour y accéder de l'extérieur :

Image utilisateur


Vous devez savoir une chose importante concernant Tomcat et le fichier web.xml.
Si vous n'avez pas opté pour la solution d'utiliser le dossier webapps/ comme workspace, vous serez obligés de redémarrer Tomcat afin qu'il puisse prendre en compte les modifications apportées au fichier web.xml ! Il va donc le relire et le tour sera joué...


Pour ceux qui ont opté pour la solution fournie, s'ils attendent quelques secondes après avoir modifié le fichier web.xml, un message identique à celui-ci s'affichera :

Image utilisateur


Ce qui signifie que Tomcat a rechargé le contexte de l'application Test !
Vous pouvez aller à l'adresse suivante : localhost:8080/Test/invoke et vous aurez le contenu de votre JSP mais cette fois, celui-ci nous a été fourni par notre servlet InvokeJsp.

Vous avez compris que ceci se faisait par le biais de ces deux lignes de code :

Code : Java
1
2
3
RequestDispatcher dispatch = request.getRequestDispatcher("firstJsp.jsp");
dispatch.forward(request, response);
//en contracté : request.getRequestDispatcher("firstJsp.jsp").forward(request, response);


Ces lignes de codes signifient en gros que notre servlet, après avoir fait son travail (ici elle n'en fait aucun, mais bon...) confie le tout à la page firstJsp.jsp. Cette page récupère les objets passés en paramètre de la servlet, le code Java à l'intérieur est interprété, ce qui génère du code HTML.
Au final, notre page JSP ne contiendra plus que du code HTML, elle est retournée à Tomcat, qui nous la retourne ! :magicien:

Tu veux dire que nous pouvons utiliser les objets HttpServletRequest et HttpServletResponse dans nos pages JSP ?

Oui, ainsi que tout autre objet Java ! ;)
Par contre, les deux objets cités ci-dessus mis à part, ainsi que l'objet PrintWriter (out est un objet PrintWriter), un import sera nécessaire !
Je vous propose de modifier quelque peu votre JSP...

Code : JSP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<%@ page import="java.util.Enumeration, java.text.SimpleDateFormat, java.util.Date" %>
<html>
<body>
<% out.println("<h1>Nous sommes le : " + new SimpleDateFormat("dd/MM/yyyy").format(new Date()) + "</h1>"); %>
<h1>il est : <%=new SimpleDateFormat("HH:mm:ss").format(new Date()) %></h1>

<%
//Nous allons récupérer les en-têtes 
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
	String element = e.nextElement().toString();
	out.println("<pre>" + element + " : " + request.getHeader(element) + "</pre>");	
}
%>
</body>
</html>


Si cette ligne de code, <%=new SimpleDateFormat("HH:mm:ss").format(new Date()) %> , vous turlupine, ne vous tracassez pas trop...
L'objet SimpleDateFormat prend une chaîne de caractères ("HH:mm:ss") correspondant à "Heures : Minutes : Secondes". On invoque ensuite la méthode format qui met en forme un objet Date : cette ligne de code nous retourne donc l'heure courante. ;)
Tandis que ce format de date : "dd/MM/yyyy" nous retourne la date courante.

Rien ne vous empêche de faire vos imports où vous le souhaitez dans la JSP. Personnellement, je préfère les avoir en haut de page, mais ce n'est qu'un avis personnel !


Vous pouvez tout aussi bien ne pas faire d'import, mais vous devrez spécifier le nom complet de l'objet utilisé (avec le package !).
Donc, partant de ce postulat, ce code :

Code : JSP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<%@ page import="java.util.Enumeration, java.text.SimpleDateFormat, java.util.Date" %>
<html>
<body>
<% out.println("<h1>Nous sommes le : " + new SimpleDateFormat("dd/MM/yyyy").format(new Date()) + "</h1>"); %>
<h1>il est : <%=new SimpleDateFormat("HH:mm:ss").format(new Date()) %></h1>

<%
//Nous allons récupérer les en-têtes 
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
	String element = e.nextElement().toString();
	out.println("<pre>" + element + " : " + request.getHeader(element) + "</pre>");	
}
%>
</body>
</html>


Nous donne le même résultat que ce code :

Code : JSP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<html>
<body>
<% out.println("<h1>Nous sommes le : " + 
                    new java.text.SimpleDateFormat("dd/MM/yyyy")
                    .format(new java.util.Date()) +
               "</h1>"); %>
<h1>il est : <%= new java.text.SimpleDateFormat("HH:mm:ss")
                    .format(new java.util.Date()) %></h1>

<%
	//Nous allons récupérer les en-têtes 
	java.util.Enumeration e = request.getHeaderNames();
	while(e.hasMoreElements()){
		String element = e.nextElement().toString();
		out.println("<pre>" + element + " : " + request.getHeader(element) + "</pre>");	
	}
%>
</body>
</html>


Qui, au final, vous donnera à l'affichage :

Image utilisateur

Vous noterez la façon dont les imports sont faits avec les JSP : <%@ page import="package.Class, autrepackage.AutreClass, ..." %> : retenez bien ceci !

Vous aurez remarqué que j'ai utilisé un raccourci pour écrire des données dans la page : <%= "Une chaîne"%> . Ceci est équivalent à <% out.println("Une chaîne");%>

Par contre, avec ce raccourcis, vous ne DEVEZ PAS terminer votre instruction avec un ";" !


Ceci est correct : <%= "coucou" %> .
Alors que ceci ne l'est pas : <%= "coucou" ; %> .
Nous verrons pourquoi dans la partie II. :-°


Voilà : vous venez de voir comment faire en sorte qu'une servlet délègue l'affichage à une page JSP ! Il reste encore un point à voir pour pouvoir utiliser MVC : le modèle.
Comme je vous l'avais dit plus haut, le modèle peut être divers et varié. Pour nous simplifier cet apprentissage, dans un premier temps, nous allons utiliser un simple objet Java, aussi appelé POJO.
Qu'attendons-nous ? Je vous le demande !

Le modèle

Voici un simple objet nous retournant une couleur de façon aléatoire. Ce dernier est placé dans le package com.servlet.test.model .

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package com.servlet.test.model;

public class ColorModel {

	private String[] colors = new String[]{"red", "green", "yellow", "purple", "pink", "silver", "orange"};
	private String color;
	
	public ColorModel(){
		this.color = colors[Double.valueOf(Math.random()*7).intValue()];
	}
	
	public String getColor(){
		return this.color;
	}
}


Nous allons utiliser ce dernier lorsque vous appellerez une page. Tomcat va utiliser la servlet que nous aurons paramétrée, elle va utiliser cet objet, le passer à une JSP qui sera interprétée et renvoyée ! :)

Il ne nous reste plus qu'à créer une servlet, une JSP et mettre à jour le fichier web.xml ! Fastoche !

Voici notre servlet :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package com.servlet.test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.servlet.test.model.ColorModel;

public class ColorServlet extends HttpServlet {

	public void doGet (HttpServletRequest request, HttpServletResponse response)
						throws ServletException, IOException{
		
		request.setAttribute("colorString", new ColorModel().getColor());
		request.getRequestDispatcher("colorJsp.jsp").forward(request, response);		
	}
	
}


Vous passez des attributs à votre JSP grâce à la méthode setAttribute(String name, Object value); de l'objet HttpServletRequest ! Lorsque vous devrez utiliser ces attributs, c'est via le nom passé en premier paramètre de la méthode que vous les récupérerez !


Notre JSP :

Code : JSP
1
2
3
4
5
6
7
8
<%@ page import="com.servlet.test.model.ColorModel" %>
<html>
<body>
<h1 style="color:<%=request.getAttribute("colorString") %>">
	Récupération de l'attribut "<em>colorString</em>"
</h1>
</body>
</html>


Vous voyez bien comment on récupère les attributs passés à notre JSP depuis la servlet : request.getAttribute(String attributeName); .

Et notre fichier web.xml :

Code : XML
 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
27
28
29
30
31
32
33
34
<web-app>

	<servlet>
		<servlet-class>com.servlet.test.DoIt</servlet-class>
		<servlet-name>firstServlet</servlet-name>
	</servlet>
	
	<servlet>
		<servlet-class>com.servlet.test.InvokeJsp</servlet-class>
		<servlet-name>invoke</servlet-name>
	</servlet>
	
	<servlet>
		<servlet-class>com.servlet.test.ColorServlet</servlet-class>
		<servlet-name>color</servlet-name>
	</servlet>
	
	
	<servlet-mapping>
		<servlet-name>firstServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>invoke</servlet-name>
		<url-pattern>/invoke</url-pattern>
	</servlet-mapping>
	
	<servlet-mapping>
		<servlet-name>color</servlet-name>
		<url-pattern>/color</url-pattern>
	</servlet-mapping>

</web-app>


Vous savez ce qu'il vous reste à faire si vous voulez allez voir ce que ça donne...
Voici deux-trois screens de ce que j'ai pu obtenir :


Screen 1 :


Image utilisateur

Screen 2 :


Image utilisateur


Vous avez réussit à passer une chaîne de caractères en paramètre à votre JSP depuis une servlet. Mais vous devez savoir que vous pouvez aussi passer des objets ! :waw:

Ce que nous allons faire, c'est tout simplement garder notre exemple mais, en plus, passer un objet color et invoquer la méthode getColor() dans notre JSP.

Voici le code de notre servlet :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package com.servlet.test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.servlet.test.model.ColorModel;

public class ColorServlet extends HttpServlet {

	public void doGet (HttpServletRequest request, HttpServletResponse response)
						throws ServletException, IOException{
		request.setAttribute("colorObject", new ColorModel());
		request.setAttribute("colorString", new ColorModel().getColor());
		request.getRequestDispatcher("colorJsp.jsp").forward(request, response);		
	}
	
}


Et le nouveau code de notre JSP :


Code : JSP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<%@ page import="com.servlet.test.model.ColorModel" %>
<html>
<body>

<h1 style="color:<%=((ColorModel)request.getAttribute("colorObject")).getColor() %>">
	Récupération de l'objet "<em>ColorModel</em>"
</h1>
<h1 style="color:<%=request.getAttribute("colorString") %>">
	Récupération de l'attribut "<em>colorString</em>"
</h1>
</body>
</html>


Lorsque vous passez des objets en paramètre, la méthode getAttribute(String name) retourne un type Object : pensez à caster vos attributs !


Voici ce que j'ai obtenu :


Screen 1 :


Image utilisateur

Screen 2 :


Image utilisateur


Vous l'aurez compris, vous pouvez passer les objets que vous souhaitez à vos JSP. Celles-ci s'occuperont de l'affichage des données reçues du contrôleur via le modèle !

Q.C.M.

Les éléments constituant MVC, dans JEE, sont respectivement :
Quelles balises permettent d'insérer du code Java dans les JSP ?
Quel objet Java fait le lien entre une servlet et une JSP ?
Avec quel objet passe-t-on les attributs à une JSP ?
Les imports dans une JSP sont à faire obligatoirement en début de page !

Statistiques de réponses au QCM

Vous devez trouver ça beaucoup plus plus clair...
Quelle bouffée d'oxygène, ces JSP...

Je ne vous le dirai jamais assez, mais entre chaque chapitre, pratiquez, pratiquez et pratiquez !
C'est comme ceci que les choses rentrent le mieux. ;)

En attendant, je vous attends au prochain chapitre.

Attends une seconde ! Tu ne nous a toujours pas expliqué comment les servlets sont gérées par Tomcat !

Je vois que vous êtes avides de savoir.
J'allais justement y venir, mais avant, vous avez encore une petite chose à voir. ;)
Chapitre précédent Sommaire Chapitre suivant

Partager

28 commentaires pour "Gérer l'affichage"
Note moyenne : 3.17 / 4 (294 votes)
Pseudo Commentaire
Hors ligne ouanzai # Posté le 15/07/2011 à 13:07:21

bonjour à tous,

j'ai un soucis au niveau de mon web.xml
Lorsque je souhaite faire le mapping pour InvokeJsp, une erreur apparait sur la console et le projet n'est plus déployé.

voici l'erreur:
GRAVE: erreur lors du déploiement du répertoire test de l'application web.
java.lang.IllegalArgumentException: l'association du l'association de servlet (servlet mapping) indique un nom de servlet inconnu invoke

lorsque je supprime le web.xml tout redeviens normal...
j'ai vérifié plusieurs fois le web.xml et il me semble bon...

Des idées???merci
Hors ligne lonesnake # Posté le 04/08/2011 à 13:27:39
Avatar

Ville : Paris
Pays : France métropolitaine
Études : ETNA

Bonjour,

Je bloque sur le lancement de "color.jsp". Le texte ne s'affiche qu'en noir et quand je cherche à connaître la valeur de "colorString" on me renvoie "null". J'ai tout suivi à la lettre, je ne vois pas d'où vient l'erreur.

--------

Après quelques recherches j'ai fini par trouver tout seul, désolé pour le post.

--------

En fait non je n'y arrive toujours pas.
Hors ligne 7ou7a # Posté le 05/08/2011 à 11:46:11

Bonjour,
j'ai le même problème que lonesnake, sauf que moi je n'ai pas encore trouvé où est le problème
merci de m'aider
Hors ligne af.zakaria # Posté le 31/01/2012 à 01:40:16

Avis : Très bon

J'ai une remarque sur cette instruction:
private String[] colors = new String[]{"red", "green", "yellow", "purple", "pink", "silver", "orange"};

Il suffit de faire:
private String[] colors = {"red", "green", "yellow", "purple", "pink", "silver", "orange"};
Hors ligne albert55 # Posté le 13/02/2012 à 01:39:46

Salut tout le monde !! SVP j'ai un probléme et j'arrive pas à le surmonter et je suis coincé depuis 2 jours !!

En fait il s'agit de la création d'une page JSP dans un projet Tomcat, j'arrive pas à la consulter en tapant l'URL sous la forme : localhost:8080/NomProjet/NomPageJSP.jsp !!
j'ai toujours une erreur 500 qui s'affiche !!
SVP qlq1 peut m'aider ??
Merci en avance

Voir tous les commentaires