[JAVA] Exemple pour créer une balise personnalisée pour JSP

J'ai parfois créé une balise personnalisée pour jsp, donc c'est un échantillon plutôt qu'un mémo. Veuillez accepter (´ ・ ω ・ `)

Commençons par la définition des exigences! C'est facile car c'est un exemple, mais je l'ai résumé comme suit.

--Afficher les résultats de la recherche dans la base de données sous forme de menu déroulant --Cependant, puisqu'il s'agit d'un échantillon, la base de données est implémentée comme une maquette.

Préparation: Créez une couche d'accès à la base de données et un servlet.

Puisque nous voulons créer une balise personnalisée qui affiche les résultats de la recherche de base de données, nous allons créer une classe qui montre l'accès à la base de données et les résultats de la recherche. Nous avons également besoin d'un servlet pour afficher jsp, alors créez-le également. Voici l'exemple de code, mais la déclaration __package, la déclaration d'importation, Getter et Setter sont omis car ils sont redondants. __ Cependant, je vous serais reconnaissant si vous pouviez juger de la structure du package en fonction de l'image affichée au début (´ ・ ω ・ `)

image

DB.java


/**
 *Classe d'accès à la base de données. Cependant, puisqu'il s'agit d'un échantillon, il s'agit d'une implémentation simulée.
 */
public class DB implements Serializable {    
    private List<Row> rows;
    
    /**
     *constructeur. Créez une instance et entrez les données initiales dans la base de données fictive.
     */
    public DB() {
        this.rows = new ArrayList<>();
        
        this.rows.add(new Row("group1", "A", "AAA"));
        this.rows.add(new Row("group1", "B", "BBB"));
        this.rows.add(new Row("group1", "C", "CCC"));
        this.rows.add(new Row("group1", "D", "DDD"));
        this.rows.add(new Row("group1", "E", "EEE"));
        
        this.rows.add(new Row("group2", "a", "Ah ah"));
        this.rows.add(new Row("group2", "b", "Bien"));
        this.rows.add(new Row("group2", "c", "Uuu"));
        this.rows.add(new Row("group2", "d", "Yeah Yeah"));
        this.rows.add(new Row("group2", "e", "Oh oh"));
    }
    
    /**
     *Recherchez dans la base de données en utilisant le groupe comme clé.
     * @valeur de la colonne du groupe de paramètres
     * @renvoyer les résultats de la recherche
     */
    public List<Row> select(String group) {
        return rows.stream()
                .filter(row -> row.getGroup().equals(group))
                .collect(Collectors.toList());
    }
}

Row.java


/**
 * com.sample.db.Une classe de bean qui indique une ligne dans la base de données indiquée par la classe DB.
 */
final public class Row implements Serializable {
    private String group;
    private String id;
    private String name;

    public Row(String group, String id, String name) {
        this.group = group;
        this.id = id;
        this.name = name;
    }
}

SampleServlet.java


/**
 * sample.Un servlet pour afficher jsp.
 */
@WebServlet("/sample")
public class SampleServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/sample.jsp");
        dispatcher.forward(request, response);
    }
}

Implémentez un gestionnaire de balises.

Maintenant que les conditions préalables sont en place, implémentez un gestionnaire de balises qui est une classe Java qui correspond à votre balise personnalisée. Le gestionnaire de balises est réalisé en implémentant l'interface javax.servlet.jsp.tagext.Tag, et l'exemple de code est le suivant.

Select.java


public class Select implements Tag {
    
    private Tag parent;
    private PageContext pageContext;
    private String group;
    
    @Override
    public int doStartTag() throws JspException {
        return Tag.SKIP_BODY; //Cette balise n'a pas d'élément Body.
    }
    
    @Override
    public int doEndTag() throws JspException {
        //Rechercher DB en fonction du groupe.
        DB db = new DB();
        List<Row> rows = db.select(this.group);
        
        //Une balise de sélection est générée dynamiquement en fonction des résultats de la recherche dans la base de données.
        String select = rows.stream().map(row -> {
            String id = row.getId();
            String name = row.getName();
            
            return String.format("<option value=\"%s\">%s</option>", id, name);
        }).collect(Collectors.joining("", "<select>", "</select>"));
        
        //Générez dynamiquement la balise de sélection générée.
        try {
            JspWriter out = this.pageContext.getOut();
            out.print(select);
        } catch (IOException e) {
            throw new JspException(e);
        }
        
       return Tag.EVAL_PAGE; 
    }
    
    @Override
    public void release() {
    }
    
    @Override
    public Tag getParent() {
        return this.parent;
    }
    
    @Override
    public void setParent(Tag parent) {
        this.parent = parent;
    }
   
    @Override
    public void setPageContext(PageContext pageContext) {
        this.pageContext = pageContext;
    }

    public String getGroup() {
        return group;
    }

    public void setGroup(String group) {
        this.group = group;
    }
}

De plus, il y avait ici les deux "points de montage" suivants.

--Il est nécessaire d'implémenter les champs correspondant aux attributs et Getter et Setter.

Préparez le fichier tld.

Maintenant que nous avons un gestionnaire de balises qui réside dans le monde Java, nous devons connecter le gestionnaire de balises à une balise qui réside dans le monde jsp. C'est le fichier tld qui définit cela, et un exemple de celui-ci est montré ci-dessous. L'extension est tld, mais en réalité c'est au format xml.

sample.tld


<?xml version="1.0" encoding="UTF-8"?>

<taglib 
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
    version="2.0">

  <tlib-version>1.0</tlib-version>
  <short-name>sample</short-name>

  <tag>
    <name>select</name>
    <tag-class>com.sample.tag.Select</tag-class>
    <body-content>empty</body-content>
    <attribute>
        <name>group</name>
        <required>true</required>
    </attribute>
  </tag>
</taglib>

Créez et déployez un fichier jsp.

Après cela, créez un fichier jsp en utilisant votre propre balise et déployez l'application sur le serveur.

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="sample.tld" prefix="sample" %>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Sample</title>
    </head>
    <body>
        <h1>JSP Sample</h1>
        <p><sample:select group="group1" /></p>
        <p><sample:select group="group2" /></p>
    </body>
</html>

Enfin, si vous accédez à / jsp / sample avec un navigateur Web, etc. pour vérifier le résultat, la page Web représentée par le code source suivant doit être affichée.

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Sample</title>
    </head>
    <body>
        <h1>JSP Sample</h1>
        <p>
            <select>
                <option value="A">AAA</option>
                <option value="B">BBB</option>
                <option value="C">CCC</option>
                <option value="D">DDD</option>
                <option value="E">EEE</option>
            </select>
        </p>
        <p>
            <select>
                <option value="a">Ah ah</option>
                <option value="b">Bien</option>
                <option value="c">Uuu</option>
                <option value="d">Yeah Yeah</option>
                <option value="e">Oh oh</option>
            </select>
        </p>
    </body>
</html>

Fin (`・ ω ・ ´) Shakin

Recommended Posts

Exemple pour créer une balise personnalisée pour JSP
Un moyen simple de créer des balises personnalisées JSP
Comment créer une base de données H2 n'importe où
Comment créer des pages pour le tableau "kaminari"
[Spring Boot] Comment créer un projet (pour les débutants)
[Pour les débutants] Exemple minimum pour afficher RecyclerView en Java
[Pour ceux qui créent des portfolios] Comment utiliser font-awesome-rails
Comment exécuter l'exemple WebCamCapture de NyARToolkit pour Java
Je souhaite créer une annotation générique pour un type
Comment créer docker-compose
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
Comment créer une image de conteneur légère pour les applications Java
Exemple pour créer une application GUI avec JavaFX + IntelliJ + Scene Builder
[Pour ceux qui créent des portefeuilles] Comment utiliser Chart kick
Exemple pour créer un mot de passe à usage unique côté serveur et côté client
[Pour ceux qui créent des portfolios] Comment omettre les chaînes de caractères
Tutoriel pour créer un blog avec Rails pour les débutants Partie 2
Comment créer et lancer un Dockerfile pour Payara Micro
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0