自定义标签库(Tag library)

通过SimpleTag接口实现

1.编写标签处理器类(Tag Handle Class)

  • 上文我们说到,标签库就是让我们以标签的形式在JSP页面中调用Java程序,既然是Java程序那我们就先来编写一个标签处理器类。
  • 首先我们需要编写一个类来实现SimpleTag接口,实现之前先来看一下这个接口。

  • SimpleTag接口中共有5个抽象方法
    1. doTag() 标签执行时被调用的方法,我们主要编写的方法。
    2. setParent(JspTag) 设置父标签的方法
    3. getParent() 获取父标签的方法
    4. setJspContext(JspContext)设置pageContext的方法
    5. setJspBody(JspFragment) 设置标签体的方法
  • 实现SimpleTag

public class MyTag implements SimpleTag {

@Override

public void doTag() throws JspException, IOException {

System.out.println("Hello World!!!");

}

 

@Override

public void setParent(JspTag parent) {}

@Override

public JspTag getParent() {return null;}

@Override

public void setJspContext(JspContext pc) {}

@Override

public void setJspBody(JspFragment jspBody) {}

}

2.编写标签库描述文件(Tag Library Descriptor)

  • 编写完标签处理器类,还需要在项目中对该类进行注册,才可以在JSP中使用我们刚刚编写的标签。
  • 每一个标签库描述文件对应一个标签库。
  • 标签处理器类实际上就是一个XML文件,这个XML文件有一点特殊,它的扩展名是以tld结尾的,一般我们会放在WEB-INF文件夹下。
  • 步骤:
    1. 在WEB-INF下创建一个xml文件命名为taglib.tld

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

<taglib xmlns="http://java.sun.com/xml/ns/javaee"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

        version="2.1">

 

        <description>Atguigu 1.0 library</description>

    <display-name>Atguigu</display-name>

    <tlib-version>1.0</tlib-version>

    <short-name>a</short-name>

    <uri>http://www.atguigu.com/tag/atguigu</uri>

 

<tag>

<name>hello</name>

<tag-class>com.atguigu.web.tag.MyTag</tag-class>

<body-content>empty</body-content>

</tag>

</taglib>

  1. taglib.tld结构

  1. 这里的tld文件只是给出了一个基本的结构,有一部分内容由于尚未使用,所以在tld文件中没有体现出来。

3.在JSP中使用标签

  • 编写完处理器类和tld文件后,标签就可以在我们的项目中使用了。
  • 使用步骤:
    1. 在JSP页面中引入标签库
      • 格式:<%@ taglib uri=" "  prefix="" %>
        • 使用taglib指令引入一个标签库<%@ taglib %>
        • uri属性需要标签库的唯一约束,也就是我们标签库的uri属性
        • prefix属性配置的是标签库在页面中的前缀,一般和short-name一致
      • 例如:我们要在页面中引入我们刚刚创建好的标签

<%@taglib uri="http://www.atguigu.com/tag/atguigu"  prefix="a"%>

  1. 在JSP页面中使用标签库
    • 标签库引入后就可以像是使用JSP动作标签一样使用我们的自定义标签。
    • 标签格式:
      • 有标签体:<库名:标签名></库名:标签名>
      • 自结束标签:<库名:标签名/>
    • 我们刚刚定义的标签没有标签体,可以直接使用,如下:

<a:hello />

  • 这样在我们每次访问这个页面时,控制台中就会输出一个HelloWorld。

4.运行流程

  1. 容器创建处理器类实例后,调用setJspContext()方法,设置JspContext。
  2. 如果当前标签有父标签则调用setParent()方法来设置父标签。
  3. 如果标签有属性,调用setXxx()方法设置属性。
  4. 如果存在标签体,调用setJspBody(),设置标签体
  5. 调用doTag()方法,完成标签的主要逻辑