从jsp1.1开始就可以在jsp页面中使用自定义标签了,使用自定义标签不但可以实现代码重用,而且可以使jsp代码更简洁。Jsp2.0的标签扩展API中又增加了SimpleTag接口和其实现类SimpleTagSupport。
TLD文件元素详解:
每个自定义标签都必须在TLD文件中声明,TLD文件只不过是一个XML文件。根元素是<taglib>,它包含一个或者多个<tag>标签,该元素用来声明定制标签。<taglib>元素中只有<tlib-version>元素是必须的,其他都是可选的。
TLD文件中的元素
标 签 |
含 义 |
<taglib> |
TLD文件的根元素 |
<tlib-version> |
此标签库的版本 |
<jsp-version> |
此标签库依赖的JSP版本。 |
<short-name>
<description> <display-name> <icon> <uri> <validator> <listener> <function> |
当在JSP中使用标签时,此标签库首选或者建议的前缀。当然可以完全忽略这个建议 描述信息 图形工具可显示的一个简短名称 图形工具可显示的图标 指定使用该标签库中标签的URI 关于该库的TagLibraryValidator信息 指定事件监听器类 定义一个在EL中使用的函数 |
<tag> |
定义一个标签 |
<tag>元素的子元素
标 签 |
含 义 |
<description> <display-name> <icon> <name> |
指定针对标签的信息 开发工具用于显示的一个简短名称 可被开发工具使用的图标 标签名称 |
<tag-class>
<tei-class> |
Java标签处理器类的名称。注意这是处理器类的全限定名称,比如com.xx.tag.TableTag Javax.servlet.jsp.tagext.TagExtraInfo类的一个可选子类 |
<body-content>
<variable> <example> |
此标签的主体部分的内容。其值可为scriptless\tagdependent\empty,默认为empty 定义脚本变量信息 使用该标签例子的可选的非正式描述 |
<attribute> |
包含了此标签的一个属性的元数据 |
<attribute>的子元素
标 签 |
含 义 |
<description> <name> |
有关描述的文本信息 在jsp标签中使用的属性名称 |
<required>
<rtexprvalue>
<type> |
指定属性是必须的还是可选的,默认为false,表示属性可选。如果该值为true,则jsp页面必须为该属性提供一个值。可能的值true、false、yes、no 指定属性是否能接受请求时表达式的值,默认为false,表示不能接受请求时表达式的值。可能值:true、false、yes、no 属性的数据类型,该元素只能用在当<rtexprvalue>设置为true时。它指定当使用请求时属性表达式(<%= %>)返回类型。默认string |
下面举例详解。
<description>;我在test.jsp 页面写了 <ex:hello /> 后,我把鼠标放在该标签上时提示 description中的内容。
<xsd:enumeration value="tagdependent"/> <xsd:enumeration value="JSP"/> <xsd:enumeration value="empty"/> <xsd:enumeration value="scriptless"/> |
tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释,
如下:
<test:myList>
select name,age from users
</test:myList>
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。如: 这种很好理解
<my:test>
<%=request.getProtocol()%> // ②
</my:test>
具体可参考后面附源码。
empty:空标记,即起始标记和结束标记之间没有内容。 这种很好理解
下面几种写法都是有效的,
<test:mytag />
<test:mytag uname="Tom" />
<test:mytag></test:mytag>
scriptless:接受文本、EL和JSP动作。如上述②使用<body-content> scriptless </body-content>则报错,具体可参考后面附源码。
标签扩展API层次结构: