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

提: tomcat服务器启动时,加载到每个web应用,加载每个web应用的WEB-INF目录下的所有文件!!!例如web.xml, tld文件!!!

第一步:创建自定义标签

1. 创建标签处理器类

[java]  view plain  copy
  1. public class MyFirstTag implements SimpleTag {  
  2.     JspContext jspContext;  
  3.   
  4.     public void doTag() throws IOException, JspException {  
  5.         System.out.println("doTag");  
  6.         jspContext.getOut().print("This is my first tag.");  
  7.     }  
  8.   
  9.     public void setParent(JspTag parent) {  
  10.         System.out.println("setParent");  
  11.     }  
  12.   
  13.     public JspTag getParent() {  
  14.         System.out.println("getParent");  
  15.         return null;  
  16.     }  
  17.   
  18.     public void setJspContext(JspContext jspContext) {  
  19.         System.out.println("setJspContext");  
  20.         this.jspContext = jspContext;  
  21.     }  
  22.   
  23.     public void setJspBody(JspFragment body) {  
  24.         System.out.println("setJspBody");  
  25.     }  
  26. }  

2. 在标签描述符中注册标签 mytags.tld

[html]  view plain  copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_1.xsd"  
  5.     version="2.1">  
  6.       
  7.     <description>  
  8.          Simple tag examples  
  9.     description>  
  10.     <tlib-version>1.0tlib-version>  
  11.     <short-name>My First Taglib Exampleshort-name>  
  12.     <tag>  
  13.         <name>firstTagname>  
  14.         <tag-class>customtag.MyFirstTagtag-class>  
  15.         <body-content>emptybody-content>  
  16.     tag>  
  17. taglib>  

3. 在jsp头部导入自定义标签库

4. 在jsp中使用自定义标签

[html]  view plain  copy
  1. <%@ taglib uri="/WEB-INF/mytags.tld" prefix="easy"%>  
  2. <html>  
  3. <head>  
  4.     <title>Testing my first tagtitle>  
  5. head>  
  6. <body>  
  7. Hello!!!!  
  8. <br/>  
  9. <easy:firstTag>easy:firstTag>  
  10. body>  
  11. 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文件中查询是否存在为firstTag的标签

6. 找到对应的标签,则读到内容

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中自定义标签的执行过程



你可能感兴趣的:(tomcat,&,servlet)