实践
创建一个自定义标签处理程序类,该类继承TagSupport类,并且重载doEndTag()方法。
public class TagProcess extends TagSupport{
@Override
public int doEndTag(){
String nowTime = new simpleDateFormat("HH:mm:ss").format(new Date());
try{
pageContext.getOut().print(nowTime);
}catch{
e.printStackTrace();
}
return EVAL_PAGE
}
在WEB-INF文件夹下创建一个tld文件(标签库描述符文件),用来匹配标签和对应的标签处理程序类。命名为timeTag.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version>
<short-name>tit</short-name>
<uri> tap:\\www.thisisatimetaglib.com</uri>
<tag>
<name>nowTime</name>
<tag-class>javaBeansInJSP.TagProcess</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
将该标签库引入到jsp文件中,直接引用该标签即可。uri设置为该文件路径,prefix随便取只要不和保留字重复就可以。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="WEB-INF/timeTag.tld" prefix="timem" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test customerized Tag</title>
</head>
<body>
now let’s look at the time :<timem:nowTime/>
</body>
</html>
实现过程
jsp文件中的taglib标签中的uri用于JSP容器去定位该jsp标签的tld文件(标签库描述符文件),该文件指定了标签库里面的所有标签、各个标签的属性,以及每个标签对应的标签处理程序类,上述例子中的tld文件就指定了标签nowTime,然后每当JSP容器遇到标签的时候,就会到该标签对应的标签处理类中执行java程序,我们继承了tagSupport类,然后重载了endTag标签,jsp容器就会执行该方法,打印出当前时间。
细节
tld文件
本质就是一个xml文件,指定标签库中的所有标签以及各个标签的属性还有对应处理类。下面标签是属于tld文件的。
所有的tags都在taglib标签下,该标签含有tlib-version, short-name, uri?, validator?, listener*, tag*, tag-file*, function*, taglib-extension*标签。?是0或者1个,*是0或者n个。其他的是必备的。
标签名 | 描述 | 参考 |
---|---|---|
tlib-version | 标签库版本,由开发者定义 | |
short-name | 标签库容易记住的简称,也可以用来当标签库的前缀 | |
uri | 标识标签库的URI(唯一),用于定位tld文件(需要在web.xml做些配置),也可以直接通过tld的绝对路径来定位。上边例子就是如此。 | |
validator | 标签库的标签库校验器,匹配相应的校验处理程序类 | |
listener | 指定事件监听器类 | |
tag | 自定义的标签 | |
tag-file | 标签文件 | tag-file支持 |
function | 指定静态方法,用以在JSP直接调用 | |
taglib-extension | 不作用与jsp容器,与外部工具有关 |
其中的tag标签就是该标签库中的任意一个标签了,该标签通过其属性设置相应的处理程序、名称等等, name, tag-class, tei-class?, body-content, variable*, attribute*, dynamic-attributes?, example?, tag-extension*详细如下。
属性 | 描述 |
---|---|
name | 标签名 |
tag-class | 标签处理程序类名 |
tei-class? | 标签拓展信息类名(TagExtraInfo) |
body-content | 标签内内容的类型 |
variable* | 标签的变量,可进一步详细设置 |
attribute * | 标签属性,可进一步设置 |
dynamic-attributes? | 是否支持动态属性功能设置true或者false |
example? | 标签使用说明及范例描述 |
外部处理程序类
配置好了tld文件,再来看看外部处理程序类,该类必须实现标签处理程序接口,jsp1.2有三个接口,2.0又有新的接口,同时提供了一些实现了该接口的类,包括TagSupport(1.2版本)和BodyTagSupport类。如果要对标签内的属性值做些计算的话,该处理类就继承bodyTagSupport接口,否则继承TagSupport类就可以了。TagSupport类实现了IterationTag接口,该接口继承了Tag接口。例子中就是继承该类,列举几个重要的需要重写的方法如下:
方法名 | 描述 |
---|---|
doStartTag | 遇到开始标签时,执行该方法 |
doAfterBody | 在标签体计算过后调用该方法 |
doEndTag | 遇到结束标签时,执行该方法 |
这些方法有int类型的返回值,例如:EVAL_BODY_INCLUDE、SKIP_BODY,EVAL_PAGE、SKIP_PAGE、EVAL_BODY_AGAIN等等。
PageContext对象
tag不能细节访问隐含的JSP对象,可以通过pageContext来访问。如例子中的输出方法。
参考
【1】JSP自定义标签开发
【2】JSP WEB编程指南 Jayson Falkner Ben、Galbraith、Romin Lrani著.司光亚等译.电子工业出版社