主頁(yè) > 知識(shí)庫(kù) > XML和JSP的聯(lián)手

XML和JSP的聯(lián)手

熱門標(biāo)簽:400電話辦理包年 r語(yǔ)言數(shù)據(jù)可視化地圖標(biāo)注 東營(yíng)電銷 隨州外呼調(diào)研系統(tǒng) 如何修改多個(gè)百度地圖標(biāo)注 南寧網(wǎng)絡(luò)外呼系統(tǒng)運(yùn)營(yíng)商 微信地圖標(biāo)注合并了 本地電話機(jī)器人 高德地圖地圖標(biāo)注服務(wù)中心

概覽: 
xml和jsp是這些日子中最熱的東西。本文介紹如何聯(lián)合這兩種技術(shù)來建設(shè)動(dòng)態(tài)網(wǎng)站。你還可以同時(shí)看一下dom,xpath,xsl,和其它java-xml技術(shù)的示例代碼。 
我們?cè)诖思僭O(shè)你已經(jīng)了解javaserver pages(jsp)和extensible markup language (xml)。但也許你對(duì)該如何綜合使用它們?nèi)匀挥行┟曰蟆?nbsp;
jsp的應(yīng)用很容易,你可以用它設(shè)計(jì)網(wǎng)頁(yè),使之看起來似乎和html一樣。唯一的不同是jsp是動(dòng)態(tài)執(zhí)行的。例如,它們可以處理表單form和讀寫數(shù)據(jù)庫(kù)。 
xml的應(yīng)用的說明則比較困難。似乎所有的產(chǎn)品都支持它,每個(gè)人也好象都以各種不同目的在使用它。 
在本文中,你可以看到如何使用一種相當(dāng)先進(jìn)的方式用xml來設(shè)計(jì)一個(gè)系統(tǒng)。許多站點(diǎn)有巨量數(shù)據(jù)收集并以一種很標(biāo)準(zhǔn)或很不標(biāo)準(zhǔn)的方式來顯示它們。我將設(shè)計(jì)一個(gè)系統(tǒng),它使用xml文件在web服務(wù)器上進(jìn)行存儲(chǔ),并用jsp來顯示數(shù)據(jù)。 
xml vs 關(guān)系型數(shù)據(jù)庫(kù)
"等一下!"你可能問,"你用xml文件存儲(chǔ)數(shù)據(jù)嗎?為什么不使用數(shù)據(jù)庫(kù)?" 
這個(gè)問題問的很好。我的回答是,對(duì)很多目的用途來說,用數(shù)據(jù)庫(kù)太過浪費(fèi)了。.要使用一個(gè)數(shù)據(jù)庫(kù),你必須安裝和支持一個(gè)分離的服務(wù)器處理進(jìn)程(a separate server process),它常要求有安裝和支持它的administrator。你必須學(xué)習(xí)sql, 并用sql寫查詢,然后轉(zhuǎn)換數(shù)據(jù),再返回。而如果你用xml文件存儲(chǔ)數(shù)據(jù),將可減少額外的服務(wù)器的負(fù)荷。還有,你還找到了一個(gè)編輯數(shù)據(jù)的簡(jiǎn)單方法。你只要使用文本編輯器,而不必使用復(fù)雜的數(shù)據(jù)庫(kù)工具。xml文件很容易備份,和朋友共享,或下載到你的客戶端。同樣的,你可以方便地通過ftp上載新的數(shù)據(jù)到你的站點(diǎn)。 
xml還有一個(gè)更抽象的優(yōu)點(diǎn),即作為層次型的格式比關(guān)系型的更好。 它可以用一種很直接的方式來設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)來符合你的需要。你不需要使用一個(gè)實(shí)體-關(guān)系編輯器,也不需要使你的圖表(schema)標(biāo)準(zhǔn)化。 如果你有一個(gè)元素(element)包含了另一個(gè)元素,你可以直接在格式中表示它,而不需要使用表的關(guān)聯(lián)。 
注意,在很多應(yīng)用中,依靠文件系統(tǒng)是不夠充分的。如果更新很多,文件系統(tǒng)會(huì)因?yàn)橥瑫r(shí)寫入而受到破壞。數(shù)據(jù)庫(kù)則通常支持事務(wù)處理,可以應(yīng)付所發(fā)生的請(qǐng)求而不至于損壞。對(duì)于復(fù)雜的查詢統(tǒng)計(jì)要有反復(fù)、及時(shí)的更新,此時(shí)數(shù)據(jù)庫(kù)表現(xiàn)都很優(yōu)秀。當(dāng)然,關(guān)系型數(shù)據(jù)庫(kù)還有很多優(yōu)點(diǎn),包括豐富的查詢語(yǔ)言,圖表化工具,可伸縮性,存取控制等等。 
(注意:你可以使用簡(jiǎn)單的文件鎖定來提供一個(gè)事務(wù)處理服務(wù)器,你還可以在java中執(zhí)行一種 xml index-and-search工具,不過這已經(jīng)是另外一篇文章的主題了。) 
在下面這樣的案例中,正如大多數(shù)中小規(guī)模的、基于發(fā)布信息的站點(diǎn)一樣,你可能涉及的大多數(shù)數(shù)據(jù)存取都是讀,而不是寫,數(shù)據(jù)雖然可能很大,但相對(duì)來說并沒有經(jīng)常的更新變化,你也不需要做很復(fù)雜的查詢,即使你需要做,也將用一個(gè)獨(dú)立的查詢工具,那么成熟的rdbms的優(yōu)點(diǎn)消失了,而面向?qū)ο笮偷臄?shù)據(jù)模型的優(yōu)點(diǎn)則可以得到體現(xiàn)。 
最后,為你的數(shù)據(jù)庫(kù)提供一個(gè)查詢器外殼來進(jìn)行sql查詢并將他們轉(zhuǎn)化進(jìn)入xml stream也是完全有可能的。 
所以你可以選擇這二種方式之一。xml正變成一種非常健壯的,便于編程的工具,作為某個(gè)成熟的數(shù)據(jù)庫(kù)的前端工具來進(jìn)行存儲(chǔ)和查詢。(oracle的xsql servlet即是這種技術(shù)的一個(gè)很好的例子。) 
應(yīng)用篇:一個(gè)在線相冊(cè) 
所有人都喜歡照相!他們喜歡展示自己的,親人的,朋友的,度假時(shí)的照片,而 web 是他們展示的好地方。-- 即使千里之外的親戚都可以看到。我將著重于定義一個(gè)單獨(dú)的picture對(duì)象。(這一應(yīng)用的源代碼在resources中可以取得) 。該對(duì)象描述了表示一張照片所需要的字段:title,date,一個(gè)可選的標(biāo)題,以及對(duì)圖片來源的一個(gè)指向。 
一個(gè)圖象,需要它自己的一些字段:源文件( gif/jpeg)的定位,寬度和高度像素(以協(xié)助建立img> 標(biāo)記。 這里可以看到一個(gè)很簡(jiǎn)單的優(yōu)點(diǎn),即使用文件系統(tǒng)來代替數(shù)據(jù)庫(kù)的時(shí)候,你可以將圖形文件存放在與數(shù)據(jù)文件相同的目錄中。 
最后,讓我們來用一個(gè)元素?cái)U(kuò)展圖片記錄,該元素定義了一套縮略圖(thumbnail)來用于內(nèi)容表或其它地方。這里我用了和先前同樣定義的圖片內(nèi)容。 
一張圖片的xml表示可以是這樣的: 
picture> 
title>alex on the beach/title> 
date>1999-08-08/date> 
caption>trying in vain to get a tan/caption> 
image> 
src>alex-beach.jpg/src> 
width>340/width> 
height>200/height> 
/image> 
thumbnails> 
image> 
src>alex-beach-sm.jpg/src> 
width>72/width> 
height>72/height> 
/image> 
image> 
src>alex-beach-med.jpg/src> 
width>150/width> 
height>99/height> 
/image> 
/thumbnails> 
/picture> 
注意,通過使用xml, 你將一張單獨(dú)圖片的全部信息放到了一個(gè)單獨(dú)的文件中,而不是將它分散放入3-4個(gè)表中。 我們將這稱為 .pix file 
-- 于是你的文件系統(tǒng)會(huì)是這樣的: 
summer99/alex-beach.pix 
summer99/alex-beach.jpg 
summer99/alex-beach-sm.jpg 
summer99/alex-beach-med.jpg 
summer99/alex-snorkeling.pix 
etc. 
技術(shù)篇 
俗話說,要?jiǎng)兿仑埖钠さ姆椒ê沃挂环N。同樣,將xml數(shù)據(jù)放到j(luò)sp中也不止一種辦法。這里列舉了其中一些方法,(其實(shí),很多其它工具也可以做得同樣出色。) 
dom: 你可以使用類(classes)來調(diào)用dom接口(interface)對(duì)xml文件進(jìn)行分析檢查。 
xmlentrylist: 你可以使用我的代碼來將xml加載到name-value pairs 的java.util.list中。 
xpath: 你可以使用一個(gè) xpath處理器(如resin)通過路徑名在xml文件中定位元素。 
xsl:你可以使用某種xsl處理器將xml轉(zhuǎn)換成為html。 
cocoon: 你可以使用開放源碼的cocoon framework 
運(yùn)行你自己的bean: 你可以寫一個(gè)外殼類(wrapper class),使用某種其它技術(shù)來將數(shù)據(jù)加載到字定義的javabean中。 
請(qǐng)注意這些技術(shù)將和一個(gè)你從另外來源取得的xml stream執(zhí)行得同樣出色,例如一個(gè)客戶端或者一個(gè)應(yīng)用服務(wù)器。 
javaserver pages 
jsp規(guī)范有很多替身,不同的jsp產(chǎn)品表現(xiàn)也不盡相同,不同版本之間也有差別。我選擇了tomcat,這基于以下原因: 
它支持大多數(shù)最新的jsp/servlet規(guī)范 
它受到 sun和apache認(rèn)同 
你可以獨(dú)立運(yùn)行它而不需要另外配置一個(gè)web服務(wù)器。 
它是開放源碼的 
你可以選擇任何你喜歡的jsp引擎,但要自己配置它,它必須至少支持jsp 1.0規(guī)范。0.91和1.0之間有了許多區(qū)別。而jswdk (java server web development kit) 可能剛剛好地適合要求。 
jsp結(jié)構(gòu) 
當(dāng)創(chuàng)建一個(gè)jsp網(wǎng)站 (webapp), 我喜歡將公用的函數(shù)、導(dǎo)入、常量、變量聲明都放入到一個(gè)單獨(dú)的文件init.jsp中。 然后用 %@include file="init.jsp"%>加載到每一個(gè)文件中去。 %@include%> 就象c語(yǔ)言的 #include, include在編譯時(shí)使其中的文本作為一個(gè)部分被加入并一起進(jìn)行編譯,相對(duì)地, jsp:include>標(biāo)記則是使其中的文件被獨(dú)立地進(jìn)行編譯,然后在文件中嵌入一個(gè)對(duì)它的調(diào)用。 
查找文件 
當(dāng)jsp啟動(dòng)時(shí),初始化后第一件事情就是查找你要的xml文件。它是怎么知道在眾多文件中你要找的是哪一個(gè)? 它來自與一個(gè)參數(shù),使用者會(huì)在調(diào)用jsp的url中加入?yún)?shù): picture.jsp?file=summer99/alex-beach.pix (或者通過html表單來傳遞文件參數(shù))。 
但是,當(dāng)jsp接受此參數(shù)以后,你仍然只完成了一半工作,因?yàn)檫€要知道文件系統(tǒng)的根目錄在哪里。例如,在unix系統(tǒng)中,實(shí)際文件可能在這樣的路徑: 
/home/alex/public_html/pictures/summer99/alex-beach.pix。 
jsp文件在執(zhí)行狀態(tài)時(shí)沒有當(dāng)前路徑概念。所以你為java.io包要給出一個(gè)絕對(duì)路徑。 
servlet api可以提供一個(gè)方法來將一個(gè)url路徑,從相對(duì)于當(dāng)前jsp或servlet的路徑轉(zhuǎn)化成為一個(gè)絕對(duì)的文件系統(tǒng)路徑。方法是: 
servletcontext.getrealpath(string)。 
每一個(gè)jsp有一個(gè)叫做application的 servletcontext對(duì)象。所以代碼可以是: 
string picturefile = 
application.getrealpath("/" + request.getparameter("file")); 
或者 
string picturefile = 
getservletcontext().getrealpath("/" + request.getparameter("file")); 
它也可以在servlet中工作。(你必須加上 / 因?yàn)榇朔椒ㄐ枰獋鬟frequest.getpathinfo()的結(jié)果。) 
這里有一個(gè)重要的提示:每當(dāng)你存取本地的資源,要非常小心地檢查輸入數(shù)據(jù)的合法性。黑客或者粗心的用戶,可能發(fā)送偽造的或錯(cuò)誤的數(shù)據(jù)來破壞你的站點(diǎn)。例如,請(qǐng)想一下以下的表達(dá)會(huì)發(fā)生什么結(jié)果: 
如果輸入了file=../../../../etc/passwd。這樣用戶回讀到你的服務(wù)器的password文件! 
dom (document object model) 
dom 代表文檔對(duì)象模型document object model。它是瀏覽xml文檔的一種標(biāo)準(zhǔn)api,由world wide web consortium (w3c)發(fā)展。 接口在org.w3c.dom包中,文檔參見w3c站點(diǎn)。 
有許多可用的dom分析器工具。我選擇了 ibm的xml4j。但你可以使用任何其它的dom分析器。這是因?yàn)閐om是一套接口,而不是類 --所有的dom分析器(parser)必須返回同樣地處理這些接口的對(duì)象。 
遺憾的是,雖然很標(biāo)準(zhǔn),dom還是有兩大缺陷: 
1 api雖然也是面向?qū)ο蟮?,還是相當(dāng)笨重。 
dom parser并沒有標(biāo)準(zhǔn)的api,所以, 當(dāng)每一個(gè)分析器返回一個(gè)org.w3c.dom對(duì)象,文檔對(duì)象--分析器初始化和文件自身加載的方式,對(duì)應(yīng)于不同分析器通常總是特定的。 
這個(gè)簡(jiǎn)單的上面已描述的圖片文件在dom中可以在一個(gè)樹結(jié)構(gòu)中通過一些對(duì)象表示如下: 
document node 
--> element node "picture" 
--> text node "\n " (whitespace) 
--> element node "title" 
--> text node "alex on the beach" 
--> element node "date" 
--> ... etc. 
為了取得“alex on the beach”,你要做一些方法調(diào)用,游歷dom樹,而且,分析器可能選擇分散“whitespace”文本nodes的一些數(shù)據(jù),你不得不使用循環(huán)和串聯(lián)等 (你可以通過調(diào)用normalize()來糾正這個(gè)問題。)分析器可能還包含了分離的xml實(shí)體(如 ), cdata nodes或者其它實(shí)體nodes (如b>bigb>會(huì)被變成至少三個(gè)node。也沒有辦法在dom中簡(jiǎn)單表示"get me the text value of the title element." 總之,在dom中游歷有一點(diǎn)笨重。(參見本文用xpath取代dom章節(jié)。) 
2 從更高處看,dom的問題是xml對(duì)象無法象java對(duì)象一樣可以直接得到,它們需要通過 dom api一個(gè)一個(gè)地得到。 
你可以參考我的為java-xml data binding技術(shù)討論做的一些歸納,那里也用了這種直接使用java的方法來存取xml數(shù)據(jù)。 
我寫了一個(gè)小的工具類,叫做domutils,包含了靜態(tài)方法來執(zhí)行公用的dom任務(wù)。例如,要獲得根(圖片)元素的title子元素的文本內(nèi)容,你可以編寫如下代碼: 
document doc = domutils.xml4jparse(picturefile); 
element noderoot = doc.getdocumentelement(); 
node nodetitle = domutils.getchild(noderoot, "title"); 
string title = (nodetitle == null) ? null : domutils.gettextvalue(nodetitle); 
您可能感興趣的文章:
  • 關(guān)于JSP配置文件web.xml加載順序詳解
  • jsp中session過期設(shè)置及web.xml配置學(xué)習(xí)
  • jsp web.xml文件的作用及基本配置
  • JSP XMLHttpRequest動(dòng)態(tài)無刷新及其中文亂碼處理
  • jsp 從web.xml讀取連接數(shù)據(jù)庫(kù)的參數(shù)
  • jsp讀取大對(duì)象CLOB并生成xml文件示例
  • Jsp結(jié)合XML+XSLT將輸出轉(zhuǎn)換為Html格式
  • JSP+XML構(gòu)架網(wǎng)站的實(shí)例
  • 使用JSP + JAVABEAN + XML 開發(fā)的一個(gè)例子
  • JSP取得在WEB.XML中定義的參數(shù)
  • JSP基于dom解析xml實(shí)例詳解

標(biāo)簽:果洛 西雙版納 黃石 益陽(yáng) 拉薩 德州 宿遷 寧夏

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《XML和JSP的聯(lián)手》,本文關(guān)鍵詞  XML,和,JSP,的,聯(lián)手,XML,和,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《XML和JSP的聯(lián)手》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于XML和JSP的聯(lián)手的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章