提: 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实例。
转载自:jsp中自定义标签的执行过程