Since I sometimes created a custom tag for jsp, it is a sample rather than a memo. Please accept (´ ・ ω ・ `)
Let's start with the requirement definition! It's easy because it's a sample, but I've summarized it as follows.
--Display database search results as a pull-down
--However, since it is a sample, the database is implemented as a mock.
--The tag name is sample: select
. It has group
as a required attribute and uses this as a key to search the database.
Since we want to create a custom tag that displays the DB search results, we will create a class that shows the access to the DB and the search results. We also need a Servlet to display jsp, so create this as well. The following is the sample code, but the __package declaration, import declaration, getter and setter are omitted because they are redundant. __ However, I would appreciate it if you could judge the package structure based on the image shown at the beginning (´ ・ ω ・ `).
DB.java
/**
*Database access class. However, since it is a sample, it will be implemented as a mock.
*/
public class DB implements Serializable {
private List<Row> rows;
/**
*constructor. Create an instance and input initial data to the mock DB.
*/
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", "Good"));
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"));
}
/**
*Search the DB using group as a key.
* @param group group column value
* @return search results
*/
public List<Row> select(String group) {
return rows.stream()
.filter(row -> row.getGroup().equals(group))
.collect(Collectors.toList());
}
}
Row.java
/**
* com.sample.db.A bean class that indicates a row in the database indicated by the DB class.
*/
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.Servlet for displaying 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);
}
}
Now that the prerequisites are in place, implement a tag handler, a Java class that corresponds to your custom tag. The tag handler is realized by implementing the interface javax.servlet.jsp.tagext.Tag
, and the sample code is as follows.
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; //This tag has no Body element.
}
@Override
public int doEndTag() throws JspException {
//Search DB based on group.
DB db = new DB();
List<Row> rows = db.select(this.group);
//Dynamically generate select tag based on the search result to DB.
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>"));
//Dynamically generate the generated select tag.
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;
}
}
In addition, there were the following two "fitting points" here.
--It is necessary to implement the fields corresponding to the attributes and Getter and Setter.
--In the above sample, it will not work unless private String group;
getGroup`` setGroup
exists.
--JSPWriter
does not explicitly close
.
Now that we have a tag handler that is a resident of the Java world, we need to connect the tag handler with a tag that is a resident of the jsp world. It is the tld file that sets this, and a sample is shown below. The extension is tld, but in reality it is in xml format.
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>
After that, create a jsp file using your own tag and deploy the application on the server.
<%@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>
Finally, when you access / jsp / sample
with a web browser etc. to check the result, the web page represented by the following source code should be displayed.
<!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">Good</option>
<option value="c">Uuu</option>
<option value="d">Yeah yeah</option>
<option value="e">Oh oh</option>
</select>
</p>
</body>
</html>
End (`・ ω ・ ´) Shakin
Recommended Posts