DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> JSTL 訪問SQL和XML內容
JSTL 訪問SQL和XML內容
編輯:XML詳解     

Web應用程序的標志是多個子系統的集成。SQL和XML是在這類子系統之間交換數據的兩種最通用的機制。在本文中,Mark Kolb介紹訪問JSP頁面數據庫和XML內容的sql和XML庫並對JSTL進行了總結。
  
  Web應用程序的模板式(stereotypical)架構分為三層:處理請求的Web服務器、實施業務邏輯的應用程序服務器以及管理永久性數據的數據庫。應用程序和數據庫層之間的聯接通常采用關系數據庫中的SQL調用格式。當業務邏輯被寫入到Java語言中時,JDBC用於實現這些調用。
  
  如果應用程序調用與其它服務器(本地或遠程)的集成,我們將需要用於在不同子系統之間交換數據的更深層次的機制。在Web應用程序內部和應用程序之間傳送數據采用的越來越普遍的一種方法是XML文件的交換。
  
  迄今為止,在我們的JSTL之旅中,我們討論了JSTL 表達式語言(eXPression language,EL)和core和fmt標記庫。在最後一部分,我們將考慮sql和XML庫--正如它們的名字表示的一樣 -- 提供定制標記來接入和管理從SQL數據庫和XML文件檢索到的數據。
  
  XML庫
  根據設計,XML提供靈活的方式來表示結構化數據,這些數據同時准備進行驗證,因此它尤其適應於在松散聯合的系統之間交換數據。這反過來使其成為Web應用程序極具吸引力的集成技術。
  
  與使用XML表示的數據進行交互的第一步是把數據作為一個XML文件,對其進行檢索並進行分解,以創建數據結構來接入該文件中的內容。在分解文件後,您可以有選擇的對其進行轉換以創建新的XML文件,您可以對新的XML文件進行相同的操作。最終,文件中的數據可以被提取,然後顯示或使用作為輸入數據來運行其它操作。
  
  這些步驟都在用於控制XML的JSTL標記中反映出。根據我們在第2部分探討核心中所討論的,我們使用core庫中的<c:import>標記來檢索XML文件。然後使用<x:parse>標記來分解該文件,支持標准的XML分解技術,如文件對象模式(Document Object Model,DOM)和簡單XML API(Simple API for XML,SAX)。<x:transform>標記可用於轉換XML文件並依賴標准技術來轉換XML數據:擴展樣式表語言(Extensible Stylesheet Language,XSL)。最後,我們提供多個標記來接入和控制分解後的XML數據,但是所有這一切都依賴於另一種標准-XML路徑語言(XML Path Language,XPath),以引用分解後的XML文件中的內容。

分解XML
  <x:parse>標記有多種格式,取決於用戶希望的分解類型。這一項操作最基本的格式使用以下語法:
  
  <x:parse XML="expression" var="name" scope="scope"
  filter="expression" systemId="expression"/>
  
  在這五種屬性中,只有xml屬性是需要的,其值應該是包含要分解的XML文件的字符串,或者是Java.io.Reader實例,通過它可以讀取要被分解的文件。此外,您可以使用以下語法,根據<x:parse>標記的主體內容來規定要被分解的文件:
  
  <x:parse var="name" scope="scope"
  filter="expression" systemId="expression">
   body content
  </x:parse>
  
  var和scope屬性規定存儲分解後的文件的scoped變量。然後XML庫中的其它標記可以使用這一變量來運行其它操作。注意,當var和 scope 屬性存在時,JSTL用於表示分解後的文件的數據結構類型以實施為導向,從而廠商可以對其進行優化。
  
  如果應用程序需要對JSTL提供的分解後的文件進行處理,它可以使用另一種格式的<x:parse>,它要求分解後的文件堅持使用一個標准接口。在這種情況下,該標記的語法如下:
  
  <x:parse XML="expression" varDom="name" scopeDom="scope"
  filter="expression" systemId="expression"/>
  
  當您使用<x:parse>的這一版本時,表示分解後的XML文件的對象必須使用org.w3c.dom.Document接口。當根據<x:parse>中的主體內容來規定XML文件時,您還可以使用varDom和scopeDom屬性來代替var 和 scope屬性,語法如下:
  
  <x:parse varDom="name" scopeDom="scope"
  filter="expression" systemId="expression">

   body content
  </x:parse>
其它兩個屬性filter 和 systemId 可以實現對分解流程的精確控制。filter 屬性規定org.xml.sax.XMLFilter類的一個實例,以在分解之前對文件進行過濾。如果要被分解的文件非常大,但目前的工作只需要處理一小部分內容時這一屬性尤其有用。systemId屬性表示要被分解的文件的URI並解析文件中出現的任何相關的路徑。當被分解的XML文件使用相關的URL來引用分解流程中需要接入的其它文件或資源時需要這種屬性
  
  清單1展示了<x:parse> 標記的使用,包括與 <c:import>的交互。此處<c:import> 標記用於檢索眾所周知的Slashdot Web 網站的RDF Site Summary (RSS)反饋,然後使用<x:parse>分解表示RSS 反饋的XML文件,表示分解後的文件的以實施為導向的數據結構被保存到名為rss的變量(帶有page 范圍)中。
  
  清單1:<x:parse>與<c:import>的交互
  
  <c:import var="rssFeed" url="http://slashdot.org/slashdot.rdf"/>
  <x:parse var="rss" XML="${rssFeed}"/>
  
  轉換XML
  XML通過XSL樣式表來轉換。JSTL使用<x:transform>標記來支持這一操作。與<x:parse>的情況一樣,<x:transform> 標記支持多種不同的格式。<x:transform> 最基本的格式的語法是:
  
  <x:transform XML="expression" xslt="expression"
  var="name" scope="scope"
  XMLSystemId="expression" xsltSystemId="expression">
   <x:param name="expression" value="expression"/>
   ...
  </x:transform>
  
  此處,XML 屬性規定要被轉換的文件,xslt 屬性規定定義這次轉換的樣式表。這兩種屬性是必要的,其它屬性為可選。
  
  與<x:parse>的xml屬性一樣,<x:transform>的xml 屬性值可以是包含XML文件的字符串,或者是接入這類文件的Reader。此外,它還可以采用 org.w3c.dom.Document 類或Javax.XML.transform.Source 類的實例格式。最後,它還可以是使用<x:parse> 操作的var或varDom屬性分配的變量值。
而且,您可以根據<x:transform> 操作的主體內容來包含要被轉換的XML文件。在這種情況下,<x:transform> 的語法是:
  
  <x:transform xslt="expression"
  var="name" scope="scope"
  XMLSystemId="expression" xsltSystemId="expression">
   body content
   <x:param name="expression" value="expression"/>
   ...
  </x:transform>
  
  在這兩種情況下,規定XSL 樣式表的xslt 屬性應是字符串、Reader或Javax.XML.transform.Source實例。
  
  如果var 屬性存在,轉換後的XML文件將分配給相應的scoped變量,作為org.w3c.dom.Document 類的一個實例。通常,scope屬性規定這類變量分配的范圍。
  
  <x:transform> 標記還支持將轉換結果存儲到Javax.XML.transform.Result 類的一個實例中,而不是作為org.w3c.dom.Document的一個實例。如果var 和 scope 屬性被省略,result對象規定作為result屬性的值,<x:transform>標記將使用該對象來保存應用該樣式表的結果。清單2中介紹了使用<x:transform> 的result屬性的這兩種語法的變化:
  
  清單2:使用result屬性來提供Javax.XML.transform.Result實例時,<x:transform>操作的語法變化
  
  <x:transform XML="expression" xslt="expression"
  result="expression"
  XMLSystemId="expression" xsltSystemId="expression">
   <x:param name="expression" value="expression"/>
   ...
  </x:transform>
  
  <x:transform xslt="expression"
  result="expression"
XMLSystemId="expression" xsltSystemId="expression">
   body content
   <x:param name="expression" value="expression"/>
   ...
  </x:transform>
  
  無論您采用這兩種<x:transform>格式中的那一種,您都必須從定制標記單獨創建Javax.XML.transform.Result對象。該對象自身作為result屬性的值提供。
  
  如果既不存在var 屬性,也不存在result屬性,轉換的結果將簡單地插入到JSP頁面,作為處理<x:transform> 操作的結果。當樣式表用於將數據從XML轉換成Html時尤其有用,如清單3所示:

  
  清單3:在JSP頁面直接顯示轉換的XML數據
  
  <c:import var="rssFeed" url="http://slashdot.org/slashdot.rdf"/>
  <c:import var="rssToHtml" url="/WEB-INF/xslt/rss2Html.xsl"/>
  <x:transform XML="${rssFeed}" xslt="${rssToHtml}"/>
  
  在本例中,使用 <c:import> 標記來讀取RSS反饋和適當的樣式表。樣式表的輸出結果是Html,通過忽略<x:transform>的var和result 屬性來直接顯示。圖1顯示了實例結果:
  
   圖1:清單3的輸出結果
    JSTL 訪問SQL和XML內容圖片1
  與<x:parse>的systemId 屬性一樣,<x:transform>的xmlSystemId 和 xsltSystemId 屬性用於解析XML文件中相關的路徑。在這種情況下,xmlSystemId 屬性應用於根據標記的 XML屬性值提供的文件,而xsltSystemId 屬性用於解析根

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved