自定义标签库笔记
JSP
的1.1 版中增加了自定义标签库。自定义标签库是一种非常优秀的组
技术。通过使用自定义标签库,可以在简单的标签中封装复杂的功能。
实现自定义标签按如下步骤进行:
(1)开发自定义标签处理类:
(2)建立一个*.t1d 文件,每个*.t1d 文件对应一个标签库,每个标签库对应多个标签:
(3)在web.xm1文件中增加自定义标签的定义:
(4) 在JSP 文件中使用自定义标签。
一、开发自定义标签类
使用标签类,可以使用简单的标签来封装复杂的功能,从而使团队更好地协作开发(能让美i人员更好地参与JSP 页面的开发)。
自定义标签类都必须继承一个父类: java.Servlet.jsp.tagext. TagSupport 。除此之外,
自定义标签类还有如下
。
·如果标签类包含属性,每个属性都有对应的getter 和setter 方法。
·重写doStartTagO或doEndTagO方法,这两个方法生成页面
。
·如果需要在销毁标签之前完成资源回收,则重写re1easeO方法。
下面提供了一个最简单的标签代码:
// 标签处理类,继承TagSupport 父类
import java.io.IOException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloWorldTag extends TagSupport {
// 重写 doEndTag方法,该方法在标签结束生成页面内容
public int doEndTag() throws JspTagException {
try {
// 获取页面输出流,并输出字符串
pageContext.getOut().write("Hello World");
}
// 捕捉异常
catch (IOException ex) {
// 抛出新异常
// throw new JspTagException("错误"};
}
// 值回返
return EVAL_PAGE;
}
}
这是个非常简单的标签,它只在页面中生成一个"Hello World" 的字符串。该标签
没有属性,因此无须提供setter 和getter 方法:此外,该标签无须初始化资源,因此无须重写init 方法:在标签结束时无须回收资源,因此无须重写destroy 方法。
二、建立TLD 文件
TLD 是Tag Library Definition 的缩写,即标签库定义,文件的后缀是tld ,每个TLD 文件对应一个标签库,一个标签库中可包含多个标签。TLD 文件也称为标签库定义文件。标签库定义文件的根元素是taglib ,它可以有多个tag 子元素,每个tag 子元素都对
应一个标签。
下面是test. tld 的标签定义文件,该文件中包含了HelloWorldTag 标签的定义代码:
1.0
1.2
test
helloworld
mytag.HelloWorldTag
empty
这个标签库配置文件非常简单,没有标签体及标签属性等。只是一个空标签。
三、在web.xml文件中增加自定义标签的定义
编辑了标签库定义文件还不够,Web 容器还无法加载标签库定义文件。还必须在web.xml 文件中增加标签库的定义。
在web.xml 文件中定义标签库时使用taglib 元素,该元素包含两个子元素: taglib-uri
和taglib-location,前者确定标签库的URI; 后者确定标签库定义文件的位置。
下面是web.xml 文件中关于test. tld 标签库的定义片段:
/tags/test.tld
/WEB-INF/test.tld
如果需要使用多个标签库,只需要增加多个taglib 元素即可,因为每个taglib 元素
可对应一个标签库。
四、使用标签库
使用标签库分成以下两步。
(1)导入标签库:使用taglib 编译指令导入标签。
(2) 使用标签:在JSP 页面中使用自定义标签。
附录:本节描述JSP页面如何使用标签,并介绍不同类型的标签。
要使用标签,页面编写者必须做以下两件事:
·声明包含标签的标签库
·让标签库实现对于Web应用程序可用
声明标签库
通过在使用任何自定义标签之前,将taglib指令加入页面中声明JSP页面将使用在标签库中定义的标签: <%@ taglib uri="/WEB-INF/tutorial-template.tld" prefix="tt" %>
uri属性
示唯一标识标签库描述符(TLD)的URI,在标签库描述符中描述了uri。这个URI可以是直接或者非直接的。prefix属性定义了区分指定标签库所定义的标签与其他标签库提供的标签的前缀。
标签库描述符文件名必须有扩展名.tld。TLD文件储存在WAR的WEB-INF目录中,或者在WEB-INF的子目录中。可以直接或者间接引用TLD。
下面taglib指令直接引用一个TLD文件名:
<%@ taglib uri="/WEB-INF/tutorial-template.tld" prefix="tt" %>
这个taglib指令使用一个短的逻辑名间接引用TLD:
<%@ taglib uri="/tutorial-template" prefix="tt" %>
在Web应用程序部署描述符中将逻辑名映射到一个绝对位置。要将逻辑名/tutorial-template映射为绝对位置/WEB-INF/tutorial-template.tld,在web.xml中添加元素taglib:
/tutorial-template
/WEB-INF/tutorial-template.tld
让标签库实现可用
可以以两种方式让标签库实现对Web应用程序可用。实现了标签handler的类可以以非打包的形式储存在Web应用程序的WEB-INF/classes子目录中。另一种方法是,如果以JAR的形式发布库,就将它储存在Web应用程序的WEB-INF/lib 目录中。在多个应用程序中共享的标签库储存在Java WSDP的
/common/lib目录中。
taglib 的语法格式如下:
<%@ taglib uri= "tagliburi" prefix="tagPrefix" %>
其中uri 属性确定标签库定义文件的URI,这个URI 就是在web.xml 文件中为标签
库定义的URI。而prefix 属性确定的是标签前缀,即在JSP 页面中使用标签时,该标签库负责处理的标签前缀。
使用标签的语法格式如下:
如果该标签没有标签体,则可以使用如下语法格式:
下面的JSP 页面使用HelloWorldTag标签:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri= "/tags/test.tld" prefix="mytag" %>
自定义标签示范
下面显示的是自定义标签中的内容
五、带属性的标签
除了前面的简单标签外,还有如下两种常用的标签。
.带属性的标签。
·带标签体的标签。
正如前面介绍的,带属性的标签必须为每个属性提供对应的setter 和getter 方法。
属性的标签的配置方法与简单标签也略有差别。
下面介绍一个带属性标签的示例:
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;