华南俳烁实业有限公司

考試首頁 | 考試用書 | 培訓課程 | 模擬考場 | 考試論壇  
  當前位置:設(shè)計制作 > XML > 文章內(nèi)容
  

XML教程:XML和JSP的聯(lián)手

 [ 2017年8月25日 ] 【

  概覽:

  xml和jsp是這些日子中最熱的東西。本文介紹如何聯(lián)合這兩種技術(shù)來建設(shè)動態(tài)網(wǎng)站。你還可以同時看一下dom,xpath,xsl,和其它java-xml技術(shù)的示例代碼。

  我們在此假設(shè)你已經(jīng)了解javaserver pages(jsp)和extensible markup language (xml)。但也許你對該如何綜合使用它們?nèi)匀挥行┟曰蟆?/P>

  jsp的應用很容易,你可以用它設(shè)計網(wǎng)頁,使之看起來似乎和html一樣。唯一的不同是jsp是動態(tài)執(zhí)行的。例如,它們可以處理表單form和讀寫數(shù)據(jù)庫。

  xml的應用的說明則比較困難。似乎所有的產(chǎn)品都支持它,每個人也好象都以各種不同目的在使用它。

  在本文中,你可以看到如何使用一種相當先進的方式用xml來設(shè)計一個系統(tǒng)。許多站點有巨量數(shù)據(jù)收集并以一種很標準或很不標準的方式來顯示它們。我將設(shè)計一個系統(tǒng),它使用xml文件在web服務(wù)器上進行存儲,并用jsp來顯示數(shù)據(jù)。

  xml vs 關(guān)系型數(shù)據(jù)庫

  "等一下!"你可能問,"你用xml文件存儲數(shù)據(jù)嗎?為什么不使用數(shù)據(jù)庫?"

  這個問題問的很好。我的回答是,對很多目的用途來說,用數(shù)據(jù)庫太過浪費了。.要使用一個數(shù)據(jù)庫,你必須安裝和支持一個分離的服務(wù)器處理進程(a separate server process),它常要求有安裝和支持它的administrator。你必須學習sql, 并用sql寫查詢,然后轉(zhuǎn)換數(shù)據(jù),再返回。而如果你用xml文件存儲數(shù)據(jù),將可減少額外的服務(wù)器的負荷。還有,你還找到了一個編輯數(shù)據(jù)的簡單方法。你只要使用文本編輯器,而不必使用復雜的數(shù)據(jù)庫工具。xml文件很容易備份,和朋友共享,或下載到你的客戶端。同樣的,你可以方便地通過ftp上載新的數(shù)據(jù)到你的站點。

  xml還有一個更抽象的優(yōu)點,即作為層次型的格式比關(guān)系型的更好。 它可以用一種很直接的方式來設(shè)計數(shù)據(jù)結(jié)構(gòu)來符合你的需要。你不需要使用一個實體-關(guān)系編輯器,也不需要使你的圖表(schema)標準化。 如果你有一個元素(element)包含了另一個元素,你可以直接在格式中表示它,而不需要使用表的關(guān)聯(lián)。

  注意,在很多應用中,依靠文件系統(tǒng)是不夠充分的。如果更新很多,文件系統(tǒng)會因為同時寫入而受到破壞。數(shù)據(jù)庫則通常支持事務(wù)處理,可以應付所發(fā)生的請求而不至于損壞。對于復雜的查詢統(tǒng)計要有反復、及時的更新,此時數(shù)據(jù)庫表現(xiàn)都很優(yōu)秀。當然,關(guān)系型數(shù)據(jù)庫還有很多優(yōu)點,包括豐富的查詢語言,圖表化工具,可伸縮性,存取控制等等。

  (注意:你可以使用簡單的文件鎖定來提供一個事務(wù)處理服務(wù)器,你還可以在java中執(zhí)行一種 xml index-and-search工具,不過這已經(jīng)是另外一篇文章的主題了。)

  在下面這樣的案例中,正如大多數(shù)中小規(guī)模的、基于發(fā)布信息的站點一樣,你可能涉及的大多數(shù)數(shù)據(jù)存取都是讀,而不是寫,數(shù)據(jù)雖然可能很大,但相對來說并沒有經(jīng)常的更新變化,你也不需要做很復雜的查詢,即使你需要做,也將用一個獨立的查詢工具,那么成熟的rdbms的優(yōu)點消失了,而面向?qū)ο笮偷臄?shù)據(jù)模型的優(yōu)點則可以得到體現(xiàn)。

  最后,為你的數(shù)據(jù)庫提供一個查詢器外殼來進行sql查詢并將他們轉(zhuǎn)化進入xml stream也是完全有可能的。

  所以你可以選擇這二種方式之一。xml正變成一種非常健壯的,便于編程的工具,作為某個成熟的數(shù)據(jù)庫的前端工具來進行存儲和查詢。(oracle的xsql servlet即是這種技術(shù)的一個很好的例子。)

  應用篇:一個在線相冊

  所有人都喜歡照相!他們喜歡展示自己的,親人的,朋友的,度假時的照片,而 web 是他們展示的好地方。-- 即使千里之外的親戚都可以看到。我將著重于定義一個單獨的picture對象。(這一應用的源代碼在resources中可以取得) 。該對象描述了表示一張照片所需要的字段:title,date,一個可選的標題,以及對圖片來源的一個指向。

  一個圖象,需要它自己的一些字段:源文件( gif/jpeg)的定位,寬度和高度像素(以協(xié)助建立 標記。 這里可以看到一個很簡單的優(yōu)點,即使用文件系統(tǒng)來代替數(shù)據(jù)庫的時候,你可以將圖形文件存放在與數(shù)據(jù)文件相同的目錄中。

  最后,讓我們來用一個元素擴展圖片記錄,該元素定義了一套縮略圖(thumbnail)來用于內(nèi)容表或其它地方。這里我用了和先前同樣定義的圖片內(nèi)容。

  一張圖片的xml表示可以是這樣的:

  

  

  1999-08-08

  trying in vain to get a tan

  

  alex-beach.jpg

  340

  200

  

  

  

  alex-beach-sm.jpg

  72

  72

  

  

  alex-beach-med.jpg

  150

  99

  

  

  

  注意,通過使用xml, 你將一張單獨圖片的全部信息放到了一個單獨的文件中,而不是將它分散放入3-4個表中。 我們將這稱為 .pix file

  -- 于是你的文件系統(tǒng)會是這樣的:

  summer99/alex-beach.pix

  summer99/alex-beach.jpg

  summer99/alex-beach-sm.jpg

  summer99/alex-beach-med.jpg

  summer99/alex-snorkeling.pix

  etc.

  技術(shù)篇

  俗話說,要剝下貓的皮的方法何止一種。同樣,將xml數(shù)據(jù)放到j(luò)sp中也不止一種辦法。這里列舉了其中一些方法,(其實,很多其它工具也可以做得同樣出色。)

  dom: 你可以使用類(classes)來調(diào)用dom接口(interface)對xml文件進行分析檢查。

  xmlentrylist: 你可以使用我的代碼來將xml加載到name-value pairs 的java.util.list中。

  xpath: 你可以使用一個 xpath處理器(如resin)通過路徑名在xml文件中定位元素。

  xsl:你可以使用某種xsl處理器將xml轉(zhuǎn)換成為html。

  cocoon: 你可以使用開放源碼的cocoon framework

  運行你自己的bean: 你可以寫一個外殼類(wrapper class),使用某種其它技術(shù)來將數(shù)據(jù)加載到字定義的javabean中。

  請注意這些技術(shù)將和一個你從另外來源取得的xml stream執(zhí)行得同樣出色,例如一個客戶端或者一個應用服務(wù)器。

  javaserver pages

  jsp規(guī)范有很多替身,不同的jsp產(chǎn)品表現(xiàn)也不盡相同,不同版本之間也有差別。我選擇了tomcat,這基于以下原因:

  它支持大多數(shù)最新的jsp/servlet規(guī)范

  它受到 sun和apache認同

  你可以獨立運行它而不需要另外配置一個web服務(wù)器。

  它是開放源碼的

  你可以選擇任何你喜歡的jsp引擎,但要自己配置它,它必須至少支持jsp 1.0規(guī)范。0.91和1.0之間有了許多區(qū)別。而jswdk (java server web development kit) 可能剛剛好地適合要求。

  jsp結(jié)構(gòu)

  當創(chuàng)建一個jsp網(wǎng)站 (webapp), 我喜歡將公用的函數(shù)、導入、常量、變量聲明都放入到一個單獨的文件init.jsp中。 然后用 <%@include file="init.jsp"%>加載到每一個文件中去。 <%@include%>就象c語言的 #include, include在編譯時使其中的文本作為一個部分被加入并一起進行編譯,相對地, 標記則是使其中的文件被獨立地進行編譯,然后在文件中嵌入一個對它的調(diào)用。

  查找文件

  當jsp啟動時,初始化后第一件事情就是查找你要的xml文件。它是怎么知道在眾多文件中你要找的是哪一個? 它來自與一個參數(shù),使用者會在調(diào)用jsp的url中加入?yún)?shù): picture.jsp?file=summer99/alex-beach.pix (或者通過html表單來傳遞文件參數(shù))。

  但是,當jsp接受此參數(shù)以后,你仍然只完成了一半工作,因為還要知道文件系統(tǒng)的根目錄在哪里。例如,在unix系統(tǒng)中,實際文件可能在這樣的路徑:

  /home/alex/public_html/pictures/summer99/alex-beach.pix。

  jsp文件在執(zhí)行狀態(tài)時沒有當前路徑概念。所以你為java.io包要給出一個絕對路徑。

  servlet api可以提供一個方法來將一個url路徑,從相對于當前jsp或servlet的路徑轉(zhuǎn)化成為一個絕對的文件系統(tǒng)路徑。方法是:

  servletcontext.getrealpath(string)。

  每一個jsp有一個叫做application的 servletcontext對象。所以代碼可以是:

  string picturefile =

  application.getrealpath("/" + request.getparameter("file"));

  或者

  string picturefile =

  getservletcontext().getrealpath("/" + request.getparameter("file"));

  它也可以在servlet中工作。(你必須加上 / 因為此方法需要傳遞request.getpathinfo()的結(jié)果。)

  這里有一個重要的提示:每當你存取本地的資源,要非常小心地檢查輸入數(shù)據(jù)的合法性。黑客或者粗心的用戶,可能發(fā)送偽造的或錯誤的數(shù)據(jù)來破壞你的站點。例如,請想一下以下的表達會發(fā)生什么結(jié)果:

  如果輸入了file=../../../../etc/passwd。這樣用戶回讀到你的服務(wù)器的password文件!

  dom (document object model)

  dom 代表文檔對象模型document object model。它是瀏覽xml文檔的一種標準api,由world wide web consortium (w3c)發(fā)展。 接口在org.w3c.dom包中,文檔參見w3c站點。

  有許多可用的dom分析器工具。我選擇了 ibm的xml4j。但你可以使用任何其它的dom分析器。這是因為dom是一套接口,而不是類 --所有的dom分析器(parser)必須返回同樣地處理這些接口的對象。

  遺憾的是,雖然很標準,dom還是有兩大缺陷:

  1 api雖然也是面向?qū)ο蟮模是相當笨重。

  dom parser并沒有標準的api,所以, 當每一個分析器返回一個org.w3c.dom對象,文檔對象--分析器初始化和文件自身加載的方式,對應于不同分析器通?偸翘囟ǖ。

  這個簡單的上面已描述的圖片文件在dom中可以在一個樹結(jié)構(gòu)中通過一些對象表示如下:

  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()來糾正這個問題。)分析器可能還包含了分離的xml實體(如 &), cdata nodes或者其它實體nodes (如big會被變成至少三個node。也沒有辦法在dom中簡單表示"get me the text value of the title element." 總之,在dom中游歷有一點笨重。(參見本文用xpath取代dom章節(jié)。)

  2 從更高處看,dom的問題是xml對象無法象java對象一樣可以直接得到,它們需要通過 dom api一個一個地得到。

  你可以參考我的為java-xml data binding技術(shù)討論做的一些歸納,那里也用了這種直接使用java的方法來存取xml數(shù)據(jù)。

  我寫了一個小的工具類,叫做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);

本文糾錯】【告訴好友】【打印此文】【返回頂部
將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動訪問考試網(wǎng) | 復制本頁地址,傳給QQ/MSN上的好友 | 申請鏈接 | 意見留言 TOP
關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  站內(nèi)導航  考試論壇
Copyright © 2007-2013 中華考試網(wǎng)(Examw.com) All Rights Reserved
历史| 科技| 新余市| 盐津县| 泸定县| 宽城| 金沙县| 河津市| 黄平县| 渝北区| 兴山县| 新巴尔虎左旗| 南京市| 依安县| 南部县| 乌拉特前旗| 尉氏县| 玉溪市| 科技| 化德县| 涡阳县| 临澧县| 渭源县| 嘉义市| 石景山区| 隆尧县| 交城县| 灵丘县| 泽库县| 晋宁县| 四川省| 铁岭县| 廊坊市| 肇东市| 离岛区| 哈密市| 禹州市| 罗定市| 祥云县| 财经| 镇坪县|