国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用JavaServer Pages技術(shù)生成動態(tài)XML

2019-11-18 15:13:54
字體:
供稿:網(wǎng)友

  作者:lhcyf

使用 javaServer Pages 技術(shù)生成動態(tài) xml   

  JavaServer Pages (jsp) 技術(shù)通常用于構(gòu)建包含動態(tài)內(nèi)容的 Html 頁面。但是您也可以使用這一技術(shù)生成其他格式(包括 XML)的動態(tài)內(nèi)容。本文將用實(shí)例說明如何將 JSP 頁面構(gòu)建為 XML 文檔模板,此模板是在請求時使用嵌在該頁面中的 Java 代碼"填充"的。
  Web 應(yīng)用程序開發(fā)人員傳統(tǒng)上使用 JSP 技術(shù)動態(tài)構(gòu)建 HTML,方法是將 Java 代碼包括在 HTML 源代碼中。但您知道可以使用同樣的方法生成 HTML 之外的動態(tài)內(nèi)容嗎?您可以實(shí)現(xiàn)這一點(diǎn),而且方法比較簡單。可以使用 XML 文檔構(gòu)建 JSP 頁面,該 XML 文檔將用作輸出模板,然后替換必須基于基層業(yè)務(wù)邏輯動態(tài)生成的部分。為了生成文檔的動態(tài)部分,您既可以使用直接編寫在 JSP 頁面中的 Java 代碼,也可以使用從該頁面外部調(diào)用的 Java 代碼。
  生成文檔的哪些部分由您控制。例如,您可以使用 Java 代碼生成兩個 XML 標(biāo)記之間的數(shù)據(jù),生成 XML 文檔樹的各個部分(標(biāo)記和數(shù)據(jù)),甚至可以生成整個文檔。
  Java 代碼被從頁面中除去,并被加工成一個 servlet(稱為頁面 servlet),然后 Java 應(yīng)用程序服務(wù)器將其作為 JSP 頁面請求的一部分運(yùn)行。得到的結(jié)果是純 XML。

JSP 技術(shù)概述

  讓我們先對 JSP 頁面的工作方式作一些簡單的討論。我們將力求簡單,只將注重力集中于一些基本的方面。
從傳統(tǒng)意義上講,JSP 頁面與 HTML 頁面很相似,只是多了一些標(biāo)記。這些標(biāo)記使設(shè)計(jì)人員能夠?qū)?Java 代碼(不是 javascript)嵌入到頁面中。Web 應(yīng)用程序服務(wù)器(如 IBM WebSphere application Server)將截取對 JSP 頁面的請求。頁面的擴(kuò)展名 .jsp(不是 .html)向應(yīng)用程序服務(wù)器暗示了這些標(biāo)記的存在。Web 應(yīng)用程序服務(wù)器隨后對 JSP 頁面進(jìn)行預(yù)處理,提取其中的 JSP 標(biāo)記和任何內(nèi)嵌的 Java 代碼,而只保留 HTML。提取出來的 JSP 標(biāo)記和內(nèi)嵌 Java 代碼用來構(gòu)建 Java servlet(JSP 頁面 servlet),Java servlet 運(yùn)行該代碼并將結(jié)果插入到原頁面中 JSP 標(biāo)記所在的位置。得到的結(jié)果是純 HTML。在請求瀏覽器看到任何結(jié)果之前,Java 代碼被剝離并在服務(wù)器上運(yùn)行。
  我們可以將同樣的原理應(yīng)用于 XML 頁面。在包含 XML 的 JSP 頁面的請求者(可能是一個瀏覽器,也可能是某個企業(yè)對企業(yè)的應(yīng)用程序)看到 XML 之前,Java 代碼被剝離 JSP 頁面并用來生成其他內(nèi)容,生成的內(nèi)容被插入到 JSP 標(biāo)記原來所在的頁面位置。這種特性使您能夠精確地控制將新內(nèi)容插入到什么位置,甚至可以精確到單個字符。
  過一會兒我們將考慮如何使用以上的特性。首先,讓我們考慮為什么您可能會想到用 JSP 創(chuàng)建動態(tài) XML。為什么不只是編寫 Java 應(yīng)用程序或 servlet 來生成整個文檔?為什么要費(fèi)心去使用 JSP 呢?最重要的原因是無須為每個請求重新生成靜態(tài)內(nèi)容是有意義的(假定 XML 文檔只有部分內(nèi)容是動態(tài)的)。通過使用 JSP 頁面,頁面內(nèi)的靜態(tài) XML 就可以充當(dāng)一個模板,該模板是用動態(tài)內(nèi)容填充的。Java 代碼的任務(wù)僅僅是生成可能隨時間變化的內(nèi)容 -- 這是一種更有效的方法。
  非常現(xiàn)實(shí)的一個問題是,JSP 頁面使您能夠?qū)⒉煌_發(fā)人員負(fù)責(zé)的任務(wù)分開。非凡是,它們答應(yīng)您更好地將數(shù)據(jù)與視圖分離開,從而答應(yīng)您在不影響邏輯的情況下添加新表示。設(shè)想這樣一個 Java servlet,它執(zhí)行業(yè)務(wù)邏輯,并根據(jù)請求的性質(zhì)將生成的結(jié)果重定向到適當(dāng)?shù)?JSP 頁面。例如,當(dāng) servlet 檢測到 WAP 電話瀏覽器發(fā)出請求時,它就可以將數(shù)據(jù)重定向到一個包含 WML 的 JSP 頁面。對于標(biāo)準(zhǔn)瀏覽器請求,它可以將數(shù)據(jù)重定向到包括 HTML 的 JSP 頁面。

結(jié)構(gòu)  

  讓我們剖析一個示例,該示例將一個靜態(tài) XML 文檔轉(zhuǎn)換為一個 JSP 頁面,該文檔的部分內(nèi)容被重寫為要動態(tài)生成。本例基于 IBM WebSphere Transcoding Publisher 附帶的一個稱為 FlightInfo 的 XML 樣例。此 XML 文檔表示一個特定航線的信息。Transcoding Publisher 將它作為一個說明如何使用該產(chǎn)品以適合設(shè)備的格式再現(xiàn) XML 數(shù)據(jù)的樣例。但是在 Transcoding Publisher 或其他任何應(yīng)用程序有機(jī)會處理該文檔之前,我們希望動態(tài)構(gòu)建它的某些內(nèi)容。
下面是原始的 XML 文檔(已將 DTD 省略):
<?xml version="1.0" encoding="ISO-8859-1"?><Flights> <AirCarrier>AA</AirCarrier> <FlightNumber>700</FlightNumber> <FlightSegment> <DepartingInfo> <City>DFW</City> <Date>30Mar</Date> <Scheduled>0630A</Scheduled> <Status>ON TIME</Status> <Time>0632A</Time> <Gate>C16</Gate> <OffGateTime>0644A</OffGateTime> <OFFGROUNDTIME>0632A< <Gate Time> <Time>1043A< Status> TIME< <Status>ON Scheduled> <Scheduled>1040A< Date> <Date>30Mar< City> <City>LGA< <ArrivingInfo> DepartingInfo> < OffGroundTime>>D5</Gate> <Baggage>B</Baggage> <OnGroundTime>1043A</OnGroundTime> </ArrivingInfo> </FlightSegment></Flights>
使用 .jsp 擴(kuò)展名重命名該文件
  首先,我們需要使用 .jsp 擴(kuò)展名重命名該文件,以便 Web 服務(wù)器知道如何處理它。Web 服務(wù)器按一定的規(guī)則作用于某些 URL 模式或文件擴(kuò)展名,如 .html 或 .gif。當(dāng)將一個 Web 應(yīng)用程序服務(wù)器添加到一個 Web 服務(wù)器中時,該應(yīng)用程序服務(wù)器就會在 Web 服務(wù)器列表中添加規(guī)則,以便處理特定于該應(yīng)用程序服務(wù)器的 URL 和文件擴(kuò)展名。當(dāng) Web 服務(wù)器看到一個帶有 .jsp 擴(kuò)展名的文件時,它就會將此請求傳遞給 Web 應(yīng)用程序服務(wù)器進(jìn)行處理。

添加頁面指令
  下一步,我們需要把將要生成的內(nèi)容的格式通知 JSP 頁面編譯器。缺省情況下,頁面編譯器將假定內(nèi)容的格式是 HTML。要覆蓋這一設(shè)置,必須添加 JSP 頁面指令來設(shè)置內(nèi)容類型。對于 JSP 1.0,內(nèi)容類型頁面指令類似以下的形式:
<%@ page contentType="text/xml;charset=ISO-8859-1" %>
  重要的是要注重 JSP 頁面編譯器只會除去組成標(biāo)記及其內(nèi)容的字符。假如將 JSP 標(biāo)記放在一個新行上,頁面編譯器將除去除換行符之外的任何字符(因?yàn)閾Q行符不是標(biāo)記的一部分)。例如,假定我們按以下方式將內(nèi)容類型標(biāo)記添加到新 JSP 頁面中:
<%@ page contentType="text/xml;charset=ISO-8859-1" %><?xml version="1.0" encoding="ISO-8859-1"?><Flights> <AirCarrier>AA</AirCarrier> <FlightNumber>700</FlightNumber> <FlightSegment> ...
  在這種情況下,頁面編譯器將除去第一行中的頁面指令,并在 <?xml...?> 版本標(biāo)記之前留下一個空行。在 XML 文檔中,XML 版本標(biāo)記必須位于第一行,所以這個示例將在 XML 分析程序中導(dǎo)致錯誤。要修正這個錯誤,請將此頁面指令添加到第二行,或者將內(nèi)容標(biāo)記連接在 XML 版本標(biāo)記之后。實(shí)際上將頁面指令放在文檔中的什么位置并不重要,因?yàn)轫撁婢幾g器會將此指令添加到所生成的頁面 servlet 的 service() 方法的開頭,而不管它在頁面中處在什么位置。盡管這樣,為了具有較好的可讀性,您可能希望將它添加為第二行,如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?><%@ page contentType="text/xml;charset=ISO-8859-1" %><Flights> <AirCarrier>AA</AirCarrier> <FlightNumber>700</FlightNumber> <FlightSegment> ...
添加 Java 代碼
  現(xiàn)在剩下要做的事情就是添加 Java 代碼來定制 XML 的某些內(nèi)容。我們將 Java 代碼添加到文件中的 scriptlet 標(biāo)記 (<%...%>) 之間。頁面編譯器將把這兩個標(biāo)記之間的任何內(nèi)容解釋為純 Java 代碼,并不加修改地將它添加到所生成的頁面 servlet 的 service() 方法中。
  scriptlet 標(biāo)記內(nèi)的所有代碼都被按它們在 JSP 頁面出現(xiàn)的次序添加到 service() 方法中。添加的代碼的作用域是整個頁面,從而是整個 service() 方法。因此,假如您在文件開頭的一對 scriptlet 標(biāo)記之間定義一個變量,則以后您可以在文件中使用一對完全不同的 scriptlet 標(biāo)記引用這個變量。可以通過在變量定義兩側(cè)添加您自己的一對花括號 ({...}) 來強(qiáng)加一個作用域。這兩個花括號甚至可以在一對 scriptlet 標(biāo)記之間開始,而在另一對 scriptlet 標(biāo)記之間結(jié)束。
  在下面的示例中,我用一些使用 Calendar 類的 Java 代碼來替換原始 XML 文件中的幾個靜態(tài)日期。這段代碼在為幾個 XML 標(biāo)記創(chuàng)建適當(dāng)時間條目的同時,使用當(dāng)前日期,并添加時和分。Java 代碼用粗體表示。添加行號是為了便于以后引用。
1. <?xml version="1.0" encoding="ISO-8859-1"?>
2. <%@ page contentType="text/xml;charset=ISO-8859-1" %>
3. <% java.util.Calendar cal = java.util.Calendar.getInstance(); %>
4. <Flights>
5. <AirCarrier>AA</AirCarrier>
6. <FlightNumber>700</FlightNumber>
7. <FlightSegment>
8. <DepartingInfo>
9. <City>DFW</City>
10. <Date>30Mar</Date>
11. <Scheduled>
12. <% out.PRint(cal.getTime().toString()); %>
13. </Scheduled>
14. <Status>ON TIME</Status>
15. <% cal.add(java.util.Calendar.MINUTE, 10);
16. out.print("<Time>" + cal.getTime().toString() +
17. "</Time>"); %>
18. <Gate>C16</Gate>
19. <OffGateTime>0644A</OffGateTime>
20. <OffGroundTime>0632A</OffGroundTime>
21. </DepartingInfo>
22. <ArrivingInfo>
23. <City>LGA</City>
24. <Date>30Mar</Date>
25. <Scheduled>
26. <% cal.add(java.util.Calendar.HOUR_OF_DAY, 4);
27. out.print(cal.getTime().toString());
28. cal.add(java.util.Calendar.MINUTE, 2); %>
29. </Scheduled>
30. <Status>ON TIME</Status>
31. <Time><%= cal.getTime().toString() %></Time>
32. <Gate>D5</Gate>
33. <Baggage>B</Baggage>
34. <OnGroundTime>1043A</OnGroundTime>
35. </ArrivingInfo>
36. </FlightSegment>
37.</Flights>

下面是在這個代碼段中所進(jìn)行的操作:
  第 2 行:添加頁面指令來指明這個頁面 servlet 生成的響應(yīng)將包含 XML。
  第 3 行:定義類型為 Calendar 的變量 cal 來包含當(dāng)前日期和時間。
  第 12 行:使用全局 out 對象,我們可以直接顯示到正在作為響應(yīng)發(fā)送的頁面的當(dāng)前位置。我們將當(dāng)前的時間戳顯示到頁面上。請注重,當(dāng)生成響應(yīng)時,JSP scriptlet 標(biāo)記將被時間戳結(jié)果取代。
  第 15-17 行:在當(dāng)前時間上加上 10 分鐘,并將這個結(jié)果顯示到頁面上作為出發(fā)時間。
  第 26-28 行:在當(dāng)前時間上加上 4 個小時以得出航班的預(yù)定到達(dá)時間,然后使用 out 對象將這個結(jié)果顯示到頁面上。然后再加上 2 分鐘來創(chuàng)建實(shí)際到達(dá)時間。
  第 31 行:帶有 scriptlet 標(biāo)記的等號 (<%=...%>) 將導(dǎo)致將標(biāo)記內(nèi)所包含的任何結(jié)果顯示到頁面上。示例中的這一行等價于使用標(biāo)準(zhǔn) scriptlet 標(biāo)記的以下一行:
  <% out.print(cal.getTime().toString()); %>
  請注重,cal 對象對整個頁面都是全局的,盡管使用它的一對 scriptlet 標(biāo)記并不是定義它的同一對 scriptlet 標(biāo)記。如前所述,除非添加花括號 ({...}) 來強(qiáng)制使用作用域,否則變量聲明從聲明之處對于整個頁面都是全局的。
  同樣,本例中的 Java 代碼主要用來生成 XML 標(biāo)記之間的數(shù)據(jù)。我們還可以使用 Java 代碼生成一個 XML 文檔中的整個標(biāo)記樹。代碼除了顯示數(shù)據(jù)之外,還必須簡單地顯示出標(biāo)記。這正是第 15-17 行所完成的任務(wù)。
添加 JavaBeans 組件
  JSP 語法支持將 JavaBeans 組件添加到頁面中,并像訪問任何其他 Java 對象一樣訪問它們。專用的 <jsp:useBean> 標(biāo)記用來聲明和實(shí)例化 bean。頁面編譯器將使用 <jsp:useBean> 標(biāo)記的屬性來構(gòu)建頁面 servlet 中的 Java 代碼,這對于實(shí)例化 bean 以及將請求中的數(shù)據(jù)置入 bean 是必需的。
  因?yàn)?JavaBeans 組件通常必須執(zhí)行一項(xiàng)任務(wù),所以很輕易看出如何使用它們來執(zhí)行或干預(yù)復(fù)雜的業(yè)務(wù)邏輯,同時也從 JSP 頁面中移去復(fù)雜的 Java 代碼。一個示例是 Integration Object JavaBean 組件。這個 bean 是使用 IBM WebSphere Host Publisher 構(gòu)建的,它封裝了與舊有數(shù)據(jù)源(如 3270 應(yīng)用程序或數(shù)據(jù)庫)的交互,并只是返回它們的數(shù)據(jù)。設(shè)想使用一個 Integration Object,為了在我們示例中提供到達(dá)和出發(fā)信息,它與基于主機(jī)的航空調(diào)度應(yīng)用程序?qū)印W鳛?Integration Object 的一個用戶,您只須請求它的航線數(shù)據(jù),而不會察覺到在后臺發(fā)生的與主機(jī)應(yīng)用程序之間的復(fù)雜通信和交互。
  下面是為了使用這樣一個 bean 而重新編寫的示例。

1. <?xml version="1.0" encoding="ISO-8859-1"?>
2. <%@ page contentType="text/xml;charset=ISO-8859-1" %>
3. <jsp:useBean id="flightInfo" class="IntegrationObject.FlightInfo"/>
4. <% flightInfo.doHPTransaction(request, response); %>
5. <Flights>
6. <AirCarrier>AA</AirCarrier>
7. <FlightNumber>700</FlightNumber>
8. <FlightSegment>
9. <DepartingInfo>
10. <City>DFW</City>
11. <Date>30Mar</Date>
12. <Scheduled>
13. <% out.print(flightInfo.getScheduledDeparture()); %>
14. </Scheduled>
15. <Status>ON TIME</Status>
16. <% out.print("<Time>" + flightInfo.getActualDeparture() +
17. "</Time>"); %>
18. <Gate>C16</Gate>
19. <OffGateTime>0644A</OffGateTime>
20. <OffGroundTime>0632A</OffGroundTime>
21. </DepartingInfo>
22. <ArrivingInfo>
23. <City>LGA</City>
24. <Date>30Mar</Date>
25. <Scheduled><%= flightInfo.getScheduledArrival() %>
26. </Scheduled>
27. <Status>ON TIME</Status>
28. <Time><%= flightInfo.getActualArrival() %></Time>
29. <Gate>D5</Gate>
30. <Baggage>B</Baggage>
31. <OnGroundTime>1043A</OnGroundTime>
32. </ArrivingInfo>
33. </FlightSegment>
34.</Flights>
讓我們進(jìn)一步分析一下本例中進(jìn)行的操作。
  第 3 行包含 <jsp:useBean> 標(biāo)記,它將 bean IntegrationObject.FlightInfo 定義并實(shí)例化為 flightInfo。下一行包含一個 scriptlet,它調(diào)用 flightInfo 的 doHPTransaction() 方法,使它連接到主機(jī)航班信息應(yīng)用程序并檢索相關(guān)的航班信息。第 13、16、25 和 28 行只是將結(jié)果插入到 XML 文檔中。
  您可以按完全相同的方式使用其他類型的 bean,也許以調(diào)用 doHPTransaction() 之外的某個其他調(diào)用方法完成這一操作。您甚至可以在同一個文檔中添加多個 bean,并為來自多個數(shù)據(jù)源的數(shù)據(jù)創(chuàng)建一個復(fù)合的 XML 視圖。

小結(jié)

  JavaServer Pages 技術(shù)成為一個開放標(biāo)準(zhǔn)已經(jīng)幾年了,并已廣泛用于生成動態(tài) HTML 文檔。少數(shù)人已經(jīng)熟悉到將實(shí)際的 Java 代碼嵌在 HTML 文檔中所具有的同等靈活性也適用于生成 XML。請考慮這種可能性。通過只動態(tài)構(gòu)建那些變化的數(shù)據(jù),您就能夠改進(jìn)企業(yè)對企業(yè)的通信。您可以構(gòu)建來自一個數(shù)據(jù)源的數(shù)據(jù)的各種表示,不僅僅是 HTML 和 XML,還有用于無線協(xié)議的 WML 和 HDML,或者簡單使用類似 WebSphere Transcoding Publisher 這樣的產(chǎn)品將動態(tài) XML 轉(zhuǎn)換為適合設(shè)備的表示。
  XML 無疑已成為數(shù)據(jù)交換的通用格式。使用 JavaServer Pages 技術(shù)為以 XML 格式在 Web 上快速而輕易地發(fā)送數(shù)據(jù)提供了強(qiáng)有力的工具。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 望江县| 海城市| 温泉县| 长泰县| 久治县| 洛南县| 夏河县| 松原市| 佛教| 毕节市| 丽水市| 浪卡子县| 海兴县| 泰宁县| 睢宁县| 聂荣县| 辛集市| 堆龙德庆县| 临泽县| 浦东新区| 四会市| 仪陇县| 海口市| 仙居县| 博爱县| 图们市| 疏附县| 寿宁县| 南安市| 高淳县| 丹棱县| 竹山县| 耒阳市| 文昌市| 原平市| 五指山市| 科技| 抚州市| 铜鼓县| 祁阳县| 嘉兴市|