亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

XML和JSP的聯手

2024-09-05 20:53:32
字體:
來源:轉載
供稿:網友

概覽: 
xml和jsp是這些日子中最熱的東西。本文介紹如何聯合這兩種技術來建設動態網站。你還可以同時看一下dom,xpath,xsl,和其它java-xml技術的示例代碼。 
我們在此假設你已經了解javaserver pages(jsp)和extensible markup language (xml)。但也許你對該如何綜合使用它們仍然有些迷惑。 
jsp的應用很容易,你可以用它設計網頁,使之看起來似乎和html一樣。唯一的不同是jsp是動態執行的。例如,它們可以處理表單form和讀寫數據庫。 
xml的應用的說明則比較困難。似乎所有的產品都支持它,每個人也好象都以各種不同目的在使用它。 
在本文中,你可以看到如何使用一種相當先進的方式用xml來設計一個系統。許多站點有巨量數據收集并以一種很標準或很不標準的方式來顯示它們。我將設計一個系統,它使用xml文件在web服務器上進行存儲,并用jsp來顯示數據。 
xml vs 關系型數據庫
"等一下!"你可能問,"你用xml文件存儲數據嗎?為什么不使用數據庫?" 
這個問題問的很好。我的回答是,對很多目的用途來說,用數據庫太過浪費了。.要使用一個數據庫,你必須安裝和支持一個分離的服務器處理進程(a separate server process),它常要求有安裝和支持它的administrator。你必須學習sql, 并用sql寫查詢,然后轉換數據,再返回。而如果你用xml文件存儲數據,將可減少額外的服務器的負荷。還有,你還找到了一個編輯數據的簡單方法。你只要使用文本編輯器,而不必使用復雜的數據庫工具。xml文件很容易備份,和朋友共享,或下載到你的客戶端。同樣的,你可以方便地通過ftp上載新的數據到你的站點。 
xml還有一個更抽象的優點,即作為層次型的格式比關系型的更好。 它可以用一種很直接的方式來設計數據結構來符合你的需要。你不需要使用一個實體-關系編輯器,也不需要使你的圖表(schema)標準化。 如果你有一個元素(element)包含了另一個元素,你可以直接在格式中表示它,而不需要使用表的關聯。 
注意,在很多應用中,依靠文件系統是不夠充分的。如果更新很多,文件系統會因為同時寫入而受到破壞。數據庫則通常支持事務處理,可以應付所發生的請求而不至于損壞。對于復雜的查詢統計要有反復、及時的更新,此時數據庫表現都很優秀。當然,關系型數據庫還有很多優點,包括豐富的查詢語言,圖表化工具,可伸縮性,存取控制等等。 
(注意:你可以使用簡單的文件鎖定來提供一個事務處理服務器,你還可以在java中執行一種 xml index-and-search工具,不過這已經是另外一篇文章的主題了。) 
在下面這樣的案例中,正如大多數中小規模的、基于發布信息的站點一樣,你可能涉及的大多數數據存取都是讀,而不是寫,數據雖然可能很大,但相對來說并沒有經常的更新變化,你也不需要做很復雜的查詢,即使你需要做,也將用一個獨立的查詢工具,那么成熟的rdbms的優點消失了,而面向對象型的數據模型的優點則可以得到體現。 
最后,為你的數據庫提供一個查詢器外殼來進行sql查詢并將他們轉化進入xml stream也是完全有可能的。 
所以你可以選擇這二種方式之一。xml正變成一種非常健壯的,便于編程的工具,作為某個成熟的數據庫的前端工具來進行存儲和查詢。(oracle的xsql servlet即是這種技術的一個很好的例子。) 
應用篇:一個在線相冊 
所有人都喜歡照相!他們喜歡展示自己的,親人的,朋友的,度假時的照片,而 web 是他們展示的好地方。-- 即使千里之外的親戚都可以看到。我將著重于定義一個單獨的picture對象。(這一應用的源代碼在resources中可以取得) 。該對象描述了表示一張照片所需要的字段:title,date,一個可選的標題,以及對圖片來源的一個指向。 
一個圖象,需要它自己的一些字段:源文件( gif/jpeg)的定位,寬度和高度像素(以協助建立<img> 標記。 這里可以看到一個很簡單的優點,即使用文件系統來代替數據庫的時候,你可以將圖形文件存放在與數據文件相同的目錄中。 
最后,讓我們來用一個元素擴展圖片記錄,該元素定義了一套縮略圖(thumbnail)來用于內容表或其它地方。這里我用了和先前同樣定義的圖片內容。 
一張圖片的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, 你將一張單獨圖片的全部信息放到了一個單獨的文件中,而不是將它分散放入3-4個表中。 我們將這稱為 .pix file 
-- 于是你的文件系統會是這樣的: 
summer99/alex-beach.pix 
summer99/alex-beach.jpg 
summer99/alex-beach-sm.jpg 
summer99/alex-beach-med.jpg 
summer99/alex-snorkeling.pix 
etc. 
技術篇 
俗話說,要剝下貓的皮的方法何止一種。同樣,將xml數據放到jsp中也不止一種辦法。這里列舉了其中一些方法,(其實,很多其它工具也可以做得同樣出色。) 
dom: 你可以使用類(classes)來調用dom接口(interface)對xml文件進行分析檢查。 
xmlentrylist: 你可以使用我的代碼來將xml加載到name-value pairs 的java.util.list中。 
xpath: 你可以使用一個 xpath處理器(如resin)通過路徑名在xml文件中定位元素。 
xsl:你可以使用某種xsl處理器將xml轉換成為html。 
cocoon: 你可以使用開放源碼的cocoon framework 
運行你自己的bean: 你可以寫一個外殼類(wrapper class),使用某種其它技術來將數據加載到字定義的javabean中。 
請注意這些技術將和一個你從另外來源取得的xml stream執行得同樣出色,例如一個客戶端或者一個應用服務器。 
javaserver pages 
jsp規范有很多替身,不同的jsp產品表現也不盡相同,不同版本之間也有差別。我選擇了tomcat,這基于以下原因: 
它支持大多數最新的jsp/servlet規范 
它受到 sun和apache認同 
你可以獨立運行它而不需要另外配置一個web服務器。 
它是開放源碼的 
你可以選擇任何你喜歡的jsp引擎,但要自己配置它,它必須至少支持jsp 1.0規范。0.91和1.0之間有了許多區別。而jswdk (java server web development kit) 可能剛剛好地適合要求。 
jsp結構 
當創建一個jsp網站 (webapp), 我喜歡將公用的函數、導入、常量、變量聲明都放入到一個單獨的文件init.jsp中。 然后用 <%@include file="init.jsp"%>加載到每一個文件中去。 <%@include%> 就象c語言的 #include, include在編譯時使其中的文本作為一個部分被加入并一起進行編譯,相對地, <jsp:include>標記則是使其中的文件被獨立地進行編譯,然后在文件中嵌入一個對它的調用。 
查找文件 
當jsp啟動時,初始化后第一件事情就是查找你要的xml文件。它是怎么知道在眾多文件中你要找的是哪一個? 它來自與一個參數,使用者會在調用jsp的url中加入參數: picture.jsp?file=summer99/alex-beach.pix (或者通過html表單來傳遞文件參數)。 
但是,當jsp接受此參數以后,你仍然只完成了一半工作,因為還要知道文件系統的根目錄在哪里。例如,在unix系統中,實際文件可能在這樣的路徑: 
/home/alex/public_html/pictures/summer99/alex-beach.pix。 
jsp文件在執行狀態時沒有當前路徑概念。所以你為java.io包要給出一個絕對路徑。 
servlet api可以提供一個方法來將一個url路徑,從相對于當前jsp或servlet的路徑轉化成為一個絕對的文件系統路徑。方法是: 
servletcontext.getrealpath(string)。 
每一個jsp有一個叫做application的 servletcontext對象。所以代碼可以是: 
string picturefile = 
application.getrealpath("/" + request.getparameter("file")); 
或者 
string picturefile = 
getservletcontext().getrealpath("/" + request.getparameter("file")); 
它也可以在servlet中工作。(你必須加上 / 因為此方法需要傳遞request.getpathinfo()的結果。) 
這里有一個重要的提示:每當你存取本地的資源,要非常小心地檢查輸入數據的合法性。黑客或者粗心的用戶,可能發送偽造的或錯誤的數據來破壞你的站點。例如,請想一下以下的表達會發生什么結果: 
如果輸入了file=../../../../etc/passwd。這樣用戶回讀到你的服務器的password文件! 
dom (document object model) 
dom 代表文檔對象模型document object model。它是瀏覽xml文檔的一種標準api,由world wide web consortium (w3c)發展。 接口在org.w3c.dom包中,文檔參見w3c站點。 
有許多可用的dom分析器工具。我選擇了 ibm的xml4j。但你可以使用任何其它的dom分析器。這是因為dom是一套接口,而不是類 --所有的dom分析器(parser)必須返回同樣地處理這些接口的對象。 
遺憾的是,雖然很標準,dom還是有兩大缺陷: 
1 api雖然也是面向對象的,還是相當笨重。 
dom parser并沒有標準的api,所以, 當每一個分析器返回一個org.w3c.dom對象,文檔對象--分析器初始化和文件自身加載的方式,對應于不同分析器通常總是特定的。 
這個簡單的上面已描述的圖片文件在dom中可以在一個樹結構中通過一些對象表示如下: 
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”,你要做一些方法調用,游歷dom樹,而且,分析器可能選擇分散“whitespace”文本nodes的一些數據,你不得不使用循環和串聯等 (你可以通過調用normalize()來糾正這個問題。)分析器可能還包含了分離的xml實體(如 &amp;), cdata nodes或者其它實體nodes (如<b>big<b>會被變成至少三個node。也沒有辦法在dom中簡單表示"get me the text value of the title element." 總之,在dom中游歷有一點笨重。(參見本文用xpath取代dom章節。) 
2 從更高處看,dom的問題是xml對象無法象java對象一樣可以直接得到,它們需要通過 dom api一個一個地得到。 
你可以參考我的為java-xml data binding技術討論做的一些歸納,那里也用了這種直接使用java的方法來存取xml數據。 
我寫了一個小的工具類,叫做domutils,包含了靜態方法來執行公用的dom任務。例如,要獲得根(圖片)元素的title子元素的文本內容,你可以編寫如下代碼: 
document doc = domutils.xml4jparse(picturefile); 
element noderoot = doc.getdocumentelement(); 
node nodetitle = domutils.getchild(noderoot, "title"); 
string title = (nodetitle == null) ? null : domutils.gettextvalue(nodetitle); 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产欧美久久| 尤物九九久久国产精品的分类| 久久影院资源网| 国产成人精品网站| 欧美成人免费一级人片100| 91视频九色网站| 日韩在线观看电影| 国产美女精品免费电影| 夜夜嗨av一区二区三区四区| 日本高清不卡在线| 国产一区二区丝袜高跟鞋图片| 久久精品2019中文字幕| 亚洲三级免费看| 国内精品久久久久久影视8| 日韩国产中文字幕| 国产精品入口夜色视频大尺度| 在线日韩日本国产亚洲| 在线丨暗呦小u女国产精品| 国产精品视频网址| 亚洲精品少妇网址| 在线电影av不卡网址| 国产一区二区三区日韩欧美| 精品中文字幕久久久久久| 91久久精品美女| 中文字幕久热精品在线视频| 国产欧美在线视频| 久久久久在线观看| 在线观看精品自拍私拍| 国产精品成人播放| 久久精品国产亚洲7777| 亚洲最新av在线网站| 在线一区二区日韩| 一区二区福利视频| 欧美成人午夜影院| 色综合久综合久久综合久鬼88| 2018日韩中文字幕| 欧美综合在线观看| 在线色欧美三级视频| 精品magnet| 欧美激情视频免费观看| 日韩亚洲欧美中文在线| 韩国v欧美v日本v亚洲| 欧美另类暴力丝袜| 亚洲成人黄色在线观看| 国产va免费精品高清在线观看| 国产精品视频久久久| 欧美精品精品精品精品免费| 欧洲s码亚洲m码精品一区| 亚洲成年人在线播放| 国产亚洲激情在线| 另类少妇人与禽zozz0性伦| 精品国产999| 日本在线观看天堂男亚洲| 亚洲欧美国产日韩中文字幕| 国产98色在线| 成人黄色网免费| 日韩高清av一区二区三区| 亚洲黄页视频免费观看| 亚洲色图五月天| 亚洲性日韩精品一区二区| 日本不卡免费高清视频| 亚洲成人网久久久| 精品福利在线视频| 亚洲视频一区二区三区| 国产视频在线观看一区二区| 亚洲成人a级网| 亚洲精品电影在线观看| 欧美大片欧美激情性色a∨久久| 国产成人激情视频| 黑丝美女久久久| 亚洲黄页网在线观看| 国模私拍视频一区| 深夜福利国产精品| 国产精品羞羞答答| 在线观看91久久久久久| 91精品国产自产在线观看永久| 国产精品久久久久7777婷婷| 国产午夜精品一区二区三区| 亚洲伊人第一页| 亚洲国产一区二区三区在线观看| 欧美三级免费观看| 国产91精品久久久| 国产精品久久中文| 久久躁狠狠躁夜夜爽| 亚洲国产日韩欧美在线99| 精品视频在线观看日韩| 亚洲一区二区三区在线视频| 久久久噜噜噜久久中文字免| 狠狠躁夜夜躁人人爽超碰91| 最新日韩中文字幕| 欧美黄色小视频| 国产小视频91| 91久久嫩草影院一区二区| 久久久在线免费观看| 欧美日本国产在线| 不卡av电影在线观看| 91精品国产综合久久久久久久久| 亚洲国产精品嫩草影院久久| 国产精品入口免费视频一| 欧美成人免费大片| 日韩成人在线视频| 日韩中文在线中文网三级| 亚洲伊人第一页| 国产精品女人久久久久久| 亚洲大胆人体在线| 亚洲激情视频在线播放| xvideos国产精品| 亚洲第一精品夜夜躁人人爽| 久久综合久久美利坚合众国| 国产欧美久久久久久| 久久在线免费观看视频| 九九久久国产精品| 欧美一级视频免费在线观看| 久久视频中文字幕| 国产91精品青草社区| 欧美美女18p| 亚洲精品成人免费| 国产综合视频在线观看| 亚洲最新av在线| 欧美一二三视频| 全球成人中文在线| 欧美性高潮床叫视频| 国产精品美女免费| 色一区av在线| 黑丝美女久久久| 欧美成人网在线| 亚洲国产精久久久久久久| 国产精品久久久久久久久久| 国产视频福利一区| 精品久久久久久久久久久| 成人福利视频在线观看| 欧美日韩亚洲国产一区| 精品国产一区av| 91精品国产91久久久久久| 亚洲丝袜在线视频| 国产精品69精品一区二区三区| 欧美一级淫片丝袜脚交| 久久久久国产视频| 亚洲综合中文字幕在线观看| 欧美在线视频免费播放| 色青青草原桃花久久综合| 国产精品久久久久久av| 国产精品午夜视频| 亚洲国内高清视频| 欧美精品videos另类日本| 精品国产一区二区三区久久久狼| 国产亚洲视频中文字幕视频| 亚洲成人网在线观看| 久久久亚洲精选| 精品视频在线观看日韩| 欧美另类99xxxxx| 亚洲欧美另类人妖| 亚洲国产精品视频在线观看| 日韩电影中文 亚洲精品乱码| 久久精品美女视频网站| 欧美电影《睫毛膏》| 国内精品模特av私拍在线观看| 国产视频在线一区二区| 亚洲欧洲一区二区三区在线观看| 成人综合网网址| 国产亚洲美女精品久久久| www.午夜精品| 日韩美女免费线视频| 欧美激情一级二级|