一 。自定义JSP标签的处理过程:
1.在JSP中引入标签库:
2.在JSP中使用标签库标签
3.Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
4.Web容器根据uri属性在web.xml找到对应的元素
5.从元素中获得对应的元素的值
6.Web容器根据元素的值从WEB-INF/目录下找到对应的.tld文件
7.从.tld文件中找到与tagname对应的元素
8.从元素中获得对应的元素的值
9.Web容器根据元素的值创建相应的tag handle class的实例
10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理
二。自定义标签步骤
1。定义标签实现类
继承自TagSupport或者TagBodySupport
JSP的servlet在处理tag的不同点调用不同的Tag handler方法,这些方法在Tag或者BodyTag接口中都有定义。
当JSP的servlet遇到自定义tag的开始tag的时候,servlet首先调用方法初始化合适的handler,然后调用handler的doStartTag()方法;
当JSP的servlet遇到自定义tag的结束tag的时候,servlet调用handler的doEndTag()方法。其他的方法在handler需要同tag的body相互作用的时候调用。
doStartTag:当SP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。
A.Tag.SKIP_BODY:表示标签之间的内容被忽略
B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行
doEndTag:当JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
doEndTag()方法也返回一个整数值,用来决定程序后续流程。
A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
B.Tag.EVAL_PAGE:表示按照正常的流程继续执行JSP网页
---------------------------------------------
Tag handler类型 方法
- - - - - - - - - - - - - - - - - - - - - - -
简单 doStartTag,doEndTag, release
- - - - - - - - - - - - - - - - - - - - - - -
包含属性 doStartTag,doEndTag, set/getProperties, release
- - - - - - - - - - - - - - - - - - - - - - -
有body,没有相互作用 doStartTag,doEndTag, release
- - - - - - - - - - - - - - - - - - - - - - -
有body,重复处理 doStartTag,doAfterBody, doEndTag, release
- - - - - - - - - - - - - - - - - - - - - - -
有body,有相互作用 doStartTag, doEndTag, release,doInitBody, doAfterBody
---------------------------------------------
EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
EVAL_PAGE:继续处理页面,doEndTag()函数可用
SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
EVAL_BODY_TAG:已经废止,由EVAL_BODY_BUFFERED取代
EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的。
2。定义tld文件
TLD的root是taglib element,taglib element的子element在下面列出:
<tlib-version><jsp-version><short-name>必填
---------------------------------------------
Element 描述
- - - - - - - - - - - - - - - - - - - - - - -
tlib-version tag库的版本
jsp-version tag库需要的JSP规范的版本
short-name 可选,JSP的开发者可以使用一个容易记忆的名字
uri 一个URI,它独一无二的确定一个tag库
display-name 可选,开发工具使用的显示名字
small-icon 可选,开发工具使用的小图标
large-icon 可选,开发工具使用的大图标
description 可选,关于tag的详细的信息
listener 参考下面的[listener Element]
tag 参考下面的[tag Element]
---------------------------------------------
Tag在TLD中使用tag Element来指定,下面列出的是tag Element允许的子element:
---------------------------------------------
Element 描述
- - - - - - - - - - - - - - - - - - - - - - -
name 唯一的tag名
tag-class Tag handler的类名
tei-class 可选,javax.servlet.jsp.tagext.TagExtraInfo的子类
body-content Body内容的类型
A. empty这个是一个空标记.
B. scriptless 主体可以有内容, 而jsp容器会去处理里面的jsp元素,
换句话就是可以是文本, EL表达式, 标准动作甚至另一个自定义标记.
C. tagdependent 主体可以有内容, 而jsp容器会把它们当作纯文件处理 .
display-name 可选,开发工具使用的显示名字
small-icon 可选,开发工具使用的小图标
large-icon 可选,开发工具使用的大图标
description 可选,关于tag的详细的信息
variable 可选,脚本变量信息
attribute Tag的属性信息
---------------------------------------------