Les JSP permettent de mêler simplement du code HTML statique avec du code généré.
Technologie concurrente de ASP, PHP ou ColdFusion.
Plus simple à écrire que des servlettes, pas besoin de compilation en première approche.
Le pages JSP sont traduites en servlettes. La classe de la servlette est générée dynamiquement lors du premier accès à la page. C'est une sous-classe de javax.servlet.jsp.HttpJspBase, elle-même sous-classe de javax.servlet.http.HttpServlet. La méthode service() appelle la méthode _jspService() qui retourne la page produite.
Code HTML de la page JSP est transmis tel quel, sauf <% qui peut être déspécialisé en <\%.
Commentaires JSP <%-- comment --%> ne sont pas transmis au client contrairement au commentaires HTML <!-- comment -->.
Version stable actuelle des JSP 1.1.
Format : <%= expression %> ou <jsp:expression> expression </jsp:expression>
Insère, par un appel à out.print(), la valeur d'une expression Java. Le code est inclus dans la méthode _jspService().
Exemple : <%= new java.util.Date() %>
Des variables sont prédéfinies :
request de type HttpServletRequest ;
response de type HttpServletResponse ;
out de type JspWriter, sous-type de PrintWriter ;
session de type HttpSession ;
application de type ServletContext ;
config de type ServletConfig ;
pageContext de type PageContext (permet de partager des données entre pages) ;
page équivalent à this.
Format : <% code %> ou <jsp:scriptlet> code </jsp:scriptlet>.
Permet d'insérer dans la page des morceau de code Java qui seront évalués au moment de la requête.
Le code des scriptlettes sont inclus dans la méthode _jspservice().
Exemple :
<% if (request.getParameter("color")==null){ %> Donner une couleur ! <% } else { %> La couleur est <%= request.getParameter("color") %> <% } %>
Format : <%! déclaration %> ou <jsp:declaration> déclaration </jsp:declaration>.
Permet de définir des variables ou des méthodes. Les variables et les méthodes déclarées peuvent être utilisées dans les expressions et les scriptlettes de la page. Les variables et les méthodes sont insérées dans la classe générée en dehors de la méthode _jspService(). Les variables sont donc créées au moment de la création de l'instance de classe associée à la page JSP. À moins que la classe n'implante l'interface SingleThreadModel, il n'existe qU'une seule instance de la classe et les méthodes et les variables déclarées de cette manière sont accédées de façon concurrente.
Exemple :
<%! private int accessNb = 0 %> Page accédée : <%= ++accessNb %>
Différentes directives de page JSP permettent de configurer finement la servlette générée :
<%@ page import="java.util.Date, java.io.*" %> importe un ensemble de classes ;
<%@ page contentType="text/plain" %> type (MIME) le contenu de la page retournée. Le défaut est text/html ;
<%@ page isThreadSafe="true" %> précise que la servlette générée ne doit pas implanter l'interface SingleThreadModel. Le défaut est true ;
<%@ page session="false" %> précise que la page ne participe pas à une session. La variable session n'est plus accessible. Le défaut est true ;
<%@ page buffer="none" %> ou <%@ page buffer="100" %> précise la taille en kilo-octets du tampon de sortie de l'objet out de la classe Writer. Par défaut, les données sont mise en tampon jusqu'à ce que le tampon soit plein. La mise en tampon permet de changer les en-têtes après avoir commencé à générer un partie du document ;
<%@ autoflush="false" %> précise qu'une exception doit être levée quand le tampon est plein. Le défaut (true) consiste à vider le tampon quand il est plein ;
<%@ extends="A" %> précise que la servlette générée doit étendre la classe A plutôt que de celle définie par défaut dans le moteur de JSP. Pour les experts !
<%@ info="Information" %> définit le message retourné par la méthode getServletInfo() ;
<%@ errorPage="Erreur.html" %> précise que la page à retourner en cas d'exception est Erreur.html (URL relatif) ;
<%@ isErrorPage="true" %> précise que la page est une page d'erreur associée une autre JSP. Dans cette page la variable exception est définie et elle contient l'exception qui a entraîné l'affichage de la page.
Il est également possible d'utiliser la syntaxe <jsp:directive.page ... />.
La balise <%@ include file="page.jsp" %> inclut le fichier page.jsp dans la page au moment de la traduction de la page en servlette. Attention, la recompilation n'est pas automatique en cas de modification de la page incluse.
La balise <jsp:include page="page.jsp" /> inclut au moment de la requête la page produite par la page page.jsp. Le code inclus n'est pas réinterprété au moment de l'inclusion et ne peut donc pas contenir de balise JSP. La valeur de l'attribut flush est toujours true.
La balise <jsp:forward page="page.jsp" /> redirige la requête vers une autre ressource.
Écrire un composant JavaBean consiste à respecter un format standard pour les classes. Le but est de permettre de découvrir des informations sur les classes qui respectent ce format.
Pour les JSP le seul format à respecter est le suivant :
la classe doit avoir un constructeur sans argument ;
la classe ne doit pas avoir d'attribut public ;
la classe doit avoir des méthodes accesseurs vers ses membres particuliers appelés propriétés. Pour une propriété de nom prop les méthodes setProp() et getProp() doivent être définies. Si la propriété est de type booléen la méthode getProp() est remplacée par isProp().
Pour associer un JavaBean à une page il suffit d'utiliser la balise suivante :
<jsp:useBean id="nom" class="paquetage.Class" />
Par défaut, une instance de la classe paquetage.Class est créée au moment de la requête à la page. L'instance pourra être accédée dans la page sous le nom : nom. Si l'on désire typer l'instance par autre chose que la classe il est possible d'ajouter un attribut type dans la balise. La version compilée de classe de l'instance doit être placée au même endroit que les servlettes.
Une balise particulière permet alors d'accéder aux propriétés de l'instance :
<jsp:getProperty name="nom" property="prop" /> elle est équivalente à <%= nom.getProp() %>.
Inversement une autre balise permet de modifier la propriété.
<jsp:setProperty name="nom" property="prop" value="valeur" />
La valeur peut elle même être une balise JSP comme par exemple :
<jsp:setProperty name="nom" property="prop" value='<%= request.getParameter("param") %>' />
Une balise permet d'associer directement la valeur d'un paramètre à la propriété :
<jsp:setProperty name="nom" property="prop" param="param" />
Une autre permet d'associer tous les paramètres aux propriétés de même nom :
<jsp:setProperty name="nom" property="*" />
Ces associations entraînent une conversion implicite des chaînes de caractères valeurs des paramètres dans le type des propriétés.
Par défaut, une instance du JavaBean est créée au moment de la requête. Il est également possible de partager une même instance entre les requêtes. Pour cela il faut ajouter l'attribut scope à la balise <jsp:useBean ... />. Cet attribut peut prendre les valeurs page (défaut), request, session et application. Par défaut, le JavaBean ne sort pas de la page. Dans le cas de request, le JavaBean est partagé entre les pages que résolvent la requête, placée dans les attributs de ServletRequest. Dans le cas de session le JavaBean est associé à la session et dans le cas d'application, un seul JavaBean est créé pour l'application.
Il est possible de conditionner l'inclusion de certains élément à l'instanciation du JavaBean. La forme est la suivante :
<jsp:useBean id="nom" class="paquetage.Class" scope="application"> élément contionnels. <jsp:useBean />