自定义标签的步骤大概有三步:
1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag、TagSupport、BodyTagSupport、SimpleTagSupport(JSP2.0)。
2.在tld文件中配置标签库信息,以及标签与实现类的映射。
3.在jsp文件中引用自定义标签。
标签API
Tag接口
doEndTag():执行当前标签实例的结束标签。在doStartTag()执行后调用
doStartTag():执行当前标签实例的开始标签。
getParent():获取当前标签的父标签
release():释放当前标签的状态
setPageContext(PageContext):设置当前标签的页面
setParent(Tag):设置当前标签的父标签
TagSupport类
TagSupport类是实现Tag接口的一个模板类。它实现了Tag接口的大部分方法,用户只需要实现doStartTag()和doEndTag()方法。
SimpleTag接口(JSP2.0)
JSP2.0的接口,比Tag接口更简单。
doTag():执行当前标签的所有处理任务。
getParent():获取当前标签的父标签。
setJspBody(JspFragment):提供当前标签的实体为一个JspFragment对象
setJspContext(JspContext):设置JSP页面的
setParent(JspTag):设置当前标签的父标签。
SimpleTagSupport类(JSP2.0)
SimpleTagSupport类是实现SimpleTag接口的一个模板类。它实现了SimpleTag接口的大部分方法,用户只需要实现doTag()方法。
tld标签库描述文件
tld全称为Tag
Library Description,即标签库描述文件。
tld文件用来配置标签库的基本信息。
taglib主要元素
taglib.tld<?xmlversion ="1.0"encoding="UTF-8" ?>
xmlns="/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee
web-jsptaglibrary_2_0.xsd"
version="2.0">
1.0
2.0
taglib
http://notes./taglib
Private Taglib
copyright
notes.javaee.jsp.taglib.Copyright
JSP
Copyright tag.
lshortname指明推荐使用的prefix。
luri指明引用这个标签库时使用的uri。
ltag指明要定义标签的信息。
其中,tag可以设置的属性如下:属性描述
name定义属性的名称。每个标签的是属性名称必须是唯一的。
tagclass指定映射的Java类。
required指定属性是否是必须的或者可选的,如果设置为false为可选。
rtexprvalue声明在运行表达式时,标签属性是否有效。
type定义该属性的Java类类型 。默认指定为String。
description描述信息。
fragment如果声明了该属性,属性值将被视为一个JspFragment。
bodycontent指明标签体的限制,有3种取值:empty、JSP和tagdependent
empty:不允许有标签体存在。JSP:允许有标签体存在。tagdependent:允许有标签体存在,但是标签体内的JSP代码不会被执行。
如果tld文件位于/WEB-INF/下面,Tomcat会自动加载tld文件中的标签库。如果位于其他的位置,可以在web.xml中配置。
http://notes./taglib
/WEB-INF/taglib.tld
或者在JSP中直接使用
实例
使用TagSupport自定义标签
1.继承标签API
定义一个HelloTag类,继承TagSupport类。
HelloTag.java:packagenotes.javaee.jsp.taglib;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.tagext.TagSupport;
publicclassHelloTagextendsTagSupport {
privatestaticfinallongserialVersionUID= -8828591126748246256L;
privateStringname;
@Override
publicintdoEndTag()throwsJspException {
try{
this.pageContext.getOut().println("Hello, "+name);
}catch(Exceptione) {
thrownewJspException(e);
}
returnEVAL_PAGE;
}
publicString getName() {
returnname;
}
publicvoidsetName(Stringname) {
this.name=name;
}
}
2.在tld中配置标签库信息
在/WEB-INF下新建taglib.tld文件。
指明推荐使用的prefix为taglib。
定义要引用的标签信息。指明标签名,指明映射的Java类,和前面的对应。
然后定义这个标签的属性。因为前面Java类中的属性为name,这里也要对应上。
taglib.tld:<?xmlversion ="1.0"encoding="UTF-8" ?>
xmlns="/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee
web-jsptaglibrary_2_0.xsd"
version="2.0">
1.0
2.0
taglib
http://notes./taglib
Private Taglib
hello
notes.javaee.jsp.taglib.HelloTag
empty
Hello tag with parameters.
name
true
true
3.在jsp文件中引用标签
前面在tld文件中配置了各个关键信息,现在就可以直接在jsp文件中使用了。
首先,需要在jsp文件中引入标签库文件。这里和标准标签库JSTL一样,使用taglib关键字来说明要引入的是标签库。uri是引入地址,prefix是标签库关键字。
由于前面定义的标签name为hello,所以可以使用的标签名为:prefix+name,即:taglib:hello。
Hello.jsp:
Insert title here
结果:
使用SimpleTagSupport自定义标签(JSP2.0)
1.继承标签API
定义一个HelloTag类,继承SimpleTagSupport类。
PersonTag.java:packagenotes.javaee.jsp.taglib2;
importjava.io.IOException;
importjavax.servlet.jsp.JspException;
importjavax.servlet.jsp.tagext.SimpleTagSupport;
publicclassPersonTagextendsSimpleTagSupport {
privateStringname;
privateStringsex;
privateintage;
@Override
publicvoiddoTag()throwsJspException, IOException {
this.getJspContext().getOut().write(
"[Person Info]name: "+name+", sex: "+sex+", age:"+age);
}
publicString getName() {
returnname;
}
publicvoidsetName(Stringname) {
this.name=name;
}
publicString getSex() {
returnsex;
}
publicvoidsetSex(Stringsex) {
this.sex=sex;
}
publicintgetAge() {
returnage;
}
publicvoidsetAge(intage) {
this.age=age;
}
}
2.在tld中配置标签库信息
在/WEB-INF下新建taglib.tld文件。
关键配置信息基本和使用TagSupport自定义标签范例中一样。但是由于对应Java类中有3个属性,需要一一对应上。
taglib.tld:<?xmlversion ="1.0"encoding="UTF-8" ?>
xmlns="/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee
web-jsptaglibrary_2_0.xsd"
version="2.0">
1.0
2.0
taglib
http://notes./taglib
Private Taglib
person
notes.javaee.jsp.taglib2.PersonTag
empty
person info tag
name
true
true
sex
true
true
age
true
true
3.在jsp文件中引用标签
引用标签方式和使用TagSupport自定义标签范例一样。
personTag.jsp:
Insert title here
结果: