JSP的自定义标签(一)

实践

创建一个自定义标签处理程序类,该类继承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著.司光亚等译.电子工业出版社

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值