Développer des balises personnalisées pour JSTL

Lorsque les bibliothèques JSTL intégrées ne couvrent pas tous les besoins, il est possible de créer des balises personnalisées. Ces balises sont implémentées sous forme de classes Java qui étendent la classe SimpleTagSupport, permettant ainsi de définir des comportements sur mesure.

La première étape consiste à créer une classe Java. Cette classe doit hériter de SimpleTagSupport et redéfinir la méthode doTag(). Voici un exemple modifié avec des noms de propriétés et de méthodes différents, tout en conservant la même logique fondamentale :

package com.exemple.balises;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class MonBalisePersonnalisee extends SimpleTagSupport {
    private String nomElement = "div";  // Valeur par défaut modifiée

    public void setNomElement(String nomElement) {
        this.nomElement = nomElement;
    }

    private int nombreRepetitions;

    public void setNombreRepetitions(int nombreRepetitions) {
        this.nombreRepetitions = nombreRepetitions;
    }

    @Override
    public void doTag() throws JspException, IOException {
        JspFragment corps = getJspBody();
        getJspContext().getOut().write("<" + nomElement + ">");
        for (int i = 0; i < nombreRepetitions; i++) {
            corps.invoke(null);
        }
        getJspContext().getOut().write("</" + nomElement + ">");
    }
}

Ensuite, il faut configurer un fichier TLD (Tag Library Descriptor) dans le répertoire WEB-INF de votre projet web. Ce fichier déclare la balise et ses attributs. L'exemple ci-dessous illustre une configuration modifiée avec des noms et descriptions adaptés :

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

  <description>Bibliothèque de balises personnalisées pour JSTL</description>
  <display-name>Balises Personnalisées</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>custom</short-name>
  <uri>http://exemple.com/balises/personnalisees</uri>

  <tag>
    <description>Balise qui enveloppe le contenu dans un élément HTML répété.</description>
    <name>envelopper</name>
    <tag-class>com.exemple.balises.MonBalisePersonnalisee</tag-class>
    <body-content>scriptless</body-content>

    <attribute>
      <description>Nom de l'élément HTML à utiliser.</description>
      <name>nomElement</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>

    <attribute>
      <description>Nombre de fois que le contenu doit être répété.</description>
      <name>nombreRepetitions</name>
      <required>true</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>

</taglib>

Pour utiliser la balise dans une page JSP, importez-la avec la directive taglib en spécifiant l'URI définie dans le fichier TLD. Voici un exemple de page JSP modifiée :

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="custom" uri="http://exemple.com/balises/personnalisees" %>
<html>
<head>
<title>Exemple de balise personnalisée</title>
</head>
<body>
<custom:envelopper nombreRepetitions="3" nomElement="section">
Contenu à répéter.
</custom:envelopper>
</body>
</html>

En exécutant cette page, le contenu sera enveolppé dans trois balises section HTML, démotnrant ainsi le fonctionnement de la balise personnalisée.

Étiquettes: JSTL JSP Java TLD SimpleTagSupport

Publié le 3 juin à 00h28