|
8.创建标签库描述文件
标签库描述文件(Tag Library Discriptor,TLD)是一份标准的XML文件,用来记录一个标签库内拥有哪些标签?每个标签包含哪些属性?取得这些信息后,JSP容器才能正确地处理并运行JSP所包含的自定义标签。以下是一个JSP2.0规范的TLD:
weclome.tld
<?xml version="1.0" encoding="UTF-8"?>
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<!-- 此标签库的一个描述 -->
<description>A tag library exercising SimpleTag handlers.</description>
<!-- 此标签库的版本,由程序设计师自行决定(必须) -->
<tlib-version>1.0</tlib-version>
<!-- 定义一个简短的名称(必须)主要由工具使用 -->
<short-name>SimpleTagLibrary</short-name>
<!-- 定义该标签库的唯一uri名(在taglib指令中使用) -->
<uri>/SimpleTagLibrary</uri>
<tag><!-- 定义每个标签的特性 -->
<description>body content to Upper</description><!-- 描述 -->
<name>simpletag</name> <!-- 自定义标签的名称 -->
<tag-class>xmh.comchapter11.Welcome</tag-class> <!-- 此标签对应的处理类 -->
<body-content>scriptless</body-content><!-- 定义标签主体的种类:指定标签的格式,empty表示标签没有标签主体;JSP表示标签的标签体中可以包含JSP代码;scriptless表示标签主体中可以包含EL表达式和JSP的动作元素,但不能包含JSP的脚本元素;tagdependent表示标签的标签主体交由标签本身去解析处理。如果指定为它,那么你在标签体中所写的任何代码都会原封不动地传给标签处理器,而不是传递执行的结果。 -->
<attribute>
<name>attrName</name> <!-- 此属性的名称 -->
<required>false</required> <!-- 此属性是否为必要:true | false -->
<rtexprvalue>true</rtexprvalue><!-- 属性值是否可以在JSP运行时期动态产生:true | false -->
</attribute>
</tag>
</taglib>
9.在web.xml文件中声明TLD的位置
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
......
<jsp-config>
<taglib>
<!-- 指定TLD文件所对应的URI -->
<taglib-uri>/mytag</taglib-uri>
<!-- 指定TLD文件的存放路径 -->
<taglib-location>/WEB-INF/tlds/weclome.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
注意在JSP2.0规范中可以不用声明TLD的位置,因为容器开始建立<uri>和TLD映射时,会首先在web.xml中查找,看是否有<taglib>项,如果确实有,就会使用这些设置来帮助建立映射。否则会在WEB-INF目录以及它的tlds子目录(还可以是jar文件中)下查找TLD文件,然后自动建立TLD文件和<uri>名之间的映射关系。
10.在JSP文件中用taglib指令引入标签库
<%@ taglib uri="/mytag" prefix="my" %>
11.在JSP中使用标签库标签
<my:simpletag>Hello,World!</my:simpletag>
12.自定义JSP标签的处理过程
<!--[if !supportLists]-->(1)在JSP中引入标签库:<% @ taglib prefix="taglibprefix" uri="tagliburi" %>。
<!--[if !supportLists]-->(2)在JSP中使用标签库标签:<prefix : tagname attribute="tagattribute">。
<!--[if !supportLists]-->(3)Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值。
<!--[if !supportLists]-->(4)Web容器根据uri属性在web.xml找到对应的<taglib>元素。
<!--[if !supportLists]-->(5)从<taglib>元素中获得对应的<taglib-location>元素的值。
<!--[if !supportLists]-->(6)Web容器根据<taglib-location>元素的值从WEB-INF/目录下找到对应的.tld文件。
<!--[if !supportLists]-->(7)从.tld文件中找到与tagname对应的<tag>元素。
<!--[if !supportLists]--><!--[endif]-->(8)从<tag>元素中获得对应的<tag-class>元素的值。
<!--[if !supportLists]-->(9)Web容器根据<tag-class>元素的值创建相应的标签处理类的实例。
<!--[if !supportLists]-->(10)Web容器调用这个实例的doStartTag/doAfterBody/doEndTag方法完成相应的处理。