jsp中自定义标签的执行过程

前提: 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实例。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值