Outils pour utilisateurs

Outils du site


helloworld:web:java:jsp_jstl_el

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.

Cycle de vie

Voir JSP.

Création du projet

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

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

Element Language

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.

Syntaxe

<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.

Exemple 1 - La base

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

indexjsp-jstl.jsp
<%@ 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.

Exemple 2 - Utilisation d'un Bean

indexjsp-jstl2.jsp
<%@ 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.

Exemple 3 - Formulaire avec Bean global et session

Voir JSP

Exemple 3b - avec validation des données

Voir JSP

Exemple 4 - context-param et init-param

Ajout de :

  • un servlet et son servlet-mapping s'appliquant à indexjsp-jstl4.jsp,
  • trois context-param,
web.xml
<?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>
indexjsp-jstl4.jsp
<%@ 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

Exemple 5 - Cookies

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.

ServletJSP5.java
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.

indexjsp-jstl5.jsp
<%@ 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

Exemple 6 - Affichage d'une liste dans un tableau

La liste est générée par une classe Java Liste6 et affiche un type BeanPersonne.

indexjsp-jstl6.jsp
<%@ 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>

Rendu : Rendu exemple 6

helloworld/web/java/jsp_jstl_el.txt · Dernière modification : 2020/04/26 20:27 de root