使用自定义标签进行开发,首先需要了解一下自定义标签所涉及的接口和类的类图:
从类图可以看出,要想实现JSP自定义标签,必须得实现JspTag接口,该接口有多个实现类,从Jsp2.0开始,我们只需要继承SimpleTagSupport类,就可以进行自定义标签的开发和使用。
使用自定义标签的步骤
使用自定义标签,大体分为三个步骤,其中获取数据等细节不包括在内:
- 创建自定义标签类;
- 在WEB-INF下创建tld文件对标签进行描述;
- 在jsp页面引用标签;
下面是我使用过的自定义标签的使用过程:
1.自定义标签类:
package com.dhcc.common.util.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import com.dhcc.common.constant.SysTypeConstant;
import com.dhcc.device.db.dao.DbNodeDao;
import com.dhcc.device.db.model.DbNode;
import com.dhcc.device.network.dao.HostNodeDao;
import com.dhcc.device.network.model.HostNode;
/**
* 自定义标签,根据NodeId,Type输出Ip地址
*
* @author https://www.4spaces.org/
*
*/
public class IpTag extends SimpleTagSupport {
private String nodeId;
private String type;
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void doTag() throws JspException, IOException {
PageContext ctx = (PageContext) getJspContext();
JspWriter out = ctx.getOut();
if (type.equals(SysTypeConstant.CATEGORY_HOST_STR)) {
// 主机或网络设备
HostNode hostNode = null;
HostNodeDao hostNodeDao = null;
try {
hostNode = new HostNode();
hostNodeDao = new HostNodeDao();
hostNode = (HostNode) hostNodeDao.findByID(nodeId);
if (hostNode == null) {
out.println("节点不存在");
} else {
out.println(hostNode.getIpAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (type.equals(SysTypeConstant.CATEGORY_DB_STR)) {
// 数据库
DbNode dbNode = null;
DbNodeDao dbNodeDao = null;
try {
dbNode = new DbNode();
dbNodeDao = new DbNodeDao();
dbNode = (DbNode) dbNodeDao.findByID(nodeId);
if (dbNode == null) {
out.println("节点不存在");
} else {
out.println(dbNode.getIpAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2.tld文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>mytag</short-name>
<uri>https://www.4spaces.org/mytags</uri>
<tag>
<name>prtip</name>
<tag-class>com.dhcc.common.util.tag.IpTag</tag-class>
<body-content>empty</body-content>
<info>根据NodeId,Type输出IP</info>
<attribute>
<name>nodeId</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>type</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3.在页面中进行引用
<%@ taglib prefix="mytag" uri="/WEB-INF/tld/mytag.tld"%>
<mytag:prtip nodeId="${ai.nodeid}" type="${ai.type }"/>
使用心得
我觉得使用时,自定义标签的代码中不应该涉及太多的业务逻辑,如果涉及到业务逻辑,也不能在页面的循环打印中使用,比如这样会频繁创建数据库连接,造成资源浪费,如果我这样考虑的不对,各位大神给予指正。
时间仓促,描述较粗糙,有问题,请给予指出。