1,自定义标签的步骤:
(1)白哦前处理类(标签也是一个对象,那么就需要创建类,进而创建对象)
(2)tld文件,是一个xml
(3)页面中使用<%@taglib%>来制定tld文件的位置
2,标签处理类
--》SimpleTag接口:
void doTag():每次执行标签是就会调用这个方法
JSPTag getParent():返回父标签
void setParent(JspTag):设置父标签
void setJspBody(JspFragment):设置标签体
void setJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext
其中doTage()会在其他三个方法之后被tomcat调用。
其实继承SimpleTagSupport类比较好实现,这也是常用的实现自定义标签的方法
3,配置tld文件
tld文件一般都放在WEB-INF之下,这样客户端就访问不到。
<tag>
<name>myTag1</name>指定当前白哦前的名称
<tag-class>com.tag.test</tag-class>指定当前标签的处理类
<body-content>empty</body-content>指定标签体的类型,这里使用的是空标签
</tag>
4,页面中指定tld文件位置
<%@taglib prefix="it" uri="/WEB-INF/tlds/my-tld.tld"%>
5,进阶
<body-content>元素的可选值有:
l empty:无标签体。
l JSP:传统标签支持它,SimpleTag已经不再支持使用<body-content>JSP</body-content>。标签体内容可以是任何东西:EL、JSTL、<%=%>、<%%>,以及html;
l scriptless:标签体内容不能是Java脚本,但可以是EL、JSTL等。在SimpleTag中,如果需要有标签体,那么就使用该选项;
l tagdependent:标签体内容不做运算,由标签处理类自行处理,无论标签体内容是EL、JSP、JSTL,都不会做运算。这个选项几乎没有人会使用!
自定义有标签体的标签需要:
l 获取标签体对象:JspFragment jspBody = getJspBody();;
l 把标签体内容输出到页面:jspBody.invoke(null);
l tld中指定标签内容类型:scriptless。
不再执行标签下面内容的标签!在标签处理类中的doTag()中使用SkipPageException来结束!
Tomcat会调用标签处理类的doTag()方法,然后Tomcat会得到SkipPageException,它会跳过本页面其他内容!
6,标签属性
步骤:
1. 给你的标签处理类添加属性!
为标签处理类添加属性,属性至少要且一个set方法!这个set方法会在doTag()方法之前被tomcat执行!所在doTag()中就可以使用属性了。
2. 在tld文件中对属性进行配置
<attribute>
<name>test</name> 指定属性名
<required>true</required> 指定属性是否为必需的
<rtexprvalue>true</rtexprvalue> 指定属性是否可以使用EL
</attribute>