JSP自定义标签
一, 基本概念:
标签(Tag):标签是一种XML元素,通过标签可以使JSP网页变得简洁易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的。
标签库(Tag library):由一系列功能相似,逻辑上互相联系的标签构成的集合称为标签库。
标签库描述文件(Tag Library Desriptor)
标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
标签处理类(Tag Handle Class)
标签处理类是一个Java类,这个类继承了TagSupport或着扩展了SimpleTag接口,通过这个接口可以实现自定义标签的具体功能。
两种标签: 可以自定义两种类型的标签:
javax.servlet.jsp.tagext.Tag
javax.servlet.jsp.tagext.BodyTag
有标签体的标签必须实现BodyTag接口
无标签体的简单标签可以实现Tag接口
JspTag |
SimpleTag |
Tag |
IterationTag |
SimpleTagSupport |
TagSupport |
BodyTag |
BodyTagSupport |
二、自定义JSP标签的格式:
1.<% @ taglib prefix=”someprefix” uri=”/sometaglib”>
为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件:
1) 从一个指定的标签库中识别出代表这种自定义行为的标签
2) 找到实现这些自定义行为的具体类
第一个必需条件-找出自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directive’s Prefix),用在标签库的文档中或者页面中插入自定义标签。所以你可以使用除了诸如jsp, jspx, java servlet
sum, sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。
uri属性满足了以上第二个要求,为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件文件,在TLD文件中可以找到标签库中所有标签处理类的位置
当web使用程序启动时,容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也即使说它们会定位所有的TLD文件,对于每个TLD文件,容器会先获取标签库的URI,然后为每个TLD文件和对应的URI创建映射关系。
三、自定义JSP标签的处理过程
1. 在JSP中引入标签库:
<%@ taglib prefix=” taglibpfex” uri=”tagliburi”>
2. 在JSP中使用标签库标签
3. Web容器根据prefix,获得第一个步骤中声明的taglib的uri属性值
4. Web容器根据uri属性在web.xml找到对应的元素(4,5可以不要)
5. 从元素中获得对应的元素值
<taglib>
<taglib-uri>/myTag</taglib-uri>
<taglib-location>/WEB-INF/myTag.tld</taglib-location>
</taglib>
6. Web容器根据元素的值在WEB-INF/目录下找到对应的.tld文件
7. 从.tld文件中找到与tagname对应的元素
8. 从元素中或的对应元素的值
9. Web容器根据元素的值创建相应的tagHandle class的实例
10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的操作。
四,创建和使用一个Tag Library的基本步骤
1. 创建标签的处理类(Tag Handler Class)
2. 创建标签库描述文件(Tag Library Descriptor File)
3. 在web.xml文件中配置元素(可选)
4. 在jsp文件中引入标签库
五、创建标签库描述文件(Tag Library Descriptor)
1. 标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:
A : 标签库元素
B:标签元素
C:标签属性元素
2. 标签库元素用来设定标签库的相关信息,它的常用属性有:
A. shortname: 指定Tag Library默认的前缀名(prefix)
B. uri:指定TagLibrary的唯一访问表示符
3. 标签元素用来定义一个标签,它的常见属性有:
A.name 设定Tag的名字
B.tagclass 设定Tag的处理类
C.bodycontent 设定标签的主体(body)内容
1)tagdependent:标签体内容 直接被写入到BodyContent,由自定义标签类进行处理,而不被JSP容器来解释。
2)JSP:接收所有JSP语法,如定制的或内部的tag,script,静态HTML,脚本元素,JSP指令和动作。
3)empty: 空标记,即其实标记和结束标记之间没有内容。
下面集中写法都是有效的。
<test: mytag/> <test:mytag name=”Tom” /> <test:mytag></test:mytag>
3) scriptless:接收文本、EL和JSP动作。
标签属性元素用来定义标签的属性,它的常见属性有:
A. name: 属性名称
B. required: 属性是否必需的,默认为false
C. rtexprvalue: 属性视为可以为request-time表达式,也就是类似<%=…%>
六、如何创建标签处理类:
1.引入必需的资源:
2.继承自TagSupport类并覆盖doStartTag()/doEndTag()方法
TagSupport类简介
1. 处理类标签的类必须扩展javax.servlet.jsp.TagSupport.
2. TagSupport类的主要属性:
A. parent属性:代表嵌套了当前标签的上层标签的处理类。
B. pageContext属性:代表了Web应用中javax.servlet.jsp.PageContext对象,通过此对象可向jsp页面中输出信息。
3. JSP容器在调用doStart或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent对象,因此在标签处理类中可以直接方法pageContext变量。
4. 在TagSupport的构造方法中不能方法pageContext成员变量,因为此时JSP容器还没有调用setPageContext()方法对pageContext进行初始化
七、TagSupport处理标签的方法:
1. TagSupport类提供了两个处理标签的方法:
public int doStartTag() throws JspException
public int doEndTag() throws JspException
2. doStartTag:但JSP容器遇到自定义标签的其实标签时,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。
A. Tag.SKIP_BODY 表示标签之间的内容别忽略
B. Tag_EVAL_BODY_INCLUDE 表示标签之间的内容会被正常执行。
3. doEndTag: 当JSP容器遇到自定义标签的结束标记时,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。
A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上为处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户端的浏览器上。
B. Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页。
setPageContext() setParent() setAttributes() |
doStartTag() |
Tag.EVAL_BODY_INCLUDE
Evalute the body contents |
doEndTag() |
Tag.SKIP_PAGE
Evalute rest of the JSP page |
Return from the current JSP page |
jsp2.0中为了简化标签的复杂性,增加而来制作SimpleTag的标签类SimpleTagSupport类,SimpleTagSupport类实现了SimpleTag接口的,它只需要实现一个doTag()方法即可,而不需要一堆回传值