• Aucun résultat trouvé

Pour résumer

Dans le document Cours J2EE Approfondi (Page 144-146)

Récapitulons tout cela avec un exemple assez complet :

Code : JSP

<%-- L'url avec paramètres ainsi générée --%> <c:url value="/monSiteWeb/countZeros.jsp">

<c:param name="nbZeros" value="123"/>

<c:param name="date" value="22/06/2010"/> </c:url>

<%-- Sera rendue ainsi dans la page web finale,

si le cookie est présent et le contexte est Test --%>

/Test/monSiteWeb/countZeros.jsp?nbZeros=123&date=22%2f06%2f2010

<%-- Et sera rendue sous cette forme si le cookie est absent --%>

/Test/monSiteWeb/countZeros.jsp;jsessionid=A6B57CE08012FB431D? nbZeros=123&date=22%2f06%2f2010

Vous pouvez ici observer :

la mise en place de paramètres via <c:param> ;

l'ajout automatique du contexte en début de l'URL absolue ;

l'encodage automatique des paramètres (ici les caractères / dans la date sont transformés en %2f) ; le non-encodage de l'URL (le caractère & séparant les paramètres n'est pas transformé) ;

l'ajout automatique de l'identifiant de session. Remarquez d'ailleurs ici sa présence avant les paramètres de la requête, et non après.

Redirection

La balise <c:redirect> est utilisée pour envoyer un message de redirection HTTP au navigateur de l'utilisateur. Si elle ressemble à l'action <jsp:forward>, il existe toutefois une grosse différence, qui réside dans le fait qu'elle va entraîner un changement de l'URL dans le navigateur de l'utilisateur final, contrairement à <jsp:forward> qui est transparente du point de vue de l'utilisateur (l'URL dans la barre de navigation du navigateur n'est pas modifiée).

La raison de cette différence de comportement est simple : le forwarding se fait côté serveur, contrairement à la redirection qui est effectuée par le navigateur. Cela limite par conséquent la portée de l'action de forwarding qui, puisque exécutée côté serveur,

est limitée aux pages présentes dans le contexte de la servlet utilisée. La redirection étant exécutée côté client, rien ne vous empêche de rediriger l'utilisateur vers n'importe quelle page web.

Au final, le forwarding est plus performant, ne nécessitant pas d'aller-retour passant par le navigateur de l'utilisateur final, mais il est moins flexible que la redirection. De plus, utiliser le forwarding impose certaines contraintes : concrètement, l'utilisateur

final n'est pas au courant que sa requête a été redirigée vers une ou plusieurs servlets ou JSP différentes, puisque l'URL qui est affichée dans son navigateur ne change pas. En d'autres termes, cela veut dire que l'utilisateur ne sait pas si le contenu qu'il

visualise dans son navigateur a été produit par la page qu'il a appelée via l'URL d'origine, ou par une autre page vers laquelle la première servlet ou JSP appelée a effectué un forwarding ! Ceci peut donc poser problème si l'utilisateur rafraîchit la page par exemple, puisque cela appellera à nouveau la servlet ou JSP d'origine... Sachez enfin que lorsque vous utilisez le forwarding , le code présent après cette instruction dans la page n'est pas exécuté.

Bref, je vous conseille, pour débuter, d'utiliser la redirection via la balise <c:redirect> plutôt que l'action standard JSP, cela vous évitera bien des ennuis. Voyons pour terminer quelques exemples d'utilisation :

Code : JSP

<%-- Forwarding avec l'action standard JSP --%> <jsp:forward page="/monSiteWeb/erreur.jsp"> <%-- Redirection avec la balise redirect --%> <c:redirect url="http://www.siteduzero.com"/>

<%-- Les attributs valables pour <c:url/> le sont aussi pour la redirection.

Ici par exemple, l'utilisation de paramètres --%> <c:redirect url="http://www.siteduzero.com">

<c:param name="mascotte" value="zozor"/>

<c:param name="langue" value="fr"/> </c:redirect>

<%-- Redirigera vers --%>

http://www.siteduzero.com?mascotte=zozor&langue=fr

Imports

La balise <c:import> est en quelque sorte un équivalent à <jsp:include>, mais qui propose plus d'options, et pallie ainsi les manques de l'inclusion standard.

L'attribut url est le seul paramètre obligatoire lors de l'utilisation de cette balise, et il désigne logiquement le fichier à importer :

Code : JSP

<%-- Copie le contenu du fichier ciblé dans la page actuelle --%> <c:import url="exemple.html"/>

Un des avantages majeurs de la fonction d'import est qu'elle permet d'utiliser une variable pour stocker le flux récupéré, et ne propose pas simplement de l'inclure dans votre JSP comme c'est le cas avec <jsp:include>. Cette fonctionnalité est importante, puisqu'elle permet d'effectuer des traitements sur les pages importées. L'attribut utilisé pour ce faire est nommé

varReader. Nous reverrons cela en détail lorsque nous découvrirons la bibliothèque xml de la JSTL, où ce système prend toute

son importance lorsqu'il s'agit de lire et de parser des fichiers XML :

Code : JSP

<%-- Copie le contenu d'un fichier xml dans une variable

(fileReader),

puis parse le flux récupéré dans une autre variable (doc). --%> <c:import url="test.xml" varReader="fileReader">

<x:parse var="doc" doc="${fileReader}" /> </c:import>

Ne vous inquiétez pas si la ligne <x:parse var="doc" doc="${fileReader}" /> vous est inconnue, c'est une balise de la bibliothèque xml de la JSTL que je vous présenterai dans le chapitre suivant. Vous pouvez cependant retenir l'utilisation du <c:import> pour récupérer un flux xml.

Note : le contenu du varReader utilisé, autrement dit la variable dans laquelle est stocké le contenu de votre fichier, n'est accessible qu'à l'intérieur du corps de la balise d'import, entre les tags <c:import> et </c:import>. Il n'est par conséquent pas possible de s'en servir en dehors. Dans le chapitre portant sur la bibliothèque xml, nous

découvrirons un autre moyen, permettant de pouvoir travailler sur le contenu du fichier en dehors de l'import, au travers d'une variable de scope.

De la même manière que la redirection par rapport au forwarding , <c:import> permet d'inclure des pages extérieures au contexte de votre servlet ou à votre serveur, contrairement à l'action standard JSP. Voyons une nouvelle fois quelques exemples d'utilisation :

Code : JSP

<%-- Inclusion d'une page avec l'action standard JSP. --%> <jsp:include page="index.html" />

<%-- Importer une page distante dans une variable Le scope par défaut est ici page si non précisé. --%>

<c:import url="http://www.siteduzero.com/zozor/biographie.html" var="bio" scope="page"/>

<%-- Les attributs valables pour <c:url/> le sont aussi pour la redirection.

Ici par exemple, l'utilisation de paramètres --%> <c:import url="footer.jsp">

<c:param name="design" value="bleu"/> </c:import>

Dans le document Cours J2EE Approfondi (Page 144-146)