JSP自定义标签开发步骤

时间:2022-03-24 04:55:13

自定义的标签库
一、基本概念:

1.标签(Tag):
标签,通常也成为动作,是一组按照XML语法格式编写的代码片段,在JSP中,用来封装在页面中可重复利用的逻辑,通过标签可以使JSP网页变得简洁并且易于维护。由于标签是XML元素,所以它的名称和属性都是大小写敏感的

2.标签库(Tag library):
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
SUN就推出了标准的JSTL。

3.标签库描述文件(Tag Library Descriptor): tld
标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
loginServlet web.xml <servelt>
outTag xxx.tld <tag>

4.标签处理类(Tag Handle Class):
标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能

案例:
1. <c:hello> hello标签,jsp页面使用标签时输出hello
2. <c:out value="" default=""> 输出输入的值,如果没有值,输出default的值
3. <c:forEach items="${requestScope.book_list}" var="book">

二、创建和使用一个Tag Library的基本步骤:

---------------------------------------------
1. 创建标签的处理类
-- 继承TagSupport
-- 实现doStartTag和doEndTag方法
2. 创建标签库描述文件tld
3. 在JSP文件中引入标签库
4. 执行时如果有属性,会调用setXXX方法。

重点掌握:
pageContext属性
doStartTag()
doEndTag()
doAfterBody()

---------------------------------------------

统一资源定位符(URL,英语 Uniform / Universal Resource Locator 的缩写)也被称为网页地址,是因特网上标准的资源的地址(Address)

Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通用资源标志符(Uniform Resource Identifier, 简称"URI")进行定位。

1.创建标签的处理类(Tag Handler Class)
hello标签,在jsp页面使用标签时输出helloworld
out标签,功能类似JSTL的<c:out>
forEach标签,功能类似JSTL的<c:forEach>

-- 以继承TagSupport的方式去开发一个标签.TagSupport是Tag的一个实现,
我们只需去扩展它,并覆盖相应的方法,那么就可以实现标签的开发了
-- 实现doStartTag和doEndTag方法
--doStartTag()和doEndTag()返回值是在Tag Interface里定义的静态int
SKIP_BODY隐含0 就是跳过了开始和结束标签之间的代码。
EVAL_BODY_INCLUDE 隐含1 将body的内容输出到存在的输出流中。包括是jsp代码,也可以被输出
SKIP_PAGE 隐含5 忽略标签剩下的页面。
EVAL_PAGE 隐含6 继续执行标签下面的页

pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象
JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext方法,
设置pageContext。因此在标签处理类中可以直接访问pageContext变量

doAfterBody()这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,
如果标签体决定需要再计算一次则从doStartTag和doAfterBody返回EVAL_BODY_AGAIN。
前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。

2.创建标签库描述文件(Tag Library Descrptor File)
-- 在WEB-INF下添加一个mytag.tld文件
tld是taglib description 的缩写

<tag>
<name>out</name> 标签名称
<tag-class>org.hellohowlow.tags.OutTag</tag-class> 标签实现类
<body-content>JSP</body-content> 标签里面支持的内容
<attribute>
<name>var</name>
<required>true</required> 是否必须
<rtexprvalue>true</rtexprvalue> rtexprvalue的全称是 Run-time Expression Value, 它指定使用标签时能不能使用表达式来动态指定数据${name}.。true是可以,false是不可以。
</attribute>
</tag>

body-content的值:
tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。
empty:空标记,即起始标记和结束标记之间没有内容。
scriptless:接受文本、EL和JSP动作。最少用

3.在JSP文件中引人标签库

三、自定义JSP标签的处理过程:

1.在JSP中引入标签库:
<%@ taglib uri="http://org.hellohowlow.1401/jsp/jstl/core" prefix="hh" %>
2.在JSP中使用标签库标签:
<hh:hello/>
3.Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
prefix="hh" uri="http://org.hellohowlow.1401/jsp/jstl/core"
4.Web容器自动到WEB-INF下面的tld文件中找到
<uri>http://org.hellohowlow.1401/jsp/jstl/core</uri>
5.从元素中获得对应的元素的值 hello
6.从.tld文件中找到与tagname对应的元素
<tag>
<name>hello</name> <!-- 标签的名称 -->
<tag-class>org.hellohowlow.tags.HelloTag</tag-class><!-- 标签的实现类 -->
<body-content>JSP</body-content> <!-- 标签里面支持的内容 -->
</tag>
7.Web容器根据元素的值创建相应的tag handle class的实例
<tag-class>org.hellohowlow.tags.HelloTag</tag-class>
8. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理

总结:
1. 创建标签的处理类
-- 继承TagSupport
-- 实现doStartTag和doEndTag方法,如果需要多次在body之后进行业务处理,需要重写doAfterBody方法。
2. 创建标签库描述文件tld
注意:tld中的attribute对应标签处理类的property属性(set/get)。
3. 在JSP文件中引入标签库
<%@ taglib uri="http://org.hellohowlow.1401/jsp/jstl/core" prefix="hh"%>
4. 执行时如果有属性,会调用setXXX方法。