JSP自定义标签

JSP自定义标签

一,    基本概念:

标签(Tag):标签是一种XML元素,通过标签可以使JSP网页变得简洁易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的。

标签库(Tag library):由一系列功能相似,逻辑上互相联系的标签构成的集合称为标签库。

标签库描述文件(Tag Library Desriptor)

标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。

标签处理类(Tag Handle Class)

标签处理类是一个Java类,这个类继承了TagSupport或着扩展了SimpleTag接口,通过这个接口可以实现自定义标签的具体功能。

两种标签: 可以自定义两种类型的标签:

javax.servlet.jsp.tagext.Tag

javax.servlet.jsp.tagext.BodyTag

有标签体的标签必须实现BodyTag接口

无标签体的简单标签可以实现Tag接口

 

JspTag

SimpleTag

Tag

IterationTag

SimpleTagSupport

TagSupport

BodyTag

BodyTagSupport

 

 

 

 

 

 

 

 


二、自定义JSP标签的格式:

1.<% @ taglib prefix=”someprefix” uri=”/sometaglib”>

为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件:

1)    从一个指定的标签库中识别出代表这种自定义行为的标签

2)    找到实现这些自定义行为的具体类

第一个必需条件-找出自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directive’s Prefix),用在标签库的文档中或者页面中插入自定义标签。所以你可以使用除了诸如jsp, jspx, java servlet

sum, sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。

uri属性满足了以上第二个要求,为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件文件,在TLD文件中可以找到标签库中所有标签处理类的位置

web使用程序启动时,容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也即使说它们会定位所有的TLD文件,对于每个TLD文件,容器会先获取标签库的URI,然后为每个TLD文件和对应的URI创建映射关系。

三、自定义JSP标签的处理过程

1. JSP中引入标签库:

<%@  taglib prefix=” taglibpfex”  uri=”tagliburi”>

2. JSP中使用标签库标签

3. Web容器根据prefix,获得第一个步骤中声明的tagliburi属性值

4. Web容器根据uri属性在web.xml找到对应的元素(4,5可以不要)

5. 从元素中获得对应的元素值

<taglib>

      <taglib-uri>/myTag</taglib-uri>

   <taglib-location>/WEB-INF/myTag.tld</taglib-location>

</taglib>

6. Web容器根据元素的值在WEB-INF/目录下找到对应的.tld文件

7. .tld文件中找到与tagname对应的元素

8. 从元素中或的对应元素的值

9. Web容器根据元素的值创建相应的tagHandle class的实例

10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的操作。

 四,创建和使用一个Tag Library的基本步骤

1.     创建标签的处理类(Tag Handler Class)

2.     创建标签库描述文件(Tag Library Descriptor File)

3.     web.xml文件中配置元素(可选)

4.     jsp文件中引入标签库

五、创建标签库描述文件(Tag Library Descriptor)

1. 标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:

A : 标签库元素

B:标签元素

C:标签属性元素

2. 标签库元素用来设定标签库的相关信息,它的常用属性有:

A. shortname: 指定Tag Library默认的前缀名(prefix)

B. uri:指定TagLibrary的唯一访问表示符

3. 标签元素用来定义一个标签,它的常见属性有:

A.name  设定Tag的名字

B.tagclass  设定Tag的处理类

C.bodycontent 设定标签的主体(body)内容

1)tagdependent:标签体内容  直接被写入到BodyContent,由自定义标签类进行处理,而不被JSP容器来解释。

2)JSP:接收所有JSP语法,如定制的或内部的tag,script,静态HTML,脚本元素,JSP指令和动作。

3)empty: 空标记,即其实标记和结束标记之间没有内容。

下面集中写法都是有效的。

<test: mytag/>   <test:mytag name=”Tom” />  <test:mytag></test:mytag>

3)    scriptless:接收文本、ELJSP动作。

标签属性元素用来定义标签的属性,它的常见属性有:

A.        name: 属性名称

B.         required: 属性是否必需的,默认为false

C.         rtexprvalue: 属性视为可以为request-time表达式,也就是类似<%=…%>

 

六、如何创建标签处理类:

1.引入必需的资源:

2.继承自TagSupport类并覆盖doStartTag()/doEndTag()方法

 

TagSupport类简介

1.     处理类标签的类必须扩展javax.servlet.jsp.TagSupport.

2.     TagSupport类的主要属性:

A.        parent属性:代表嵌套了当前标签的上层标签的处理类。

B.         pageContext属性:代表了Web应用中javax.servlet.jsp.PageContext对象,通过此对象可向jsp页面中输出信息。

3.     JSP容器在调用doStart或者doEndTag方法前,会先调用setPageContextsetParent方法,设置pageContextparent对象,因此在标签处理类中可以直接方法pageContext变量。

4.     TagSupport的构造方法中不能方法pageContext成员变量,因为此时JSP容器还没有调用setPageContext()方法对pageContext进行初始化

七、TagSupport处理标签的方法:

1. TagSupport类提供了两个处理标签的方法:

public int doStartTag() throws JspException

public int doEndTag() throws JspException

2. doStartTag:JSP容器遇到自定义标签的其实标签时,就会调用doStartTag()方法。

doStartTag()方法返回一个整数值,用来决定程序的后续流程。

A.    Tag.SKIP_BODY  表示标签之间的内容别忽略

B.    Tag_EVAL_BODY_INCLUDE 表示标签之间的内容会被正常执行。

3. doEndTag: JSP容器遇到自定义标签的结束标记时,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。

A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上为处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户端的浏览器上。

B. Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页。

 

setPageContext()

setParent()

setAttributes()

                     

 

doStartTag()

 

 

 


Tag.EVAL_BODY_INCLUDE

 

Evalute the body contents

                      Tag.SKIP_BODY

 

doEndTag()

 

 


                               Tag.SKIP_PAGE

 

Evalute rest of the JSP page

Return from the current JSP page

 

 

 

 

 


jsp2.0中为了简化标签的复杂性,增加而来制作SimpleTag的标签类SimpleTagSupport类,SimpleTagSupport类实现了SimpleTag接口的,它只需要实现一个doTag()方法即可,而不需要一堆回传值

 

你可能感兴趣的:(jsp,Web,xml,Class,library,Descriptor)