1. 自定义标签简介
JSP标签包括以下几种形式。
- 主体内容和属性都为空的标签,例如:<mm:hello/>
- 包含属性的标签,例如: <mm:message key="hello.hi"/>
- 包含主体内容的标签,例如<mm:greeting>How are you?</mm:greeting>。 其中<mm:greeting>称为标签的起始标志,</mm:greeting>称为标签的结束标志,两个标签之间的内容称为标签主体。
- 包含属性和主体内容的标签,例如:<mm:greeting username="Tomcat">How are you? </mm:greeting>
- 嵌套的标签,例如:<mm:greeting> <mm:user name="Tomcat" age="18" /> </mm:greeting>,其中外层标签<mm:greeting>称为父标签,内层标签<mm:user >称为子标签。
为了便于组织和管理标签,可以把一组功能相关的标签放在同一个标签库中。开发包含自定义标签的标签库包括以下步骤:
- 创建自定义标签的处理类(Tag Handler Class)。
- 创建TLD标签库描述文件。(Tag Library Discriptor)
假设甲方开发了可重用性比较高的标签库,那么除了甲方本身的Web应用可以使用它,其他方(如乙方)也可以使用它。本系列后续内容(JSTL Core标签库)会介绍如何在Web应用中使用第三方提供的JSP标准标签库。
本章将按照如下步骤在Web应用中使用标签库。
- 把标签处理类及相关类的.class文件放在WEB-INF/classes目录下。(如果使用IDEA进行开发,只需要在src目录下编写好对应的.java文件的代码,编译时会自动在对应位置生成.class)
- 把TLD标签库描述文件存放在WEB-INF目录或者其自定义的子目录下。
- 在web.xml中声明所引用的标签库。
- 在JSP文件中使用标签库中的标签。
本章下一节介绍的各个范例分别用于演示不同类型标签的创建及其使用方法。
- 8.2.1节:带属性的message标签。
- 8.2.2节:能重复执行标签主体内容的iterate标签。
- 8.2.3节:能访问标签主体内容的greet标签。
2. JSP Tag API
Servlet容器在运行JSP文件时,如果遇到自定义标签,就会调用这个标签的处理类(Tag Handler CLass)的相关方法。标签处理类可以继承JSP Tag API中的TagSupport类或BodyTagSupport类。
JSP Tag API位于javax.serlvet.jsp.tagext包中。
2.1 JspTag接口
所有的标签处理类都要实现JspTag接口。这个接口只是一个标识接口,没有任何方法,主要是作为Tag和SimpleTag接口的共同接口。在JSP2.0以前,所有的标签处理类都要实现Tag接口,实现该接口的标签称为传统标签(Classic Tag)。JSP2.0提供了SimpleTag接口,实现该接口的标签称为简单标签(Simple Tag)。本章将介绍传统标签的使用方法,后续的章节会介绍简单标签的用法。
2.2 Tag接口
Tag接口定义了所有传统标签处理类都要实现的基本方法,它包括以下几种:
- setPageContext(PageContext pc):由servlet容器调用此方法,向当前标签处理对象即Tag对象传递当前的PageContext对象。
- setParent(Tag t):由servlet容器调用该方法,向当前Tag对象传递父标签的Tag对象。
- getParent():返回Tag类型的父标签的Tag对象。
- release():当Servlet容器需要释放Tag对象所占用的资源时,会调用该方法。
- doStartTag():当Servlet容器遇到标签的起始标志时,会调用此方法。doStartTag()方法返回一个整形值,用来决定程序的后续流程。它有两个可选值,即Tag.SKIP_BODY(=0)和Tag.EVAL_BODY_INCLUDE(=1)。前者表示标签之间的主体内容被忽略,后者表示标签之间的主体内容被正常执行。例如对于以下代码:
<prefix:mytag>
Hello