自定义标签库(Tag library)
通过SimpleTag接口实现
1.编写标签处理器类(Tag Handle Class)
- 上文我们说到,标签库就是让我们以标签的形式在JSP页面中调用Java程序,既然是Java程序那我们就先来编写一个标签处理器类。
- 首先我们需要编写一个类来实现SimpleTag接口,实现之前先来看一下这个接口。
- SimpleTag接口中共有5个抽象方法
- doTag() 标签执行时被调用的方法,我们主要编写的方法。
- setParent(JspTag) 设置父标签的方法
- getParent() 获取父标签的方法
- setJspContext(JspContext)设置pageContext的方法
- 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文件夹下。
- 步骤:
- 在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> |
- taglib.tld结构
- 这里的tld文件只是给出了一个基本的结构,有一部分内容由于尚未使用,所以在tld文件中没有体现出来。
3.在JSP中使用标签
- 编写完处理器类和tld文件后,标签就可以在我们的项目中使用了。
- 使用步骤:
- 在JSP页面中引入标签库
- 格式:<%@ taglib uri=" " prefix="" %>
- 使用taglib指令引入一个标签库<%@ taglib %>
- uri属性需要标签库的唯一约束,也就是我们标签库的uri属性
- prefix属性配置的是标签库在页面中的前缀,一般和short-name一致
- 例如:我们要在页面中引入我们刚刚创建好的标签
- 格式:<%@ taglib uri=" " prefix="" %>
- 在JSP页面中引入标签库
<%@taglib uri="http://www.atguigu.com/tag/atguigu" prefix="a"%> |
- 在JSP页面中使用标签库
- 标签库引入后就可以像是使用JSP动作标签一样使用我们的自定义标签。
- 标签格式:
- 有标签体:<库名:标签名></库名:标签名>
- 自结束标签:<库名:标签名/>
- 我们刚刚定义的标签没有标签体,可以直接使用,如下:
<a:hello /> |
- 这样在我们每次访问这个页面时,控制台中就会输出一个HelloWorld。
4.运行流程
- 容器创建处理器类实例后,调用setJspContext()方法,设置JspContext。
- 如果当前标签有父标签则调用setParent()方法来设置父标签。
- 如果标签有属性,调用setXxx()方法设置属性。
- 如果存在标签体,调用setJspBody(),设置标签体
- 调用doTag()方法,完成标签的主要逻辑