Une page JSP
avec l'utilisation de la librairie JSTL
et des EL
(Element Language) utilise du code HTML
dans lequel est mis des tags provenant de la librairie JSTL
. Ce sont ces tags qui appellent les fonctions Java
. Le code généré par les appels aux fonctions JSP
et JSTL
est du HTML 4.01
.
Tous les exemples ci-dessous utilisent le BeanPersonne ainsi que la librairie JSTL 2 qui supportent les EL.
Voir JSP.
Nécessite un projet de type Dynamic Web Project et l'installation_d_une_librairie de la librairie JSTL (bien installer les 2 parties API et Implementation).
org.apache.jasper.JasperException: L'uri absolue: http://java.sun.com/jsp/jstl/core ne peut être résolu dans le fichier web.xml ou dans les fichiers jar déployés avec cette application org.apache.jasper.compiler.DefaultErrorHandler.jspError(Unknown Source) org.apache.jasper.compiler.ErrorDispatcher.dispatch(Unknown Source) org.apache.jasper.compiler.ErrorDispatcher.jspError(Unknown Source) org.apache.jasper.compiler.TagLibraryInfoImpl.generateTldResourcePath(Unknown Source) org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(Unknown Source) org.apache.jasper.compiler.Parser.parseTaglibDirective(Unknown Source) org.apache.jasper.compiler.Parser.parseDirective(Unknown Source) org.apache.jasper.compiler.Parser.parseElements(Unknown Source) org.apache.jasper.compiler.Parser.parse(Unknown Source) org.apache.jasper.compiler.ParserController.doParse(Unknown Source) org.apache.jasper.compiler.ParserController.parse(Unknown Source) org.apache.jasper.compiler.Compiler.generateJava(Unknown Source) org.apache.jasper.compiler.Compiler.compile(Unknown Source) org.apache.jasper.compiler.Compiler.compile(Unknown Source) org.apache.jasper.compiler.Compiler.compile(Unknown Source) org.apache.jasper.JspCompilationContext.compile(Unknown Source) org.apache.jasper.servlet.JspServletWrapper.service(Unknown Source) org.apache.jasper.servlet.JspServlet.serviceJspFile(Unknown Source) org.apache.jasper.servlet.JspServlet.service(Unknown Source) javax.servlet.http.HttpServlet.service(Unknown Source) org.apache.tomcat.websocket.server.WsFilter.doFilter(Unknown Source)
Soit la librairie jstl-1.2.jar est manquante dans le dossier WEB-INF/lib
, soit elle n'est pas la bonne version. Il existe aussi une version jar qui contient à la fois l'API et l'implémentation, Archive JSTL 1.2.
How to install JSTL? The absolute uri: http://java.sun.com/jstl/core cannot be resolved Archive du 08/02/2011 le 26/04/2020
Rappel de JSP, les objets implicites sont (Présentation des Expressions Languages Archive du 08/08/2011 le 26/04/2020) :
pageContext
: Accès à l'objet PageContext de la page JSP.pageScope
: Map permettant d'accéder aux différents attributs du scope 'page'.requestScope
: Map permettant d'accéder aux différents attributs du scope 'request'.sessionScope
: Map permettant d'accéder aux différents attributs du scope 'session'.applicationScope
: Map permettant d'accéder aux différents attributs du scope 'application'.param
: Map permettant d'accéder aux paramètres de la requête HTTP sous forme de String.paramValues
: Map permettant d'accéder aux paramètres de la requête HTTP sous forme de tableau de String.header
: Map permettant d'accéder aux valeurs du Header HTTP sous forme de String.headerValues
: Map permettant d'accéder aux valeurs du Header HTTP sous forme de tableau de String.cookie
: Map permettant d'accéder aux différents Cookies.initParam
: Map permettant d'accéder aux init-params du web.xml.
<c:out value="{2+4}" default="6" />
: affiche le résultat de l'expression 2+4
. Si l'évaluation échoue, la valeur par défaut sera affichée. Cette balise échappe aussi les caractères spéciaux (&, <, >, …).
<c:set var="somme" value=${2+4} />
: définie une variable.
<c:if test="${EL}">…</c:if>
: test conditionnel. Il n'existe pas de else. Pour en simuler un, il faut passer par la balise choose
avec sa sous-balise otherwise
.
<c:choose><c:when test="${EL}">…</c:when><c:otherwise>…</c:otherwise></c:choose>
: équivalent à switch
, case
, default
.
<c:choose> <c:when test="${16 % 2 == 0}"> <c:out value="16 est un nombre pair." /> </c:when> <c:otherwise> <c:out value="16 est un nombre impair." /> </c:otherwise> </c:choose>
<c:forEach>
: boucle soit d'une variable variant de n
à m
, soit en parcourant tous les éléments de type liste (HashMap
, Collection
, …).
<c:forEach var="i" begin="1" end="10" step="1"> <c:out value="${i}" /> </c:forEach>
<c:forEach var="perso" items="${liste}"> <tr> <td><c:out value="${perso.taille}" /></td> <td><c:out value="${perso.yeuxBleus}" /></td> </tr> </c:forEach>
<c:url value="/urlbase/"><c:param name="param" value="valeur" /></c:url>
: ajout avant la base l'équivalent d'un #{pageContext.request.contextPath}
. Le rendu sera, par exemple : /jstl/urlbase/?param=valeur
et le lien renverra alors vers http://localhost:8080/jstl/urlbase/?param=valeur
.
Bien importer la JSTL 1.2 (et 1.1) avec uri="http://java.sun.com/jsp/jstl/core"
et non pas la JSTL 1.0 qui s'importe avec uri="http://java.sun.com/jstl/core"
. Can not find the tag library descriptor for “http://java.sun.com/jsp/jstl/core” Archive du 08/11/2012 le 26/04/2020
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <p> <c:if test="${15 % 2 == 0}"> <c:out value="15 est un nombre pair." /> </c:if> <c:if test="${15 % 2 == 1}"> <c:out value="15 est un nombre impair." /> </c:if> <br /> <c:choose> <c:when test="${16 % 2 == 0}"> <c:out value="16 est un nombre pair." /> </c:when> <c:otherwise> <c:out value="16 est un nombre impair." /> </c:otherwise> </c:choose> </p> </body> </html>
Rendu :
15 est un nombre impair. 16 est un nombre pair.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <jsp:useBean id="perso1" scope="session" class="com.llgc.BeanPersonne"> <jsp:setProperty property="taille" name="perso1" value="170" /> </jsp:useBean> <jsp:setProperty property="yeuxBleus" name="perso1" value="true" /> <jsp:useBean id="perso2" scope="session" class="com.llgc.BeanPersonne"> <jsp:setProperty property="taille" name="perso2" value="160" /> </jsp:useBean> <jsp:setProperty property="yeuxBleus" name="perso2" value="false" /> <p> La personne 1 possède une taille de ${sessionScope.perso1.taille} cm et <c:if test="${!perso1.yeuxBleus}"> n'a pas </c:if> <c:if test="${perso1.yeuxBleus}"> <c:out value="a" /> </c:if> les yeux bleus.<br /> La personne 2 possède une taille de ${perso2.taille} cm et <c:if test="${!perso2.yeuxBleus}"> n'a pas </c:if> <c:if test="${perso2.yeuxBleus}"> <c:out value="a" /> </c:if> les yeux bleus. </p> </body> </html>
Rendu :
La personne 1 possède une taille de 170 cm et a les yeux bleus. La personne 2 possède une taille de 160 cm et n'a pas les yeux bleus.
Voir JSP
Voir JSP
Ajout de :
servlet
et son servlet-mapping
s'appliquant à indexjsp-jstl4.jsp
,context-param
,<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>EL</display-name> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> </servlet> <servlet> <servlet-name>JSP2</servlet-name> <jsp-file>/indexjsp-jstl4.jsp</jsp-file> <init-param> <param-name>user2</param-name> <param-value>utilisateurServlet</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>JSP2</servlet-name> <url-pattern>/indexjsp-jstl4.jsp</url-pattern> </servlet-mapping> <context-param> <param-name>user</param-name> <param-value>utilisateur</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>mot de passe</param-value> </context-param> <context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> … </web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <p> nom : ${initParam['user']}<br /> pass : ${initParam['password']}<br /> driver : ${initParam['driver']}<br /> nom2 : <%=config.getInitParameter("user2")%><br /> </p> </body> </html>
Il se semble pas possible de pouvoir accéder aux init-param
qui sont contenus dans le bloc servlet
sans passer par des scriptlets
. Il convient donc d'utiliser de préférence les context-param
qui sont accessibles via initParam['nom']
Init Params Thru Expression Language Archive du 03/01/2016 le 26/04/2020.
Rendu :
nom : utilisateur pass : mot de passe driver : com.mysql.jdbc.Driver nom2 : utilisateurServlet
Tout comme pour l'exemple 4, il n'est pas possible de modifier les cookies sans passer par des commandes Java. Il est donc nécessaire de passer par l'intermédiaire d'une servlet
.
package com.llgc; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletJSP5 */ @WebServlet ("/ServletJSP5") public class ServletJSP5 extends HttpServlet { /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding ("UTF-8"); String value = getCookie (request.getCookies (), "compteur"); response.setContentType ("text/html"); int compteur = 0; if (value != null) { compteur = Integer.parseInt (value); } compteur++; Cookie c = new Cookie ("compteur", "" + compteur); c.setMaxAge (3600); response.addCookie (c); this.getServletContext ().getRequestDispatcher ("/WEB-INF/indexjsp-jstl5.jsp").forward (request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet (request, response); } // Renvoie la valeur d'un cookie. protected static String getCookie (Cookie[] cookies, String cookieName) { if (cookies == null) { return null; } for (int i = 0; i < cookies.length; i++) { if (cookieName.equalsIgnoreCase (cookies[i].getName ())) { return cookies[i].getValue (); } } return null; } }
Le fichier .jsp
est mis dans le dossier WEB-INF
. Ainsi, seulement la servlet
a accès au fichier.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <p> <c:if test="${not empty cookie.compteur}">compteur : ${cookie.compteur.value}</c:if> <c:if test="${empty cookie.compteur}">Pas de cookie, allez cuisiner !!!</c:if> </p> </body> </html>
Rendu 1 :
Pas de cookie, allez cuisiner !!!
Rendu 2 :
compteur : 1
La liste est générée par une classe Java Liste6 et affiche un type BeanPersonne.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <table border="1"> <tr> <td>Taille</td> <td>Yeux bleus</td> </tr> <c:forEach var="perso" items="${liste6.getListePersonne ()}"> <tr> <td><c:out value="${perso.taille}" /></td> <td><c:out value="${perso.yeuxBleus}</td> </tr> </c:forEach> </table> </body> </html>