Servlets et JSP : la JSTL

Quelques liens utiles

Le but de ce TP est de se familiariser avec l'utilisation de librairie de balises et notamment de la JSTL (Java Standard Tag Library).

Utiliser le langage d'expression (EL)

Depuis la version 2.0 des JSP, il est possible de placer à n'importe quel endroit d'une page JSP des expressions qui sont évaluées et remplacées par le résultat de leur évaluation. La syntaxe est la suivante :

 ${ expression }

Voila quelques exemples d'utilisation :

Travail à faire :

Java Standard Tag Library

Récupérer et installer la JSTL 1.2

Documentations :

Travail : Ajoutez la dépendance ci-dessous dans le fichier pom.xml :

<!-- pour utiliser la JSTL (implémentation) -->
<dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-impl</artifactId>
        <version>1.2.5</version>
</dependency>
<!-- pour utiliser la JSTL (spécification) -->
<dependency>
        <groupId>org.apache.taglibs</groupId>
        <artifactId>taglibs-standard-spec</artifactId>
        <version>1.2.5</version>
</dependency>

Remarque : Je vous encourage fortement à lire (après le TP) le cours sur la JSTL (lien ci-dessus). Il explique bien le fonctionnement de ses balises et donne de nombreux exemples.

Utiliser la JSTL

Pour utiliser la JSTL 1.2.x dans une application basée sur un conteneur WEB respectant le standard JSP 2.0, il suffit de copier dans le répertoire WEB-INF/lib de votre application WEB les fichiers *.jar qui se trouvent dans la distribution de la JSTL. Ce travail est déjà réalisé par Maven.

Il est notamment inutile de copier les fichiers .tld. Ceux-ci se trouvent dans les .jar et sont pris en compte automatiquement. Une fois le contexte de votre application relancé, vous pouvez essayer la page suivante :

<html>
<body>

<!-- controle, iterations, tests, variables -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- traitement XML -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<!-- formattage des donnees -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- SQL/JDBC -->
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>


<p>Les parametres:</p>

<ul>
<c:forEach var="aParam" items="${param}">
  <li>un parametre :
    <c:out value="${aParam.key}"/> = <c:out value="${aParam.value}"/>
  </li>
</c:forEach>
</ul>

<c:choose>
  <c:when test="${param['question'] == 'oui'}">
     <p>OUI</p>
  </c:when>
  <c:otherwise>
     <p>NON</p>
  </c:otherwise>
</c:choose>

</body>
</html>

Travail à faire :

Les filtres

Créez dans votre application le filtre ci-dessous (en adaptant l'URL des adresses à traiter) :

package myapp;

import java.io.IOException;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

@WebFilter(
    dispatcherTypes = {
        DispatcherType.REQUEST, DispatcherType.FORWARD,
        DispatcherType.INCLUDE, DispatcherType.ERROR
    },
    urlPatterns = { "*" }
)
public class SimpleFilter implements Filter {

    public void init(FilterConfig fConfig) throws ServletException {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException
    {
        System.err.printf("Before %s\n", request);
        if (request instanceof HttpServletRequest) {
            HttpServletRequest hr = (HttpServletRequest) request;
            System.err.printf("Before Http Request %s\n", hr);
        }
        chain.doFilter(request, response);
        System.err.printf("After %s\n", request);
    }

}

et vérifier son fonctionnement. Il permet d'insérer des traitements automatisés avant et après chaque requête et donc d'appliquer des politiques de sécurité.

Travail à faire : Avec le filtre, interdisez les requêtes qui ne proviennent pas de l'adresse 127.0.0.1 (utilisez request.getRemoteAddr()). L'interception consiste à ne pas appeler la méthode doFilter.

Les listeners

Ajoutez à votre application, la classe d'écoute :

package myapp;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

@WebListener
public class SimpleListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
    }

}

et explorez les possibilités de l'argument passé à chaque méthode. Vous pouvez également vous intéresser aux interfaces