[JSP]自定義標籤庫taglib
自定義標籤的步驟大概有三步:
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():獲取當前標籤的父標籤。
:提供當前標籤的實體為一個JspFragment物件
setJspContext(JspContext):設定JSP頁面的
setParent(JspTag):設定當前標籤的父標籤。
SimpleTagSupport類(JSP2.0)
SimpleTagSupport類是實現SimpleTag介面的一個模板類。它實現了SimpleTag介面的大部分方法,使用者只需要實現doTag()方法。
tld標籤庫描述檔案
tld全稱為TagLibrary 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 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 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。
<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> |
結果:
作者:靜默虛空