自定义标签基础

来源:互联网 发布:云图网络电视 编辑:程序博客网 时间:2024/06/06 11:49

1、标签处理类相关API


所有的标签处理类都实现了一个叫JspTag的接口,此接口仅是一个标签的统一实现接口,内部并没有定义任何的方法。在JspTag接口下面有Tag和SimpleTag两个接口,代表了两个标签处理类的方向,实现Tag标签的被称为传统标签,实现SimpleTag接口的被称为简单标签。


(1)传统标签


传统标签处理类主要继承了TagSupport和BodyTagSupport这两个类。在这两个类的子类中,只需要覆写或实现某些方法即可达到自定义标签的功能,从而大大简化了标签处理程序的开发过程。传统标签重要的接口和实现类的详细关系如所示。

 

                                                                 传统标签的接口和类的关系示意图

 提示

       图3.3中标有标记的表示这是一个接口,剩下的为实现类。实线箭头表示继承关系,虚线箭头表示实现关系。


· JspTag接口、Tag接口、IterationTag接口和BodyTag接口

 

 根据上图可知,几个接口之间存在着继承关系,除了JspTag接口外也都定义了各自的属性和方法。如下为各接口所能提供的功能。

  • 实现Tag接口的类:这些类一般都能够决定是否显示标签主体的内容。例如TagSupport类和BodyTagSupport类都具有此功能。
  • 实现IterationTag接口的类:这些类除了能够决定是否显示主体内容之外,还能够对标签主体内容进行重复处理。这也是Tag接口和IterationTag接口的主要区别,它们体现在程序中最主要的不同就是IteationTag接口扩展了doAfterBody()方法。
  • 实现BodyTag接口的类:这些类除了具有实现IterationTag接口的类的一切功能外,还能对标签主体进行处理。例如BodyTagSupport类就具有此功能。

· TagSupport类


由图可知TagSupport类实现了IterationTag接口,而IterationTag接口本身又是Tag接口的子接口,这两个类中有大量的静态属性和方法,所以实现了如上接口的TagSupport中也存在着大量的属性和方法,下面介绍一些常用的方法和属性。

TagSupport类中常用的方法说明如下:

  • doStartTag():此方法在遇到标签的起始标志时执行,可返回的值有以下几项。
  1.  SKIP_BODY:表示忽略标签主体的内容,而将执行权交给     doEndTag()方法。
  2.  EVAL_BODY_INCLUDE:表示执行标签体的内容。
  • doAfterBody():此方法在标签处理类每次计算完标签主体后被调用,如果没有标签主体,该方法不会被执行。此方法有如下几项返回值。
  1.  SKIP_BODY:表示忽略标签主体内容,并将执行权转交给doEndTag()方法。
  2.  EVAL_BODY_AGAIN:表示重复执行标签主体的内容,会重复调用doAfterBody()方法,一直循环执行下去,直到doAfterBody()方法返回SKIP_BODY为止。
  • doEndTag():此方法在遇到标签的结束标志时执行,有如下两项返回值。
  1.  SKIP_PAGE:表示忽略自定义标签以后的网页内容,并将所有的输出立刻传到浏览器上。
  1.  EVAL_PAGE:表示JSP页面内容可以正常地运行完毕。

TagSupport类中常用的属性说明如下:

  • parent:Web容器在调用doStartTag()方法前会先调用setParent()方法来设置此成员变量。因此可以在TagSupport的子类中通过getParent()方法获取父标签的处理对象。
  • pageContext:Web容器在调用doStartTag()方法前会先调用setPageContext()方法来设置此成员变量的值。因此在TagSupport的子类中可以直接访问pageContext变量。此变量代表当前JSP页面的上下文,可以使用它获取与当前页面相关的Application、Session等JSP页面的隐含对象。

· BodyTagSupport类


BodyTagSupport类除了继承TagSupport类中的一些属性和方法之外,还扩充了自己的一些方法和属性。

BodySupport类中扩充的常用方法说明如下:

  • doStartTag():此方法在遇到标签的起始标志时执行,可返回的值有以下几项。

  1.  SKIP_BODY:表示忽略标签主体的内容,而将执行权交给     doEndTag()方法。
  2.  EVAL_BODY_INCLUDE:表示执行标签主体的内容。
  3.  EVAL_BODY_BUFFERD,表示Web容器会将标签主体的处理结果保存在BodyContent类中。
  • setBodyContent(BodyContent b):此方法会对 BodyContent对象的一些属性做初始化,包括标签主体内容和在处理标签过程中要输出至response的数据对象。
  • doInitBody()方法:当Web容器遇到标签的开始标志时调用此方法,对标签主体进行初始化。

BodySupport类中还扩充了属性,其中有一个BodyContent属性。因为它是BodyContent类的对象,所以代表了具体地标签主体的内容。


(2)简单标签

JSP2.0新规范中增加了继承JspTag()接口的doTag()接口,并且提供了实现该接口的SimpleTagSupport方法。简单标签的接口和类的详细关系示意如所示。之所以说它简单,是因为和之前的传统标签相比,它的标签处理类的实现任务要简单的多,只需要覆写一个doTag()方法,其他的方法都提供了默认的实现。


                             简单标签的接口和类的关系示意图

 

· JspTag接口、SimpleTag接口


因为JspTag接口在前面的讲解中已经提到过,所以在这里不做解释。SimpleTag接口定义了5个方法。其中最主要的方法就是doTag()方法,在这个方法里可以完成输出、迭代、修改标签主体内容等功能。


· SimpleTagSupport


因为SimpleTagSupport类实现了SimpleTag接口,所以SimpleTagSupport类除了自定义的一些方法外还实现了如上接口中的方法。

SimpleTagSupport类中常用方法说明如下。

  • setJspContext()方法:SimpleTagSupport类实现了SimpleTag接口中的方法,此方法用于把代表JSP页面的pageContext对象传递给标签处理器对象。
  • getJspContext()方法:此方法提供了获取指向JSP页面的输出流的功能。
  • setJspBody()方法:SimpleTagSupport类实现了SimpleTag接口中的方法,此方法用于把代表标签主体的JspFragment对象传递给标签处理器对象。
  • getJspBody()方法:此方法提供了处理标签主体的功能。Web容器通过setJspBody()方法得到一个代表标签主体的JspFragment对象,然后就可以在doTag()方法中根据需要重复调用getJspBody().invoke()方法来处理标签主体内容。
  • doTag()方法:此方法在Web容器执行自定义标签时调用,而且只调用一次即可完成处理标签主体内容、迭代标签主体内容等功能。
  • setParent方法:SimpleTagSupport类实现了SimpleTag接口中的方法,此方法用于把父标签处理器对象传递给当前标签处理器对象。
  • getParent方法:此方法用于获取当前标签的父标签的处理器对象。




2、标签描述文件

标签库描述文件是XML格式,后缀是.tld,也称为TLD文件。TLD文件包含标签库的所有信息及库中的每个标签的配置信息。这类文件通常保存在WEB-INF目录或它的子目录中。TLD文件必须以下面的格式开头。常见的元素介绍如下:


· <taglib>元素


<taglib>元素是TLD文件的根元素,一个TLD文件只能有一个这样的根元素,其常见的直接子元素及作用如所示。

元素名

描述

<tlib-version>

表示标签库的版本,用于开发和配置管理。

<short-name>

一个标签的短名称,主要用于标签的编写工作。

<uri>

 

<jsp-version>

表示标签库所依赖的JSP版本。

<tag>

用于定义标签库中某个具体标签的标签。

· <tag>元素

<tag>元素用于定义一个自定义标签,其常见的直接子元素及作用如所示。

元素名

描述

<name>

标签的名称。

<tag-class>

标签处理类的路径。

<body-content>

表示标签中包含的标签主体的类型,其中的<body-content>元素的值指定了标签主体的具体类型

<attribute>

标签的属性


· <attribute>元素


<tag>元素用于定义自定义标签的属性,其常见的直接子元素及作用如所示。

元素名

描述

<name>

指定属性的名称

<required>

指定属性是否必须 

rtexprvalue

指定属性值是否可以动态指定




































0 0