• Aucun résultat trouvé

Les objets de la technologie JSP

Dans le document Cours J2EE Approfondi (Page 91-94)

Pour illustrer ce nouveau concept, revenons sur la première JSP que nous avions écrite dans le chapitre sur la transmission des données :

Code : JSP - /WEB-INF/test.jsp

<%@ page pageEncoding="UTF-8" %> <!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title>Test</title>

</head>

<body>

<p>Ceci est une page générée depuis une JSP.</p>

<p>

<%

String attribut = (String) request.getAttribute("test");

out.println( attribut );

</p>

</body> </html>

Je vous avais alors fait remarquer qu'à la ligne 13, nous avions directement utilisé l'objet out sans jamais l'avoir instancié auparavant. De même, à la ligne 12 nous accédions directement à la méthode request.getAttribute() sans jamais avoir instancié d'objet nommé request…

Comment est-ce possible ?

Pour répondre à cette question, nous devons nous intéresser une nouvelle fois au code de la servlet auto-générée par Tomcat, comme nous l'avions fait dans le second chapitre de cette partie. Retournons donc dans le répertoire work du serveur, qui rappelez-vous est subtilisé par Eclipse, et analysons à nouveau le code du fichier test_jsp.java :

Code : Java - Extrait de la servlet auto-générée par Tomcat

...

public void _jspService(final

javax.servlet.http.HttpServletRequest request, final

javax.servlet.http.HttpServletResponse response)

throws java.io.IOException, javax.servlet.ServletException {

final javax.servlet.jsp.PageContext pageContext;

javax.servlet.http.HttpSession session = null;

final javax.servlet.ServletContext application;

final javax.servlet.ServletConfig config;

javax.servlet.jsp.JspWriter out = null;

final java.lang.Object page = this;

javax.servlet.jsp.JspWriter _jspx_out = null;

javax.servlet.jsp.PageContext _jspx_page_context = null;

try {

response.setContentType("text/html");

pageContext = _jspxFactory.getPageContext(this, request,

response,

null, true, 8192, true);

_jspx_page_context = pageContext;

application = pageContext.getServletContext();

config = pageContext.getServletConfig();

session = pageContext.getSession();

out = pageContext.getOut();

_jspx_out = out;

out.write("<!DOCTYPE html>\r\n");

out.write("<html>\r\n");

out.write(" <head>\r\n");

out.write(" <meta charset=\"utf-8\" />\r\n");

out.write(" <title>Test</title>\r\n");

out.write(" </head>\r\n");

out.write(" <body>\r\n");

out.write(" <p>Ceci est une page générée depuis une JSP.</p>\r\n");

out.write(" <p>\r\n");

out.write(" ");

String attribut = (String) request.getAttribute("test");

out.println( attribut );

out.write("\r\n");

out.write(" </p>\r\n");

out.write(" </body>\r\n");

out.write("</html>");

...

Analysons ce qui se passe dans le cas de l'objet out :

à la ligne 10, un objet nommé out et de type JspWriter est créé ; à la ligne 24, il est initialisé avec l'objet writer récupéré depuis la réponse ;

à la ligne 39, c'est tout simplement notre ligne de code Java, basée sur l'objet out, qui est recopiée telle quelle de la JSP vers la servlet auto-générée !

Pour l'objet request, c'est un peu différent. Comme je vous l'ai déjà expliqué dans le second chapitre, notre JSP est ici transformée en servlet. Si elle en diffère par certains aspects, sa structure globale ressemble toutefois beaucoup à celle de la servlet que nous avons créée et manipulée dans nos exemples jusqu'à présent. Regardez la ligne 3 : le traitement de la paire requête/réponse est contenu dans une méthode qui prend pour arguments les objets HttpServletRequest et HttpServletResponse, exactement comme le fait notre méthode doGet() ! Voilà pourquoi il est possible d'utiliser directement les objets request et

response depuis une JSP.

Vous devez maintenant comprendre pourquoi vous n'avez pas besoin d'instancier ou de récupérer les objets out et request avant de les utiliser dans le code de votre JSP : dans les coulisses, le conteneur s'en charge pour vous lorsqu'il traduit votre page en servlet ! Et c'est pour cette raison que ces objets sont dits "implicites" : vous n'avez pas besoin de les déclarer de manière… explicite. Logique, non ?

Par ailleurs, si vous regardez attentivement le code ci-dessus, vous constaterez que les lignes 6 à 13 correspondent en réalité toutes à des initialisations d'objets : pageContext, session, application… En fin de compte, le conteneur met à votre disposition toute une série d'objets implicites, tous accessibles directement depuis vos pages JSP. En voici la liste :

Identifiant Type de l'objet Description

pageContext PageContext

Il fournit des informations utiles relatives au contexte d'exécution. Entre autres, il permet d'accéder aux attributs présents dans les différentes portées de

l'application. Il contient également une référence vers tous les objets implicites suivants.

application ServletContext Il permet depuis une page JSP d'obtenir ou de modifier des informations relativesà l'application dans laquelle elle est exécutée.

session HttpSession Il représente une session associée à un client. Il est utilisé pour lire ou placer desobjets dans la session de l'utilisateur courant.

request HttpServletRequest Il représente la requête faite par le client. Il est généralement utilisé pour accéderaux paramètres et aux attributs de la requête, ainsi qu'à ses en-têtes.

response HttpServletResponse

Il représente la réponse qui va être envoyée au client. Il est généralement utilisé pour définir le Content-Type de la réponse, lui ajouter des en-têtes ou encore pour rediriger le client.

exception Throwable Il est uniquement disponible dans les pages d'erreur JSP. Il représente l'exceptionqui a conduit à la page d'erreur en question.

out JspWriter Il représente le contenu de la réponse qui va être envoyée au client. Il est utilisépour écrire dans le corps de la réponse.

config ServletConfig Il permet depuis une page JSP d'obtenir les éventuels paramètres d'initialisationdisponibles.

page objet this

Il est l'équivalent de la référence this et représente la page JSP courante. Il est déconseillé de l'utiliser, pour des raisons de dégradation des performances notamment.

De la même manière que nous avons utilisé les objets request et out dans notre exemple précédent, il est possible d'utiliser n'importe lequel de ces neuf objets à travers le code Java que nous écrivons dans nos pages JSP…

Eh oui, tout cela est bien aimable de la part de notre cher conteneur, mais des objets sous cette forme ne vont pas nous servir à grand-chose ! Souvenez-vous : nous avons pour objectif de ne plus écrire de code Java directement dans nos pages.

Dans le document Cours J2EE Approfondi (Page 91-94)