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.
groupe
comme attribut obligatoire et l'utilise comme clé pour rechercher dans la base de données.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 (´ ・ ω ・ `)
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);
}
}
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.
private String group;
getGroup`` setGroup
existe.
--JSPWriter
ne se ferme pas explicitement.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>
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