自定義標籤在功能上邏輯上與javaBean 類似,都封裝Java 代碼。自定義標籤是可重用的組件代碼,並且允許開發人員爲複雜的操作提供邏輯名稱;其實換句話說,taglib可以看成是對JSP標記的一種擴展,正如xml是對html的一種擴展一樣。
爲什麼要使用自定義標籤?
JSTL標籤庫只提供了簡單的輸出等功能,沒有實現任何的HTML代碼封裝,並且某些複雜類型轉換,或者邏輯處理的時候,JSTL標籤庫完成不了,需要自定義標籤!
一般情況,自定義tag標籤主要用於操作隱藏對象、處理html提交表單、訪問數據庫等操作。
自定義標籤語法中兩類標籤:自定義標籤與自定義函數。
自定義標籤與普通標籤庫中的標籤用法相同,自定義函數它可以讓我們在jsp用直接調用某個方法,根據自定義的方法返回指定的值,兼容jstl標籤,省去了在jsp中直接使用<%!%>來定義方法體再調用的繁瑣。
編寫自定義標籤的步驟:
1.編寫一個實現Tag接口的Java類【標籤處理器類】;
2.在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在tld文件中對標籤處理類(實現Tag接口的Java類)進行描述;
自定義標籤TLD文件配置屬性說明:
taglib子元素說明:
tlib-version:標籤庫的版本
jsp-version:這個標籤庫要求的JSP規範版本
short-name:JSP頁面編寫工具可以用來創建助記名的可選名字
uri:唯一標識該標籤庫的的URI
display-name:將由工具顯示的可選名
description:可選的標籤特定信息
listener:一個tag庫可能定義一些類做爲它的事件偵聽類,這些類在TLD中被稱爲listener 元素,jsp服務器將會實例化這些偵聽類,並且註冊它們。Listener元素中有一個叫listener-class的子元素,這個元素的值必須是該偵聽類的完整類名。
tag子元素說明:
name:獨一無二的元素名
tag-class:Tag標籤對應的tag處理類
tei-class:javax.servlet.jsp.tagext.TagExtraInfo的子類,用於表達腳本變量(可選)
body-content:Tag標籤body的類型
display-name:被可視化工具(諸如Jbuilder)用來顯示的名稱(可選)
small-icon:被可視化工具(諸如Jbuilder)用來顯示的小圖標(可選)
large-icon:被可視化工具(諸如Jbuilder)用來顯示的大圖標(可選)
description:此tag標籤的描述
variable:提供腳本變量的信息(同tei-class)(可選)
attribute:Tag標籤的屬性名
attribute子元素說明:
name:屬性名
required:該屬性名可不可省略
rtextprvalue: 表示的是屬性是否接受scriptlet表達式的計算結果,默認情況下爲false,即只能接受靜態值
type:標籤處理類中相關屬性的類型
自定義標籤實例:
編寫一個實現Tag接口的Java類:
通常我們自定義類繼承TagSupport、BodyTagSupport,重寫doStartTag(),doAfterBody()和doEndTag()方法,在對應方法中實現我們自己的邏輯:
public class SelectButton extends BodyTagSupport {
private static final long serialVersionUID = 1L;
private String flag;
private JspWriter out;
public void init() {
out = pageContext.getOut();
}
@Override
public int doStartTag() throws JspException {
init();
return super.EVAL_BODY_INCLUDE;
}
//處理方法
@Override
public int doEndTag() throws JspException {
try {
StringBuffer sb=new StringBuffer();
sb.append("<select>");
if(flag=="0") {
sb.append("<option value =\"shanxi\">山西</option>");
sb.append("<option value =\"beijing\">北京</option>");
sb.append("<option value=\"shanghai\">上海</option>");
sb.append("</select>");
}else {
sb.append("<option value =\"shanxi\">山西1</option>");
sb.append("<option value =\"beijing\">北京1</option>");
sb.append("<option value=\"shanghai\">上海1</option>");
sb.append("</select>");
}
out.print(sb.toString());
}catch (Exception e) {
// TODO: handle exception
}
return super.EVAL_PAGE;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
}
爲了簡化標籤開發的複雜度,在JSP 2.0中定義了一個更爲簡單、便於編寫和調用的SimpleTag接口來實現標籤的功能。一般地,我們做開發都是繼承SimpleTagSupport類(該類實現了SimpleTag)來編寫自定義標籤。
實現了SimpeTag接口的標籤稱之爲簡單標籤:
public class SimpSelectButton extends SimpleTagSupport {
private String flag;
@Override
public void doTag() throws JspException, IOException {
StringBuffer sb = new StringBuffer();
sb.append("<select>");
if (flag == "0") {
sb.append("<option value =\"shanxi\"><--簡單的標籤實現方式--></option>");
sb.append("<option value =\"shanxi\">山西</option>");
sb.append("<option value =\"beijing\">北京</option>");
sb.append("<option value=\"shanghai\">上海</option>");
sb.append("</select>");
} else {
sb.append("<option value =\"shanxi\">山西1</option>");
sb.append("<option value =\"beijing\">北京1</option>");
sb.append("<option value=\"shanghai\">上海1</option>");
sb.append("</select>");
}
this.getJspContext().getOut().write(sb.toString());
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
}
在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在tld文件中對標籤處理類(實現Tag接口的Java類)進行描述
<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>自定義標籤庫</description>
<display-name>author functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>author</short-name>
<uri>/author</uri>
<tag>
<description><![CDATA[Render a select element]]></description>
<name>select</name>
<tag-class>com.qiyun.SelectButton</tag-class> <!-- 注意這裏是自己定義的標籤類(處理你自己的標籤內容)-->
<body-content>JSP</body-content>
<attribute>
<description><![CDATA[The css class to use for element]]></description>
<name>flag</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<tag>
<description><![CDATA[Render a select element]]></description>
<name>simpselect</name>
<tag-class>com.qiyun.SimpSelectButton</tag-class> <!-- 注意這裏是自己定義的標籤類(處理你自己的標籤內容)-->
<body-content>empty</body-content>
<attribute>
<description><![CDATA[The css class to use for element]]></description>
<name>flag</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
自定義標籤的使用:
如果要使用tag標籤,則應用JSP的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標籤之前聲明)
<%@taglib prefix="author" uri="/author" %>
uri屬性定義了唯一的標籤庫描述(以下簡稱TLD),它可以是直接是tld文件名或一個獨一無二的名字。
prefix是用來區別其它TLD中和本TLD中有重名的tag的一種手段。
TLD必須以.tld作爲擴展名,並且存放在當前應用的WEB-INF目錄或其子目錄下。你可以通過它的文件名直接引用它,也可以通過別的方式間接地引用它。
引用自定義標籤的簡單使用:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="author" uri="/author" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>練習自定義標籤TLD的用法</title>
</head>
<body>
<div><author:select flag="0"></author:select> </div>
<div><author:simpselect flag="0"></author:simpselect> </div>
</body>
</html>
自定義函數:
自定義函數也是自定義標籤的一種,只是更加簡單。
編寫自定義函數的步驟:
1.編寫一個實現function接口的Java類【標籤處理器類】;
2.在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在tld文件中對標籤處理類(實現function接口的Java類)進行描述;
自定義函數TLD文件配置屬性說明:
taglib子元素說明:
tlib-version:標籤庫的版本
jsp-version:這個標籤庫要求的JSP規範版本
short-name:JSP頁面編寫工具可以用來創建助記名的可選名字
uri:唯一標識該標籤庫的的URI
display-name:將由工具顯示的可選名
description:可選的標籤特定信息
listener:一個tag庫可能定義一些類做爲它的事件偵聽類,這些類在TLD中被稱爲listener 元素,jsp服務器將會實例化這些偵聽類,並且註冊它們。Listener元素中有一個叫listener-class的子元素,這個元素的值必須是該偵聽類的完整類名。
function子元素說明:
description:可選的標籤特定信息
name:獨一無二的元素名
function-class:定義函數處理類
function-signature:定義函數的對應方法
實例:執行標籤具體的方法的類
實例:編寫執行標籤具體的方法的類:
public class Tools {
/**
* 獲取當前用戶權限
*/
public static String getUserAuthor(String menuId) {
return menuId;
}
}
在WEB-INF目錄下創建tld(Tag Library Descriptor)文件,在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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>自定義標籤庫</description>
<display-name>author functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>author</short-name>
<uri>/author</uri>
<function>
<description>取得用戶權限</description>
<name>author</name>
<function-class>com.qiyun.Tools</function-class>
<function-signature>java.lang.String getUserAuthor(java.lang.String)</function-signature>
</function>
</taglib>
自定義函數的使用:
如果要使用自定義函數,與自定義標籤一樣,則應用JSP的taglib指示符來指定其tag庫(注意:taglib要在在使用此tag標籤之前聲明)
<%@taglib prefix="author" uri="/author" %>
uri屬性定義了唯一的標籤庫描述(以下簡稱TLD),它可以是直接是tld文件名或一個獨一無二的名字。
prefix是用來區別其它TLD中和本TLD中有重名的tag的一種手段。
TLD必須以.tld作爲擴展名,並且存放在當前應用的WEB-INF目錄或其子目錄下。你可以通過它的文件名直接引用它,也可以通過別的方式間接地引用它。
引用自定義標籤的簡單使用:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="author" uri="/author" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>練習自定義標籤TLD的用法</title>
</head>
<body>
<button class="${author:author('button1')}">${author:author('button')}</button>
<h1 class="hidden">這是一個隱藏標題</h1>
<h1>這是一個標題</h1>
</body>
</html>
<style>
button.button{
display: none;
}
h1.hidden {display:none;}
</style>