自定義標簽的步驟
自定義標簽的步驟大概有三步:
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
<?xml version="1.0"encoding="UTF-8" ?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlibversion>1.0</tlibversion>
<jspversion>2.0</jspversion>
<shortname>taglib</shortname>
<uri>http://notes.javaee.jsp.com/taglib</uri>
<info>Private Taglib</info>
<tag>
<name>copyright</name>
<tagclass>notes.javaee.jsp.taglib.Copyright</tagclass>
<bodycontent>JSP</bodycontent>
<info>Copyright tag.</info>
</tag>
</taglib>
|
l shortname指明推薦使用的prefix。
l uri指明引用這個標簽庫時使用的uri。
l tag指明要定義標簽的信息。
其中,tag可以設置的屬性如下:
屬性
|
描述
|
name
|
定義屬性的名稱。每個標簽的是屬性名稱必須是唯一的。
|
tagclass
|
指定映射的Java類。
|
required
|
指定屬性是否是必須的或者可選的,如果設置為false為可選。
|
rtexprvalue
|
聲明在運行表達式時,標簽屬性是否有效。
|
type
|
定義該屬性的Java類類型 。默認指定為String。
|
description
|
描述信息。
|
fragment
|
如果聲明了該屬性,屬性值將被視為一個JspFragment。
|
bodycontent
|
指明標簽體的限制,有3種取值:empty、JSP和tagdependent |
如果tld文件位於/WEB-INF/下面,Tomcat會自動加載tld文件中的標簽庫。如果位於其他的位置,可以在web.xml中配置。
<jsp-config>
<taglib>
<taglib-uri>http://notes.javaee.jsp.com/taglib</taglib-uri>
<taglib-location>/WEB-INF/taglib.tld</taglib-location>
</taglib>
</jsp-config>
|
或者在JSP中直接使用
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="taglib"%>
|
實例
使用TagSupport自定義標簽
1. 繼承標簽API
定義一個HelloTag類,繼承TagSupport類。
HelloTag.java:
package notes.javaee.jsp.taglib;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloTag extends TagSupport {
private static final long serialVersionUID = -8828591126748246256L;
private String name;
@Override
public int doEndTag() throws JspException {
try {
this.pageContext.getOut().println("Hello, " + name);
} catch (Exception e) {
throw new JspException(e);
}
return EVAL_PAGE;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
|
2. 在tld中配置標簽庫信息
在/WEB-INF下新建taglib.tld文件。
<shortname>指明推薦使用的prefix為taglib。
<uri>指明引用這個標簽庫時使用的uri為http://notes.javaee.jsp.com/taglib。
<tag>定義要引用的標簽信息。<name>指明標簽名,<tagclass>指明映射的Java類,和前面的對應。
然后定義這個標簽的屬性。因為前面Java類中的屬性為name,這里也要對應上。
taglib.tld:
<?xml version="1.0"encoding="UTF-8" ?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlibversion>1.0</tlibversion>
<jspversion>2.0</jspversion>
<shortname>taglib</shortname>
<uri>http://notes.javaee.jsp.com/taglib</uri>
<info>Private Taglib</info>
<tag>
<name>hello</name>
<tagclass>notes.javaee.jsp.taglib.HelloTag</tagclass>
<bodycontent>empty</bodycontent>
<info>Hello tag with parameters.</info>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
|
3. 在jsp文件中引用標簽
前面在tld文件中配置了各個關鍵信息,現在就可以直接在jsp文件中使用了。
首先,需要在jsp文件中引入標簽庫文件。這里和標准標簽庫JSTL一樣,使用taglib關鍵字來說明要引入的是標簽庫。uri是引入地址,prefix是標簽庫關鍵字。
<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>
由於前面定義的標簽name為hello,所以可以使用的標簽名為:prefix+name,即:taglib:hello。
Hello.jsp:
<%@ page language="java"contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<taglib:hello name="World"/> <br/>
</body>
</html>
|
結果:
使用SimpleTagSupport自定義標簽(JSP2.0)
1. 繼承標簽API
定義一個HelloTag類,繼承SimpleTagSupport類。
PersonTag.java:
package notes.javaee.jsp.taglib2;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class PersonTag extends SimpleTagSupport {
private String name;
private String sex;
private int age;
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().write(
"[Person Info]name: " + name + ", sex: " + sex + ", age:" + age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
|
2.在tld中配置標簽庫信息
在/WEB-INF下新建taglib.tld文件。
關鍵配置信息基本和使用TagSupport自定義標簽范例中一樣。但是由於對應Java類中有3個屬性,需要一一對應上。
taglib.tld:
<?xml version="1.0"encoding="UTF-8" ?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlibversion>1.0</tlibversion>
<jspversion>2.0</jspversion>
<shortname>taglib</shortname>
<uri>http://notes.javaee.jsp.com/taglib</uri>
<info>Private Taglib</info>
<tag>
<name>person</name>
<tagclass>notes.javaee.jsp.taglib2.PersonTag</tagclass>
<bodycontent>empty</bodycontent>
<info>person info tag</info>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>sex</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>age</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
|
3.在jsp文件中引用標簽
引用標簽方式和使用TagSupport自定義標簽范例一樣。
personTag.jsp:
<%@ page language="java"contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://notes.javaee.jsp.com/taglib"prefix="taglib"%>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<taglib:person name="Alex"sex="man" age="18"/>
</body>
</html>
|
結果: