清單A:執行XML/XSL 轉換的示例標籤及其所在的HTML頁面html
<%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%>java
c:/xml/example.xml程序員
c:/xml/example.xslweb
以上的示例使用了簡單的標籤來訪問處在幕後的更強大代碼,標籤部分的語句首先裝載了一個XML文件,而後應用了一個XSL文件來將XML文件中的內容轉換成某個表現格式,併發送給客戶端,這一切僅僅只是用了一個很簡單的標籤。定製標籤使得JSP項目中很容易建立重用的開放源代碼模塊,而你所須要的只是標籤庫和它的文檔說明。服務器
能夠說標籤庫是很重要的,接下來講一說標籤庫的重要特性。併發
1.易於安裝在多個項目上app
標籤很容易從一個JSP項目遷移到其餘項目。一旦創建了一個標籤庫,則只須要將全部的東西打包爲一個JAR文件,你就能夠在任何的JSP項目中從新使用。由於標籤能夠從新使用,標籤庫能夠輕鬆地用於你本身的項目,因此標籤庫愈來愈通行。目前,最好的標籤資源能夠在JSPTags.com這個站點找到。jsp
2.擴展JSPide
標籤庫能夠具有JSP規範(JSP 1.2)中的任何特性和功能,你能夠無限制地擴展和增長JSP的功能,而無須要等待下一版本JSP的出現。例如,你對JSP的include調用不太滿意。你能夠創建本身的include標籤,該標籤執行的是你本身的規範。函數
3.容易維護
標籤庫使得JSP的web應用程序很是易於維護,緣由有:
(1)標籤應用簡單,對任何人而言都很容易使用、易於理解。
(2)全部的程序邏輯代碼都集中放在的標籤處理器和JavaBeans中。這意味着你在升級代碼時,無須要對每一個使用該代碼的頁面進行修改,你只須要修改集中的代碼文件即可。
(3)若是須要加入新的功能,你也無需修改任何已經存在的頁面,能夠在標籤中加入額外的屬性,從而引進新的行爲,而其它舊的屬性不變,這樣全部舊的頁面還能夠正常工做。 例如你有一個讓全部文本變藍的標籤:
My Text
但在後來項目中,你又想讓藍色變暗。你能夠保留原有的標籤,只要爲其增長一個新的屬性:shade ,以下所示:
My Text
全部舊的標籤仍然能夠產生藍色的文本,但如今你可使用同一標籤來產生變暗的藍色文本了。
(4)標籤提高了代碼的重用性。那些通過屢次測試和使用的代碼確定具備更少的bug。因此,使用定製標籤的JSP頁面也一樣具備更少的缺陷,維護起來天然方便多了。
4.快速的開發時間
標籤庫提供一個簡單的方式來重用代碼。在服務器端的語言中,其中一個標準的重用代碼方式是使用模板。相對於使用模板庫,標籤庫是一個更好的解決辦法。使用模板庫,你必須爲每一個項目修改模板或者且創建嚴格的界面,而標籤庫則沒有這些限制,而且擁有全部面向對象的好處,能夠作到靈活和更有擴展性,並且,經過重用代碼,你能夠花費更少的時間來作開發,更多的時間能夠用在設計你的web應用上。標籤庫的接口也很簡單,很是容易作插入、使用和調試。
雖然標籤庫很是易於使用,不過要創建一個標籤庫的內部實現機制仍是頗覆雜的,起碼要比創建一個簡單的JavaBean複雜。這個複雜是來自於標籤庫是由幾部分構成的。不過,你只須要掌握了Java和JSP的知識就夠了。 一個簡單的標籤由下面的元素構成:
1.JavaBean:爲了獲得Java與生具來的面向對象的好處,可重用的代碼應該放到一個獨立的代碼容器中,也就是JavaBean。這些JavaBeans並非標籤庫必不可少的一部分,但它們是標籤庫用來執行所分配任務的基礎代碼模塊。
2.標籤處理器:標籤處理器是標籤庫的真正核心。一個標籤處理器(tag handler)引用它所須要的任何外部資源(JavaBean)而且負責訪問JSP頁面的信息(PageContext對象)。而JSP頁面則把頁面上設置的標籤屬性和標籤體中的內容都傳遞給標籤處理器,當標籤處理器完成其處理過程後,它就會把處理後的輸出結果回送給JSP頁面作進一步處理。
3.標籤庫描述符(TLD文件):這是一個簡單的XML文件,它記錄着標籤處理器的屬性、信息和位置等信息。JSP容器經過這個文件來得知從哪裏及如何調用一個標籤庫。
4.Web站點的web.xml文件:這是Web站點的初始化文件,在這個文件中,須要定義了Web站點中用到的自定義標籤,以及用來描述每一個自定義標籤的tld文件。
5.發佈文件(WAR或JAR文件):若是你想重用自定義標籤的話,你須要一個方法來將它由一個項目遷移到其餘項目中去。將標籤庫打包爲一個JAR文件是一個簡單並且有效的方式。
6.JSP頁面上的標籤庫聲明:要在JSP頁面中的使用某個自定義標籤的話,須要使用標籤庫標示符在頁面上進行聲明。
看來要作的工做不少,剛開始用的時候固然會有點棘手,不過其實並非很難。它的要點並不在於編碼,而是在於如何將各部分正確地組織起來。這種層次性的結構是很重要的,它令標籤的使用靈活和更容易轉移。更重要的事,這些層次可讓整個創建標籤庫的過程都能經過JSP IDE(JSP的集成開發環境)自動完成。JSP IDE更能夠自動完成建立定製標籤的大部分工做,而你本身則只須要負責創建代碼和標籤處理器。
(注意:一個標籤處理器僅定義一個自定義標籤;一個標籤庫是幾個處理相同任務的標籤處理器的集合)
如何創建你的第一個標籤?
如下將一步一步地教你如何創建自定義的標籤,具體的例子是擴展JSP,令它擁有本身的HTML編碼功能。這個功能將全部的<和>字符用 HTML代碼來代替。它能夠很容易地擴展爲作其它的編碼處理。爲了簡化,這個例子只解釋了創建自定義標籤的基本要素。
建立JavaBean
代碼中的任何可重用部分都應該放到一個JavaBean中。這一點是很重要的。這樣你就能夠在其餘項目中重用這些代碼了。因爲任何放置在標籤處理器內的代碼在標籤外都是不能夠重用的,所以將可重用的代碼部分獨立開來是很重要的。在這個例子中,爲HTML編碼的邏輯是經常使用的,所以放到JavaBean中,請參看清單B.
清單B:HTML編碼JavaBean
/* HTML_Format.java */
package ex;
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() );
}
}
建立標籤處理器
標籤處理器的代碼請參看清單C:
清單C:HTML編碼標籤處理器
package ex;
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,TLD文件一般就以標籤處理器命名,並存放在「/WEB-INF/」目錄之下。請參看清單D。
清單D:HTML編碼標籤描述器
<?XML:NAMESPACE PREFIX = [default] http://java.sun.com/xml/ns/j2ee NS = "http://java.sun.com/xml/ns/j2ee" /><taglib xmlns="http://java.sun.com/xml/ns/j2ee" span="" <="" 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">
1.0
1.1
HTML_FormatTag
empty
HTMLEncode
ex.HTML_FormatTag
更新Web XML文件
如今能夠告訴JSP容器如何使用標籤庫了。爲此要修改web.xml文件,具體說來是要在其中加入一個taglib的項目來註冊該標籤庫,併爲標籤分配一個URI。URI是Web站點上惟一應用於這一特定標籤的索引。因爲標籤從此還可能用在不一樣的Web站點上,因此你最好採用完整的URL和/或者包名字(package name)來保證這一惟一性。這個例子是簡化了,示例代碼請參看清單E。
清單E:修改web.xml文件
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" span="" <="" 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-app_2_4.xsd"
version="2.4">
Welcome to Tomcat
Welcome to Tomcat
HTMLEncode
/WEB-INF/HTML_FormatTag.tld
使用新的標籤
自定義的標籤設置好後,就能夠用在你的JSP頁面上了。要作到這一點,只須要在頁面上使用taglib指示命令聲明所要採用的標籤便可。標籤經過其惟一的 URI被索引,而後被分配給一個名字空間前綴(prefix)。這一前綴並無什麼特別的意義,只要它不與其它的名字空間衝突即可,能夠任意。請參看如下的清單F和G。
清單F:在一個JSP頁面上使用HTML編碼標籤
<%@ taglib uri="HTMLEncode" prefix="Examples"%>
清單G:範例代碼的輸出
網頁源代碼是:
<Hello,Simple sample>
經過這個標籤,我就將該頁面的全部<與>編碼了。全部的自定義標籤都是在服務器上處理的。這意味着你將不會在輸出的頁面上看到自定義的標籤。
正如你所看到的那樣,創建標籤並不是難事。最麻煩的是學習標籤處理器的整個細節。這是一個很強大的功能,咱們不過是觸及了皮毛。因爲這一過程須要採起的步驟不少,因此剛入門的JSP程序員可能在創建標籤的時候會以爲很困惑。
結論
標籤庫是JSP最重要的特性之一,它還處在不斷的發展中。自定義標籤庫已經剝去了它的神祕面紗,愈來愈多的開發者也開始關注和使用它了。