【 tulaoshi.com - Web开发 】
                             
                            怎样自己定制标签(Custom Tag) 
(整理的学习笔记) 
步骤1、创建一个Tag handler class(标记处理器类) 
package javax.servlet.jsp.tagext 
开发空Body的标签处理器类-----1)implements Tag 2)extends TagSupport 
空Body的标签处理器类需要覆盖方法: 
doStartTag() 
返回值:Tag.SKIP_BODY 
doEndTag() 
返回值: 
1)Tag.EVAL_PAGE:让标签下面的内容继续执行 
2)Tag.SKIP_PAGE:让标签下面的内容不执行 
开发带Body的标签处理器类-----1)implements BodyTag 2)extends BodyTagSupport 
带Body的标签处理器类需要覆盖方法 
doStartTag() 
返回值: 
BodyTag.SKIP_BODY:执行后直接调用doEndTag()方法 
BodyTag.EVAL_BODY_INCLUDE:执行后直接调用doAfterBody()方法 
BodyTag.EVAL_BODY_BUFFERED: 
doEndTag() 
返回值: 
BodyTag.EVAL_PAGE:标签下面的内容继续执行 
BodyTag.SKIP_PAGE:标签下面的内容不执行 
doAfterBody() 
返回值: 
BodyTag.SKIP_BODY:执行后调用doEngTag()方法 
BodyTag.EVAL_BODY_AGAIN:执行后调用doAfterBody()方法 
步骤2、创建一个tld文件(tag library descriptor) 
一个XML格式的文件,用于对标记进行描述 
通常放在WEB-INF目录下 (/WEB-INF/*.tld) 
abc.tld 
?xml version="1.0" encoding="UTF-8" ? 
!DOCTYPE taglib 
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" 
!-- template test -- 
taglib 
tlib-version1.0/tlib-version 
jsp-version1.2/jsp-version 
short-nametagSample/short-name 
uri/tagSample/uri 
descriptionA blank tag library template./description 
tag 
namewelcome/name 
tag-classtagapp.HelloTag/tag-class 
body-contentempty/body-content 
display-namemy first tag/display-name 
small-icon /small-icon 
large-icon /large-icon 
description /description 
attribute 
namename/name 
requiredtrue/required 
rtexprvaluetrue/rtexprvalue 
typejava.lang.String/type 
/attribute 
/tag 
/taglib 
步骤3.创建一个JSP文件 
%@taglib uri="[tld_url]" prefix=""% 
%@taglib uri="/WEB-INF/abc.tld" prefix="mike"% 
... 
mike:welcome name=""/ 
uri的值可以是: 
A、/WEB-INF/mytag.tld ----- uri="/WEB-INF/mytag.tld" 
B、tld文件中 uri/tagSample/uri ------ uri="/tagSample" 
C、利用web.xml文件映射tld文件与taglib-uri的值 ----- uri="/abc" 
taglib 
taglib-uri/abc/taglib-uri 
taglib-location/WEB-INF/mytag.tld/taglib-location 
/taglib 
带Body的标签处理器类的方法的注释: 
doStartTag() 
return value: SKIP_BODY 空BODY标记 
EVAL_BODY_INCLUDE 带BODY标记,执行流程进入doAfterBody 
EVAL_BODY_BUFFERED 带BODY标记,执行流程进入setBodyContent 
doEndTag() 
return value: SKIP_PAGE 忽略标记后剩余的JSP内容 
EVAL_PAGE 继续执行标记后剩余的JSP内容 
doAfterBody() 
return value: SKIP_BODY 结束doAfterBody()方法,流程进入doEndTag() 
EVAL_BODY_AGAIN 继续执行doAfterBody()方法 
SimpleTagSupport 
较好的练习题: 
一、 
1、模仿jstl标签库开发下列标签: 
1)sql:setDataSource 
属性有: 
driver:必须的,可以用表达式 
url;必须的,可以用表达式 
user:必须的,可以用表达式 
password:必须的,可以用表达式 
2)sql:query 
属性有: 
dataSource:必须的,可以用表达式 
sql:必须的,可以用表达式 
3)sql:update 
属性有: 
dataSource:必须的,可以用表达式 
sql:必须的,可以用表达式 
2、开发类似于c:forEach的标签,可以遍历一个集合对象(可选,如不能完成,可直接利用jstl的标签来完成)