JSP標簽庫介紹
我使用JSP和ASP編程已經有一段頗長的時間了,在兩種服務器端的編程方式中,我越來越覺得JSP的功能要強大得多。不提別的,其中JSP的標簽庫就是我選擇JSP作為首選服務器端web應用開發工具的原因。
為什么?有兩個方面:維護和開發的速度。在一個單一的服務器頁面中,你可以混合使用各種不同的腳本方法和對象。就象“混凝土”一樣,這種混合可令服務器端的腳本變得強大,并且讓服務器端的編程者設計出非常靈活和動態的web頁面。不過這種自由的混合也有其缺點,那就是維護起來非常麻煩,特別是當項目逐漸變大時。由于最終的產品是經由一個傳統的web設計者來維護的,因此會帶來問題。更糟糕的是,隨著代碼的復雜性增加,開發的速度就會變慢,不利于開發中等和大型的web應用,一旦開發完,站點還要找合格的編程者來維護這些頗為復雜的代碼。
為此ASP可讓我們使用COM對象,而JSP則提供J2EE來解決這些問題。這些方法的共通之處都是經由建立集中的可重用代碼庫。不過它們都更難,需要更多的時間去學習它。對于中等的項目來說,通常都較少使用這樣的方法,但事實上,中等的web應用項目才是最多的。因此,許多項目都不得不使用一個不符合它們需要的開發和維護環境。
幸好,JSP提供了一個更好解決的辦法。標簽庫提供了一個簡單的方法來建立一個可重用的代碼塊。一旦標簽庫設計好,它就可以在許多項目中再次使用。更方便的是,與COM和J2EE不同,你無需學習任何其它的技巧就可以建立一個標簽庫!只要你懂得寫JSP,你就可以建立一個標簽庫。標簽庫還可以改善web應用的維護。這個是得益于JSP頁面自定義標簽的簡單XML接口。這樣,web設計者甚至可以做到無需知道任何JSP的知識,就可以建立JSP的web應用。這個開放式的web開發對于團隊運作是非常有效的。JSP編程者可以建立自定義的標簽和后臺的代碼模塊,而web設計者可以使用自定義的標簽來建立web應用,并且將精力集中在web設計上。
那么標簽庫究竟是什么?
JSP標簽庫(也稱自定義庫)可看成是一套產生基于XML腳本的方法,它經由JavaBeans來支持。在概念上說,標簽庫是非常簡單和可以重用的代碼構造。
執行XML/XSL轉換的標簽范例和HTML頁面
<%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%>
c:/xml/example.xml
c:/xml/example.xsl
在這個例子中,通過使用簡單的標簽來訪問后臺更為強大的代碼,一個XML被裝載,并且通過一個XSL文件來產生一個結果,并發送給客戶端,全部通過使用一個簡單的標簽調用就做到了。
自定義標簽為在JSP項目中創建易于重用的代碼打開了一扇大門。你所需要的只是標簽庫和它的文檔說明。
標簽庫的重要特性
1.易于在多個項目安裝
標簽庫可以很方便地在項目間轉移。一旦標簽庫建立好,則只需要將所有的東西打包為一個JAR文件,你就可以在任何的JSP項目中重新使用。由于這個原因,標簽庫越來越通行,在網上,你要找標簽的最佳地點是JSPTags.com(http://jsptags.com/tags/)。
2.擴展JSP
標簽庫可以繼承JSP規范各方面的特性(例如JSP1.2)。這樣,你就可以無限制地擴展和增加JSP的功能,而無需要等待下一版本JSP的出現。例如,你對JSP的include調用不太滿意。你可以建立自己的include標簽,該標簽執行的是你自己的規范。
3.容易維護
標簽庫可令JSP的web應用非常易于維護,原因有:標簽應用簡單,也便于以后解釋所有你的邏輯都放到集中的標簽處理和JavaBeans中。這意味著你在升級代碼時,無需要對每個使用該代碼的頁面進行修改,你只需要修改集中的代碼文件便可
。如果你需要加入新的功能,你也無需修改所有現有的頁面,你可以在自己的標簽中加入更多的屬性,這些屬性可加入新的處理,而其它舊的屬性不變,這樣所有舊的頁面還可以正常工作 例如你有一個讓所有文本變藍的標簽
My Text
后來在項目中你想選擇藍色的深淺(shade),這樣你可以保留原有的標簽,只要加入一個新的屬性--shade。
My Text
所有舊的標簽仍然可以產生藍色的文本,不過現在你可以使用同樣的標簽產生不同深淺的藍色文本。
。標簽有利于代碼的重用。代碼經過長時間的使用測試,它的bug就更少。這樣,使用自定義標簽的JSP頁面將有著更少的bug,從而更容易維護。
4.快速的開發時間
標簽庫提供一個簡單的方式來重用代碼。在服務器端的語言中,其中一個標準的重用代碼方式是使用模板。相對于使用模板庫,標簽庫是一個更好的解決辦法。使用模板庫,你必須為每個項目修改模板或者且建立嚴格的界面,而標簽庫則沒有這些限制,并且擁有所有面向對象的好處,可以做到靈活和更有擴展性,而且,通過重用代碼,你可以花費更少的時間來做開發,更多的時間可以用在設計你的web應用上。標簽庫的接口也很簡單,非常容易做插入、使用和調試。
標簽的組件
雖然標簽庫非常易于使用,不過要建立一個內里的設計來支持標簽庫是頗復雜的,起碼要比建立一個簡單的JavaBean復雜。這個復雜是來自于標簽庫是由幾部分構成的。不過,你只需要知道Java和JSP的知識就夠了。
一個簡單的標簽由下面的元素構成:
1.JavaBeans:為了得到Java與生具來的面向對象的好處,可重用的代碼應該放到一個獨立的代碼容器中。這些JavaBeans并不是標簽庫的一部分。不過它是你的代碼庫用來執行相關任務的基本代碼塊。
2.標簽處理:這是標簽庫的真正核心。一個標簽處理器將引用它需要的任何資源(你的JavaBeans)和訪問你的JSP頁面的全部信息(pageContext對象)。JSP頁面也會將所有已經被設置的標簽屬性和JSP頁面上的標簽體中的內容傳送給標簽處理器。在標簽處理器處理完畢后,它將發回輸出到你的JSP頁面進行處理。
3.標簽庫的描述(tld文件):這是一個簡單的XML文件,它記錄著標簽處理器的屬性、信息和位置。JSP容器通過這個文件來得知從哪里及如何調用一個標簽庫。
4.網站的web.xml文件:這是你網站的初始化文件,在這個文件中,你定義了網站中用到的自定義標簽,以及哪個tld文件用來描述每個自定義的標簽。
5.分發文件(一個WAR或者JAR文件):如果你想重用自定義標簽的話,你需要一個方法來將它由一個項目轉移到另一個項目中。將標簽庫打包為一個JAR文件是一個簡單而且有效的方式。
6.在你的JSP文件中作標簽庫聲明:很簡單,如果要用到該標簽的話,只要在頁面聲明一下就可以,其后,你就可以在該JSP頁面的任何地方使用它。
看來要做的工作很多,不過其實并不是很難。它的要點并不在于編碼,而是在于如何將各部分正確地組織起來。不過,這樣的分層是很重要的,它可令標簽的使用靈活和更容易轉移。更重要的是,這些層的存在可讓處理建立標簽的工程通過一個JSP IDE(JSP的集成開發環境)自動完成。期望將來的JSP IDE可自動完成創建一個自定義標簽的大部分工作,這樣你只需要寫代碼和標簽處理就可以了。
(注意:一個標簽處理僅定義一個自定義標簽;一個標簽庫是幾個處理相同任務的標簽處理器的集合)
建立你的首個標簽
以下將一步一步地教你如何建立自定義的標簽,具體的例子是擴展JSP,令它擁有自己的HTML編碼功能。這個功能將所有的<和>字符用HTML代碼來代替。它可以很容易地擴展為做其它的編碼處理。為了簡化,這個例子只解釋了建立自定義標簽的基本要素。
創建一個JavaBean
你代碼中任何可重新使用的部分都應該放到一個JavaBean中。這個很重要,因為你要經常在項目的其它地方用到這些代碼。放在標簽處理器中的任何代碼在標簽外都是不可以重新使用的,因此將可重用的代碼部分獨立開來是很重要的。在這個例子總,為HTML編碼的邏輯是常用的,因此放到JavaBean中。
HTML編碼JavaBean
/* HTML_Format.java */
public class HTML_Format extends Object implements java.io.Serializable {
/** 創建新的HTML_Format */
public HTML_Format() {}
/** 將一個字符串中所有的所有 < 和 > 字符用響應的HTML編碼代替 */
public String HTML_Encode(String as_data)
{
int li_len = as_data.length();
/*string buffer的長度要比原來的字符串長*/
StringBuffer lsb_encode = new StringBuffer(li_len + (li_len/10));
/* 循環替換全部的< 和 > 字符 */
for( int li_count = 0 ; li_count < li_len ; li_count++)
{ String ls_next = String.valueOf(as_data.charAt(li_count));
if (ls_next.equals("<")) ls_next = "<";
if (ls_next.equals(">")) ls_next = ">";
lsb_encode.append( ls_next );
}
return( lsb_encode.toString() );
}
}
創建一個標簽處理器
標簽處理器使用以下的代碼:
HTML編碼標簽處理器
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HTML_FormatTag extends BodyTagSupport
{
/* 1) 在標簽末將會調用這個函數 */
public int doEndTag() throws JspTagException
{
try
{ /* 2)得到標簽中的文本 */
BodyContent l_tagbody = getBodyContent();
String ls_output = "";
/* 3)如果標簽體有文本,就處理它 */
if(l_tagbody != null)
{ HTML_Format l_format = new HTML_Format();
/* 3a) 將標簽體的內容轉換為一個字符串 */
String ls_html_text = l_tagbody.getString();
ls_output = l_format.HTML_Encode(ls_html_text);
}
/* 4)將結果寫回到數據流中 */
pageContext.getOut().write(ls_output.trim());
}
catch (IOException e)
{ throw new JspTagException("Tag Error:" + e.toString());
}
/* 讓JSP繼續處理以下頁面的內容 */
return EVAL_PAGE;
}
}
這個處理很簡單,它包括有:
1.讀入標簽開始和結束間的文本
2.調用html編碼函數
3.返回結果到JSP頁面。
創建一個標簽描述器
我們需要描述自定義標簽以讓系統知道如何處理。該描述文件的后綴為.tld,通常它的名字和標簽處理器相同,并存放在“/WEB-INF/”目錄。
HTML編碼標簽描述器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<TAGLIB>
<TLIBVERSION>1.0</TLIBVERSION>
<JSPVERSION>1.1</JSPVERSION>
<SHORTNAME>HTML_FormatTag</SHORTNAME>
<URI></URI>
<INFO>HTML Encoding Tag </INFO>
<TAG>
<NAME>HTMLEncode</NAME>
<TAGCLASS>HTML_FormatTag</TAGCLASS>
<INFO>Encode HTML</INFO>
</TAG>
</TAGLIB>
更新Web XML文件
現在可告訴JSP容器使用標簽庫。為此要修改web.xml文件,具體說來是要在其中加入一個taglib的項目來注冊該標簽庫。最重要的是,要為tag分配一個URI。URI是一個唯一的引用,只應用在該網站的這個特別的標簽上。使用全長的URL或者包名是一個好的習慣,它可以確保唯一性,因為該標簽可以在不同的網站使用。這個例子是簡化了。
修改web.xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<WEB-APP>
<TAGLIB>
<TAGLIB-URI>
HTMLEncode
</TAGLIB-URI>
<TAGLIB-LOCATION>
/WEB-INF/HTML_FormatTag.tld
</TAGLIB-LOCATION>
</TAGLIB>
</WEB-APP>
使用新的標簽
自定義的標簽已經設置好,可以用在一個JSP頁面上。要做到這一點,只需在該頁面使用taglib指示命令聲明一下該標簽就可以了,該標簽通過它唯一的URI被引用,并且會被分配一個名字空間前綴。前綴可以任意,只要它不與其它的名字空間沖突便可。
在一個JSP頁面上使用HTML編碼標簽
<%@ taglib uri="HTMLEncode" prefix="Examples" %>
<PRE>
<?XML:NAMESPACE PREFIX = Examples /><Examples:HTMLEncode>
< Hello , Simple sample >
</Examples:HTMLEncode>
</PRE>
范例代碼的輸出
< Hello , Simple sample >
which displays as:
< Hello , Simple sample >
通過這個標簽,我就將該頁面的所有代碼編碼了。有趣的是所有的自定義標簽都是在服務器上處理的。這意味著你將不會在輸出的頁面上看到自定義的標簽。
建立一個標簽不是很難吧。最困難的部分是要學習標簽處理的所有細節。這是一個很強大的功能,我們只是提到了最基本的地方。由于這個處理需要幾步,新的JSP編程者在創建標簽時將會感到迷惑。
結論
標簽庫是JSP最重要的特性之一,它還處在不斷的發展中。它的確是一個新事物,因此還沒有被廣泛采用,不過自定義標簽庫已經剝去了它的神秘面紗,越來越多的開發者也開始關注和使用它了。在2001年末,可預料標簽庫將是許多JSP項目中的一個很常見的特性。
在這篇文章中只簡要地討論了標簽庫的好處。標簽庫實際上還有許多其它強大的功能。標簽庫將會令JSP的開發者進入一個新的領域。JSP的開發者將會感到十分的興奮,因為他們得到了一個可將JSP轉到各個應用并且建立任何類型web應用的工具。標簽庫將令JSP成為web領域其中一個最強大的編程環境。它的功能只受我們的想象和創造力限制。
為什么?有兩個方面:維護和開發的速度。在一個單一的服務器頁面中,你可以混合使用各種不同的腳本方法和對象。就象“混凝土”一樣,這種混合可令服務器端的腳本變得強大,并且讓服務器端的編程者設計出非常靈活和動態的web頁面。不過這種自由的混合也有其缺點,那就是維護起來非常麻煩,特別是當項目逐漸變大時。由于最終的產品是經由一個傳統的web設計者來維護的,因此會帶來問題。更糟糕的是,隨著代碼的復雜性增加,開發的速度就會變慢,不利于開發中等和大型的web應用,一旦開發完,站點還要找合格的編程者來維護這些頗為復雜的代碼。
為此ASP可讓我們使用COM對象,而JSP則提供J2EE來解決這些問題。這些方法的共通之處都是經由建立集中的可重用代碼庫。不過它們都更難,需要更多的時間去學習它。對于中等的項目來說,通常都較少使用這樣的方法,但事實上,中等的web應用項目才是最多的。因此,許多項目都不得不使用一個不符合它們需要的開發和維護環境。
幸好,JSP提供了一個更好解決的辦法。標簽庫提供了一個簡單的方法來建立一個可重用的代碼塊。一旦標簽庫設計好,它就可以在許多項目中再次使用。更方便的是,與COM和J2EE不同,你無需學習任何其它的技巧就可以建立一個標簽庫!只要你懂得寫JSP,你就可以建立一個標簽庫。標簽庫還可以改善web應用的維護。這個是得益于JSP頁面自定義標簽的簡單XML接口。這樣,web設計者甚至可以做到無需知道任何JSP的知識,就可以建立JSP的web應用。這個開放式的web開發對于團隊運作是非常有效的。JSP編程者可以建立自定義的標簽和后臺的代碼模塊,而web設計者可以使用自定義的標簽來建立web應用,并且將精力集中在web設計上。
那么標簽庫究竟是什么?
JSP標簽庫(也稱自定義庫)可看成是一套產生基于XML腳本的方法,它經由JavaBeans來支持。在概念上說,標簽庫是非常簡單和可以重用的代碼構造。
執行XML/XSL轉換的標簽范例和HTML頁面
<%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%>
在這個例子中,通過使用簡單的標簽來訪問后臺更為強大的代碼,一個XML被裝載,并且通過一個XSL文件來產生一個結果,并發送給客戶端,全部通過使用一個簡單的標簽調用就做到了。
自定義標簽為在JSP項目中創建易于重用的代碼打開了一扇大門。你所需要的只是標簽庫和它的文檔說明。
標簽庫的重要特性
1.易于在多個項目安裝
標簽庫可以很方便地在項目間轉移。一旦標簽庫建立好,則只需要將所有的東西打包為一個JAR文件,你就可以在任何的JSP項目中重新使用。由于這個原因,標簽庫越來越通行,在網上,你要找標簽的最佳地點是JSPTags.com(http://jsptags.com/tags/)。
2.擴展JSP
標簽庫可以繼承JSP規范各方面的特性(例如JSP1.2)。這樣,你就可以無限制地擴展和增加JSP的功能,而無需要等待下一版本JSP的出現。例如,你對JSP的include調用不太滿意。你可以建立自己的include標簽,該標簽執行的是你自己的規范。
3.容易維護
標簽庫可令JSP的web應用非常易于維護,原因有:標簽應用簡單,也便于以后解釋所有你的邏輯都放到集中的標簽處理和JavaBeans中。這意味著你在升級代碼時,無需要對每個使用該代碼的頁面進行修改,你只需要修改集中的代碼文件便可
。如果你需要加入新的功能,你也無需修改所有現有的頁面,你可以在自己的標簽中加入更多的屬性,這些屬性可加入新的處理,而其它舊的屬性不變,這樣所有舊的頁面還可以正常工作 例如你有一個讓所有文本變藍的標簽
后來在項目中你想選擇藍色的深淺(shade),這樣你可以保留原有的標簽,只要加入一個新的屬性--shade。
所有舊的標簽仍然可以產生藍色的文本,不過現在你可以使用同樣的標簽產生不同深淺的藍色文本。
。標簽有利于代碼的重用。代碼經過長時間的使用測試,它的bug就更少。這樣,使用自定義標簽的JSP頁面將有著更少的bug,從而更容易維護。
4.快速的開發時間
標簽庫提供一個簡單的方式來重用代碼。在服務器端的語言中,其中一個標準的重用代碼方式是使用模板。相對于使用模板庫,標簽庫是一個更好的解決辦法。使用模板庫,你必須為每個項目修改模板或者且建立嚴格的界面,而標簽庫則沒有這些限制,并且擁有所有面向對象的好處,可以做到靈活和更有擴展性,而且,通過重用代碼,你可以花費更少的時間來做開發,更多的時間可以用在設計你的web應用上。標簽庫的接口也很簡單,非常容易做插入、使用和調試。
標簽的組件
雖然標簽庫非常易于使用,不過要建立一個內里的設計來支持標簽庫是頗復雜的,起碼要比建立一個簡單的JavaBean復雜。這個復雜是來自于標簽庫是由幾部分構成的。不過,你只需要知道Java和JSP的知識就夠了。
一個簡單的標簽由下面的元素構成:
1.JavaBeans:為了得到Java與生具來的面向對象的好處,可重用的代碼應該放到一個獨立的代碼容器中。這些JavaBeans并不是標簽庫的一部分。不過它是你的代碼庫用來執行相關任務的基本代碼塊。
2.標簽處理:這是標簽庫的真正核心。一個標簽處理器將引用它需要的任何資源(你的JavaBeans)和訪問你的JSP頁面的全部信息(pageContext對象)。JSP頁面也會將所有已經被設置的標簽屬性和JSP頁面上的標簽體中的內容傳送給標簽處理器。在標簽處理器處理完畢后,它將發回輸出到你的JSP頁面進行處理。
3.標簽庫的描述(tld文件):這是一個簡單的XML文件,它記錄著標簽處理器的屬性、信息和位置。JSP容器通過這個文件來得知從哪里及如何調用一個標簽庫。
4.網站的web.xml文件:這是你網站的初始化文件,在這個文件中,你定義了網站中用到的自定義標簽,以及哪個tld文件用來描述每個自定義的標簽。
5.分發文件(一個WAR或者JAR文件):如果你想重用自定義標簽的話,你需要一個方法來將它由一個項目轉移到另一個項目中。將標簽庫打包為一個JAR文件是一個簡單而且有效的方式。
6.在你的JSP文件中作標簽庫聲明:很簡單,如果要用到該標簽的話,只要在頁面聲明一下就可以,其后,你就可以在該JSP頁面的任何地方使用它。
看來要做的工作很多,不過其實并不是很難。它的要點并不在于編碼,而是在于如何將各部分正確地組織起來。不過,這樣的分層是很重要的,它可令標簽的使用靈活和更容易轉移。更重要的是,這些層的存在可讓處理建立標簽的工程通過一個JSP IDE(JSP的集成開發環境)自動完成。期望將來的JSP IDE可自動完成創建一個自定義標簽的大部分工作,這樣你只需要寫代碼和標簽處理就可以了。
(注意:一個標簽處理僅定義一個自定義標簽;一個標簽庫是幾個處理相同任務的標簽處理器的集合)
建立你的首個標簽
以下將一步一步地教你如何建立自定義的標簽,具體的例子是擴展JSP,令它擁有自己的HTML編碼功能。這個功能將所有的<和>字符用HTML代碼來代替。它可以很容易地擴展為做其它的編碼處理。為了簡化,這個例子只解釋了建立自定義標簽的基本要素。
創建一個JavaBean
你代碼中任何可重新使用的部分都應該放到一個JavaBean中。這個很重要,因為你要經常在項目的其它地方用到這些代碼。放在標簽處理器中的任何代碼在標簽外都是不可以重新使用的,因此將可重用的代碼部分獨立開來是很重要的。在這個例子總,為HTML編碼的邏輯是常用的,因此放到JavaBean中。
HTML編碼JavaBean
/* HTML_Format.java */
public class HTML_Format extends Object implements java.io.Serializable {
/** 創建新的HTML_Format */
public HTML_Format() {}
/** 將一個字符串中所有的所有 < 和 > 字符用響應的HTML編碼代替 */
public String HTML_Encode(String as_data)
{
int li_len = as_data.length();
/*string buffer的長度要比原來的字符串長*/
StringBuffer lsb_encode = new StringBuffer(li_len + (li_len/10));
/* 循環替換全部的< 和 > 字符 */
for( int li_count = 0 ; li_count < li_len ; li_count++)
{ String ls_next = String.valueOf(as_data.charAt(li_count));
if (ls_next.equals("<")) ls_next = "<";
if (ls_next.equals(">")) ls_next = ">";
lsb_encode.append( ls_next );
}
return( lsb_encode.toString() );
}
}
創建一個標簽處理器
標簽處理器使用以下的代碼:
HTML編碼標簽處理器
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HTML_FormatTag extends BodyTagSupport
{
/* 1) 在標簽末將會調用這個函數 */
public int doEndTag() throws JspTagException
{
try
{ /* 2)得到標簽中的文本 */
BodyContent l_tagbody = getBodyContent();
String ls_output = "";
/* 3)如果標簽體有文本,就處理它 */
if(l_tagbody != null)
{ HTML_Format l_format = new HTML_Format();
/* 3a) 將標簽體的內容轉換為一個字符串 */
String ls_html_text = l_tagbody.getString();
ls_output = l_format.HTML_Encode(ls_html_text);
}
/* 4)將結果寫回到數據流中 */
pageContext.getOut().write(ls_output.trim());
}
catch (IOException e)
{ throw new JspTagException("Tag Error:" + e.toString());
}
/* 讓JSP繼續處理以下頁面的內容 */
return EVAL_PAGE;
}
}
這個處理很簡單,它包括有:
1.讀入標簽開始和結束間的文本
2.調用html編碼函數
3.返回結果到JSP頁面。
創建一個標簽描述器
我們需要描述自定義標簽以讓系統知道如何處理。該描述文件的后綴為.tld,通常它的名字和標簽處理器相同,并存放在“/WEB-INF/”目錄。
HTML編碼標簽描述器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<TAGLIB>
<TLIBVERSION>1.0</TLIBVERSION>
<JSPVERSION>1.1</JSPVERSION>
<SHORTNAME>HTML_FormatTag</SHORTNAME>
<URI></URI>
<INFO>HTML Encoding Tag </INFO>
<TAG>
<NAME>HTMLEncode</NAME>
<TAGCLASS>HTML_FormatTag</TAGCLASS>
<INFO>Encode HTML</INFO>
</TAG>
</TAGLIB>
更新Web XML文件
現在可告訴JSP容器使用標簽庫。為此要修改web.xml文件,具體說來是要在其中加入一個taglib的項目來注冊該標簽庫。最重要的是,要為tag分配一個URI。URI是一個唯一的引用,只應用在該網站的這個特別的標簽上。使用全長的URL或者包名是一個好的習慣,它可以確保唯一性,因為該標簽可以在不同的網站使用。這個例子是簡化了。
修改web.xml文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<WEB-APP>
<TAGLIB>
<TAGLIB-URI>
HTMLEncode
</TAGLIB-URI>
<TAGLIB-LOCATION>
/WEB-INF/HTML_FormatTag.tld
</TAGLIB-LOCATION>
</TAGLIB>
</WEB-APP>
使用新的標簽
自定義的標簽已經設置好,可以用在一個JSP頁面上。要做到這一點,只需在該頁面使用taglib指示命令聲明一下該標簽就可以了,該標簽通過它唯一的URI被引用,并且會被分配一個名字空間前綴。前綴可以任意,只要它不與其它的名字空間沖突便可。
在一個JSP頁面上使用HTML編碼標簽
<%@ taglib uri="HTMLEncode" prefix="Examples" %>
<PRE>
<?XML:NAMESPACE PREFIX = Examples /><Examples:HTMLEncode>
< Hello , Simple sample >
</Examples:HTMLEncode>
</PRE>
范例代碼的輸出
< Hello , Simple sample >
which displays as:
< Hello , Simple sample >
通過這個標簽,我就將該頁面的所有代碼編碼了。有趣的是所有的自定義標簽都是在服務器上處理的。這意味著你將不會在輸出的頁面上看到自定義的標簽。
建立一個標簽不是很難吧。最困難的部分是要學習標簽處理的所有細節。這是一個很強大的功能,我們只是提到了最基本的地方。由于這個處理需要幾步,新的JSP編程者在創建標簽時將會感到迷惑。
結論
標簽庫是JSP最重要的特性之一,它還處在不斷的發展中。它的確是一個新事物,因此還沒有被廣泛采用,不過自定義標簽庫已經剝去了它的神秘面紗,越來越多的開發者也開始關注和使用它了。在2001年末,可預料標簽庫將是許多JSP項目中的一個很常見的特性。
在這篇文章中只簡要地討論了標簽庫的好處。標簽庫實際上還有許多其它強大的功能。標簽庫將會令JSP的開發者進入一個新的領域。JSP的開發者將會感到十分的興奮,因為他們得到了一個可將JSP轉到各個應用并且建立任何類型web應用的工具。標簽庫將令JSP成為web領域其中一個最強大的編程環境。它的功能只受我們的想象和創造力限制。