欢迎光临
一个有态度、有温度的分享型博客

Jsp中自定义标签的使用

使用自定义标签进行开发,首先需要了解一下自定义标签所涉及的接口和类的类图:

从类图可以看出,要想实现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.rxblog.xyz
    * 
    */
    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.rxblog.xyz/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 }"/>

使用心得

我觉得使用时,自定义标签的代码中不应该涉及太多的业务逻辑,如果涉及到业务逻辑,也不能在页面的循环打印中使用,比如这样会频繁创建数据库连接,造成资源浪费,如果我这样考虑的不对,各位大神给予指正。

时间仓促,描述较粗糙,有问题,请给予指出。

转载请注明出处:容休博客 » Jsp中自定义标签的使用

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址