前提: tomcat服务器启动时,加载到每个web应用,加载每个web应用的WEB-INF目录下的所有文件!!!例如web.xml, tld文件!!!
第一步:创建自定义标签
1. 创建标签处理器类
public class MyFirstTag implements SimpleTag {
JspContext jspContext;
public void doTag() throws IOException, JspException {
System.out.println("doTag");
jspContext.getOut().print("This is my first tag.");
}
public void setParent(JspTag parent) {
System.out.println("setParent");
}
public JspTag getParent() {
System.out.println("getParent");
return null;
}
public void setJspContext(JspContext jspContext) {
System.out.println("setJspContext");
this.jspContext = jspContext;
}
public void setJspBody(JspFragment body) {
System.out.println("setJspBody");
}
}
2. 在标签描述符中注册标签 mytags.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_1.xsd"
version="2.1">
<description>
Simple tag examples
</description>
<tlib-version>1.0</tlib-version>
<short-name>My First Taglib Example</short-name>
<tag>
<name>firstTag</name>
<tag-class>customtag.MyFirstTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3. 在jsp头部导入自定义标签库
4. 在jsp中使用自定义标签
<%@ taglib uri="/WEB-INF/mytags.tld" prefix="easy"%>
<html>
<head>
<title>Testing my first tag</title>
</head>
<body>
Hello!!!!
<br/>
<easy:firstTag></easy:firstTag>
</body>
</html>
第二步:执行过程
1. 访问.jsp资源
2. tomcat服务器把jsp文件翻译成java源文件->编译class->构造类对象->调用_jspService()方法
3. 检查jsp文件的taglib指令,是否存在一个名为/WEB-INF/mytags.tld的tld文件。如果没有,则报错
4. 上一步已经读到mytags.tld文件
5. 读到< easy:firstTag > 到mytags.tld文件中查询是否存在<name>为firstTag的<tag>标签
6. 找到对应的<tag>标签,则读到<tag-class>内容
7. 得到customtag.MyFirstTag
构造customtag.MyFirstTag对象,然后调用里面的标签处理器生命周期中的方法
第三步:执行标签处理器的生命周期:
1. JSP 容器通过调用其无参构造器,创建一个简单标签处理器实例。因此,简单的标签处理器必须有一个无参构造器。
2. JSP 容器调用setJspContext 方法(一定调用), 同时传递一个JspContext 对象。JspContext 最重要的方法是getOut,它返回一个JspWriter,用于将响应发送到客户端。setJspContext方法的签名如下:
public void setJspContext(JspContext jspContext}
大多数时候,会需要将传进的JspContext 赋给一个类变量,以便供后续使用。
3. 如果表示标签处理器的定制标签是嵌套在另一个标签中的, JSP 容器就会调用setParen方法。该方法具有如下签名:
public void setParent(JspTag parent)
4. JSP 容器为给该标签定义的每个属性都调用设置方法( Setter )。
5 . 如果标签中有主体内容, JSP 将调用SimpleTag 接口的setJspBody 方法,将主体内容作为JspFragment 传递。如果没有主体内容, JSP 容器则不会调用这个方法。
6. JSP 容器调用doTag 方法(一定调用)。所有变量在doTag 方法返回时进行同步。
javax.servlet.p.tagext 包中也含有SimpleTag接口的一个支持类:SimpleTagSupport。SimpleTagSupport为SimpleTag接口的所有方法都提供了默认实现,并且作为一个便利类,你可以继承它, 来编写一个简单的标签处理器。当JSP容器调用SimpleTag接口的setJspContext方法时,SimpleTagSupport 类中的getJspContext方法将返回JSP容器传递的JspContext实例。