学科分类
目录
Java Web

自定义标签的开发步骤

前面已经学习了自定义标签的基本知识,接下来讲解如何开发一个自定义标签。开发一个自定义标签至少需要三个步骤,具体如下:

1、编写标签处理器

开发自定义标签的核心任务就是要编写作为标签处理器的Java类。

● 传统标签开发,需要实现javax.servlet.jsp.tagext.Tag接口。

● 简单标签开发,需要实现javax.servlet.jsp.tagext.SimpleTag接口。

Tag接口和SimpleTag接口定义了JSP页面与标签处理器类之间的通信规则。如果JSP引擎在编译JSP页面时遇到自定义标签,传统标签将会调用标签处理器类的doStartTag()方法,简单标签将会调用标签处理器类的doTag()方法。

2、编写标签库描述符(tld)文件

要想让JSP引擎在遇到自定义标签时,能找到其所对应的标签处理器类,还必须编写一个标签库描述符(Tag Library Descriptor)文件,简称TLD文件。TLD文件与标签处理器之间的关系就如同web.xml文件与Servlet之间的关系,一个标签处理器类要想被JSP容器找到并调用,必须在TLD文件中进行注册, 一个TLD文件中可以注册多个标签处理器类,每个自定义标签的注册名称不能相同,同一个TLD文件中注册的多个标签处理器类就形成了一个自定义标签库。TLD文件是基于XML文件的,其内容的编写需要遵循XML语法规范。

下面编写一个名为mytag.tld的标签库描述符文件,具体示例如下:

<?xml version="1.0" encoding="GBK" ?>
<!-- 自定义标签的根标签是<taglib>,根标签使用的是schema约束,根标签的属性及其取值,通常是固定不变的-->
<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
  http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
  <!-- TLD的头文件,这部分信息通常是固定不变的 -->
  <!-- 指定标签库的版本号 -->
  <tlib-version>1.0</tlib-version>
  <!-- 指定标签库的名称 -->
  <short-name>SimpleTag</short-name>
  <!-- 指定标签库的URI --> 
  <uri>http://www.itcast.cn</uri>
  <!-- 注册一个自定义的标签 -->
  <tag>
    <!-- 指定自定义标签的注册名称 -->
    <name>ipTag</name>
    <!-- 指定标签的标签处理器类 -->
    <tag-class>cn.itcast.chapter09.tag.IpTag</tag-class>
    <!-- 指定标签体的类型,empty表示标签体为空 -->
    <body-content>empty</body-content>
  </tag>
</taglib>

在上述tld文件中,通过注释的方式为每个元素进行了说明。除了<body-content>元素外,其它元素都很容易理解。<body-content>元素用于指定标签体的类型,其值共有四个,具体如下:

● empty :表示在使用自定义标签时不能设置标签体,否则JSP容器会报错

● JSP :表示自定义标签的标签体可以为任意的JSP元素,需要注意的是JSP必须大写

● scriptless :表示自定义标签的标签体可以包含除JSP脚本元素之外的任意JSP元素

● tagdependent: 表示JSP容器对标签体内容不进行解析处理,而是将标签体内容原封不动输出给客户端或交给标签处理器自己去处理。例如,如果<body-content>元素的值为tagdependent,那么标签体中的EL表达式“${… }”、标签“< >”和JSP脚本“<%...%>”,都会被当做普通的字符文本处理。

需要注意的是,编写完TLD文件后,需要把它放置到WEB-INF目录或者其子目录下,但WEB-INF\classes目录和WEB-INF\lib目录除外。

3、 在JSP页面导入和使用自定义标签**

TLD文件编写完成后,就可以在JSP文件中使用自定义标签。在使用自定义标签之前,首先需要使用taglib指令来引入TLD文件,其语法格式如下:

<%@taglib uri = "" prefix = "" %>

在上述语法格式中,uri属性用于指定引用的是哪一个TLD文件,它应该和要引入的TLD文件中<uri>元素的值保持一致。prefix属性用于为引入的TLD文件指定一个“引用代号”,在使用这个标签库中注册的自定义标签时都需要加上这个“引用代号”作为前缀。prefix属性的值可以是任意的,但不能和其它taglib指令中的prefix属性值重复,而且需要遵循XML名称空间的命名约定。

在JSP页面引入TLD文件后,就可以在JSP页面使用自定义标签了。自定义标签的格式有很多种,具体如下:

(1)空标签

空标签是指不包含标签体的标签,它有两种语法格式,如下所示:

<prefix:tagname />             // 格式1

<prefix:tagname></prefix:tagname>    // 格式2

在上面的标签中,prefix表示标签的前缀,tagname表示标签名,标签名必须和TLD文件中的自定义标签的注册名称相同。由于标签中不包含标签体,因此可以不使用结束标签,但是在标签最后一定要使用正斜线(/)来关闭标签。

(2)带标签体的标签

在自定义标签的开始标签和结束标签之间可以包含标签体,其格式如下所示:

<prefix:tagname>body</prefix:name>

在上面的标签中,body是标签体,标签体通常为JSP的页面元素,包括普通文本、脚本片段、脚本表达式和EL表达式等。

(3)带属性的标签

标签的属性是对标签元素的补充说明,它一般定义在开始标签中,以键/值对的形式出现,带有属性的标签格式如下所示:

<prefix:tagname attrname1 = "attrvalue1" [attrname2 = "attrvalue2" …]>

[body]

</prefix:tagname>

在上面的标签中,attrname1和attrname2为标签的属性。需要注意的是,空标签和带标签体的标签都可以有属性,而且一个标签中可以定义多个属性。

(4)嵌套标签

嵌套标签是指在一个标签的标签体中包含另外的标签,外层的标签称为父标签,内层嵌套的标签称为子标签,其语法格式如下:

<prefix:tagname>

   <prefix:nestedtagname>

      [body]

   </prefix:nestedtagname>

</prefix:tagname>

在上面的标签中,<prefix:tagname>是父标签,<prefix:nestedtagname>是子标签。JSP标签允许在一个父标签中包含多个子标签,也允许使用标签的多重嵌套。

点击此处
隐藏目录