?? jsp與xml的結(jié)合.txt
字號(hào):
JSP與XML的結(jié)合
上傳時(shí)間:2008-2-23 0:30:00 點(diǎn)擊:222次
綜述:可擴(kuò)展標(biāo)注語(yǔ)言(eXtensible Markup Language,XML)正被迅速的運(yùn)用于業(yè)界,它已作為與平臺(tái)、語(yǔ)言和協(xié)議無(wú)關(guān)的格式描述和交換數(shù)據(jù)的廣泛應(yīng)用標(biāo)準(zhǔn)。XML和它的輔助規(guī)范可用于描述數(shù)據(jù)的文檔表現(xiàn),描述XML文檔類型的限制,描述XML文檔和資源之間的鏈接,描述XML文檔的自動(dòng)轉(zhuǎn)換和格式化。
如何開(kāi)發(fā)自定義標(biāo)簽庫(kù)?
我使用JSP和ASP編程已經(jīng)有一段頗長(zhǎng)的時(shí)間了,在兩種服務(wù)器端的編程方式中,我越來(lái)越覺(jué)得JSP的功能要強(qiáng)大得多。不提別的,其中JSP的標(biāo)簽庫(kù)就是我選擇JSP作為首選服務(wù)器端Web應(yīng)用開(kāi)發(fā)工具的原因。為什么?因?yàn)椋壕S護(hù)和開(kāi)發(fā)的速度。在一個(gè)單一的服務(wù)器頁(yè)面中,你可以混合使用各種不同的腳本方法和對(duì)象。就?quot;混凝土"一樣,這種混合可令服務(wù)器端的腳本變得強(qiáng)大,并且讓服務(wù)器端的編程者設(shè)計(jì)出非常靈活和動(dòng)態(tài)的Web頁(yè)面。不過(guò)這種自由的混合也有其缺點(diǎn),那就是維護(hù)起來(lái)非常麻煩,特別是當(dāng)項(xiàng)目逐漸變大時(shí)。由于最終的產(chǎn)品是經(jīng)由一個(gè)傳統(tǒng)的Web設(shè)計(jì)者來(lái)維護(hù)的,因此會(huì)帶來(lái)問(wèn)題。更糟糕的是,隨著代碼的復(fù)雜性增加,開(kāi)發(fā)的速度就會(huì)變慢,不利于開(kāi)發(fā)中等和大型的Web應(yīng)用,一旦開(kāi)發(fā)完,站點(diǎn)還要找合格的編程者來(lái)維護(hù)這些頗為復(fù)雜的代碼。
幸好,JSP提供了一個(gè)很好解決的辦法。標(biāo)簽庫(kù)提供了一個(gè)簡(jiǎn)單的方法來(lái)建立一個(gè)可重用的代碼塊。一旦標(biāo)簽庫(kù)設(shè)計(jì)好,它就可以在許多項(xiàng)目中再次使用。更方便的是,與COM和J2EE不同,你無(wú)需學(xué)習(xí)任何其它的技巧就可以建立一個(gè)標(biāo)簽庫(kù)!只要你懂得寫JSP,你就可以建立一個(gè)標(biāo)簽庫(kù)。標(biāo)簽庫(kù)還可以改善Web應(yīng)用的維護(hù)。這個(gè)是得益于JSP頁(yè)面自定義標(biāo)簽的簡(jiǎn)單XML接口。這樣,Web設(shè)計(jì)者甚至可以做到無(wú)需知道任何JSP的知識(shí),就可以建立JSP的Web應(yīng)用。這個(gè)開(kāi)放式的Web開(kāi)發(fā)對(duì)于團(tuán)隊(duì)運(yùn)作是非常有效的。JSP編程者可以建立自定義的標(biāo)簽和后臺(tái)的代碼模塊,而Web設(shè)計(jì)者可以使用自定義的標(biāo)簽來(lái)建立Web應(yīng)用,并且將精力集中在Web設(shè)計(jì)上。
1. 標(biāo)簽庫(kù)的定義
JSP標(biāo)簽庫(kù)(也稱自定義庫(kù))可看成是一套產(chǎn)生基于XML腳本的方法,它經(jīng)由JavaBeans來(lái)支持。在概念上說(shuō),標(biāo)簽庫(kù)是非常簡(jiǎn)單和可以重用的代碼構(gòu)造。
執(zhí)行XML/XSL轉(zhuǎn)換的標(biāo)簽范例和HTML頁(yè)面
<%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%>
c:/xml/example.xml
c:/xml/example.xsl
在這個(gè)例子中,通過(guò)使用簡(jiǎn)單的標(biāo)簽來(lái)訪問(wèn)后臺(tái)更為強(qiáng)大的代碼,一個(gè)XML被裝載,并且通過(guò)一個(gè)XSL文件來(lái)產(chǎn)生一個(gè)結(jié)果,并發(fā)送給客戶端,全部通過(guò)使用一個(gè)簡(jiǎn)單的標(biāo)簽調(diào)用就做到了。
自定義標(biāo)簽為在JSP項(xiàng)目中創(chuàng)建易于重用的代碼打開(kāi)了一扇大門。你所需要的只是標(biāo)簽庫(kù)和它的文檔說(shuō)明。
2. 標(biāo)簽的組件
雖然標(biāo)簽庫(kù)非常易于使用,不過(guò)要建立一個(gè)內(nèi)里的設(shè)計(jì)來(lái)支持標(biāo)簽庫(kù)是頗復(fù)雜的,起碼要比建立一個(gè)簡(jiǎn)單的JavaBean復(fù)雜。這個(gè)復(fù)雜是來(lái)自于標(biāo)簽庫(kù)是由幾部分構(gòu)成的。不過(guò),你只需要知道Java和JSP的知識(shí)就夠了。
一個(gè)簡(jiǎn)單的標(biāo)簽由下面的元素構(gòu)成:
⑴ JavaBeans:為了得到Java與生具來(lái)的面向?qū)ο蟮暮锰?,可重用的代碼應(yīng)該放到一個(gè)獨(dú)立的代碼容器中。這些JavaBeans并不是標(biāo)簽庫(kù)的一部分。不過(guò)它是你的代碼庫(kù)用來(lái)執(zhí)行相關(guān)任務(wù)的基本代碼塊。
?、?標(biāo)簽處理:這是標(biāo)簽庫(kù)的真正核心。一個(gè)標(biāo)簽處理器將引用它需要的任何資源(你的JavaBeans)和訪問(wèn)你的JSP頁(yè)面的全部信息(pageContext對(duì)象)。JSP頁(yè)面也會(huì)將所有已經(jīng)被設(shè)置的標(biāo)簽屬性和JSP頁(yè)面上的標(biāo)簽體中的內(nèi)容傳送給標(biāo)簽處理器。在標(biāo)簽處理器處理完畢后,它將發(fā)回輸出到你的JSP頁(yè)面進(jìn)行處理。
⑶ 標(biāo)簽庫(kù)的描述(tld文件):這是一個(gè)簡(jiǎn)單的XML文件,它記錄著標(biāo)簽處理器的屬性、信息和位置。JSP容器通過(guò)這個(gè)文件來(lái)得知從哪里及如何調(diào)用一個(gè)標(biāo)簽庫(kù)。
?、?網(wǎng)站的web.xml文件:這是你網(wǎng)站的初始化文件,在這個(gè)文件中,你定義了網(wǎng)站中用到的自定義標(biāo)簽,以及哪個(gè)tld文件用來(lái)描述每個(gè)自定義的標(biāo)簽。
?、?分發(fā)文件(一個(gè)WAR或者JAR文件):如果你想重用自定義標(biāo)簽的話,你需要一個(gè)方法來(lái)將它由一個(gè)項(xiàng)目轉(zhuǎn)移到另一個(gè)項(xiàng)目中。將標(biāo)簽庫(kù)打包為一個(gè)JAR文件是一個(gè)簡(jiǎn)單而且有效的方式。
?、?在你的JSP文件中作標(biāo)簽庫(kù)聲明:很簡(jiǎn)單,如果要用到該標(biāo)簽的話,只要在頁(yè)面聲明一下就可以,其后,你就可以在該JSP頁(yè)面的任何地方使用它。
看來(lái)要做的工作很多,不過(guò)其實(shí)并不是很難。它的要點(diǎn)并不在于編碼,而是在于如何將各部分正確地組織起來(lái)。不過(guò),這樣的分層是很重要的,它可令標(biāo)簽的使用靈活和更容易轉(zhuǎn)移。更重要的是,這些層的存在可讓處理建立標(biāo)簽的工程通過(guò)一個(gè)JSP IDE(JSP的集成開(kāi)發(fā)環(huán)境)自動(dòng)完成。期望將來(lái)的JSP IDE可自動(dòng)完成創(chuàng)建一個(gè)自定義標(biāo)簽的大部分工作,這樣你只需要寫代碼和標(biāo)簽處理就可以了。
注意:一個(gè)標(biāo)簽處理僅定義一個(gè)自定義標(biāo)簽;一個(gè)標(biāo)簽庫(kù)是幾個(gè)處理相同任務(wù)的標(biāo)簽處理器的集合。
3. 建立自己的標(biāo)簽
以下將一步一步地教你如何建立自定義的標(biāo)簽,具體的例子是擴(kuò)展JSP,令它擁有自己的HTML編碼功能。這個(gè)功能將所有的<和>字符用HTML代碼來(lái)代替。它可以很容易地?cái)U(kuò)展為做其它的編碼處理。為了簡(jiǎn)化,這個(gè)例子只解釋了建立自定義標(biāo)簽的基本要素。
?、?創(chuàng)建一個(gè)JavaBean
你代碼中任何可重新使用的部分都應(yīng)該放到一個(gè)JavaBean中。這個(gè)很重要,因?yàn)槟阋?jīng)常在項(xiàng)目的其它地方用到這些代碼。放在標(biāo)簽處理器中的任何代碼在標(biāo)簽外都是不可以重新使用的,因此將可重用的代碼部分獨(dú)立開(kāi)來(lái)是很重要的。在這個(gè)例子總,為HTML編碼的邏輯是常用的,因此放到JavaBean中。
⑵ HTML編碼JavaBean
/* HTML_Format.Java */
public class HTML_Format extends Object implements Java.io.Serializable {
/** 創(chuàng)建新的HTML_Format */
public HTML_Format() {}
/** 將一個(gè)字符串中所有的所有 < 和 > 字符用響應(yīng)的HTML編碼代替 */
public String HTML_Encode(String as_data)
{
int li_len = as_data.length();
/*string buffer的長(zhǎng)度要比原來(lái)的字符串長(zhǎng)*/
StringBuffer lsb_encode = new StringBuffer(li_len + (li_len/10));
/* 循環(huán)替換全部的< 和 > 字符 */
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() );
}
}
⑶ 創(chuàng)建一個(gè)標(biāo)簽處理器
標(biāo)簽處理器使用以下的代碼:
HTML編碼標(biāo)簽處理器
import Java.io.IOException;
import Javax.servlet.jsp.*;
import Javax.servlet.jsp.tagext.*;
public class HTML_FormatTag extends BodyTagSupport
{
/* 1} 在標(biāo)簽?zāi)?huì)調(diào)用這個(gè)函數(shù) */
public int doEndTag() throws JspTagException
{
try
{ /* 2}得到標(biāo)簽中的文本 */
BodyContent l_tagbody = getBodyContent();
String ls_output = "";
/* 3}如果標(biāo)簽體有文本,就處理它 */
if(l_tagbody != null)
{ HTML_Format l_format = new HTML_Format();
/* 3a} 將標(biāo)簽體的內(nèi)容轉(zhuǎn)換為一個(gè)字符串 */
String ls_html_text = l_tagbody.getString();
ls_output = l_format.HTML_Encode(ls_html_text);
}
/* 4}將結(jié)果寫回到數(shù)據(jù)流中 */
pageContext.getOut().write(ls_output.trim());
}
catch (IOException e)
{ throw new JspTagException("Tag Error:" + e.toString());
}
/* 讓JSP繼續(xù)處理以下頁(yè)面的內(nèi)容 */
return EVAL_PAGE;
}
}
這個(gè)處理很簡(jiǎn)單,它包括有:
o 讀入標(biāo)簽開(kāi)始和結(jié)束間的文本
o 調(diào)用html編碼函數(shù)
o 返回結(jié)果到JSP頁(yè)面。
?、?創(chuàng)建一個(gè)標(biāo)簽描述器
需要描述自定義標(biāo)簽以讓系統(tǒng)知道如何處理。該描述文件的后綴為.tld,通常它的名字和標(biāo)簽處理器相同,并存放在"/WEB-INF/"目錄。
HTML編碼標(biāo)簽描述器
<?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>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -