快速表列資料-資料系結(jié)
在上一期的文章中我們介紹了使用ADO從資料庫取出資料轉(zhuǎn)換成為XML,并利用XSL技術(shù)將之展現(xiàn)在網(wǎng)頁上。漸漸地整合各種XML應用技術(shù),在這一期將介紹透過資料系結(jié)技術(shù),輕松快速地表列資料。
談到資料系結(jié),它到底有什么好處呢?首先第一點它使用上直覺、簡單,第二點它不需撰寫大量的程式即可達到資料展現(xiàn)的目的,第三點它維護輕松、容易修改,主要是因為資料與展現(xiàn)的HTML標簽分離。接下來就這三點來討論資料系結(jié)如何應用吧!資料系結(jié)
首先如果要使用資料系結(jié)技術(shù)來展現(xiàn)資料,必須要在網(wǎng)頁中建立XML的資料來源物件(Data Source Object),文中簡稱DSO,建立DSO的方式有兩種,第一種是使用Java Applet連結(jié)到一份Books.xml檔案資料,范例如下:
< HTML >
< HEAD >
< APPLET CODE="com.ms.xml.dso.XMLDSO.class"
id="xmldso" width=0 height=0 >
< PARAM NAME="URL" VALUE="Books.xml" >
< /APPLET >
< /HEAD >
< BODY >< /BODY >
< /HTML >
JavaApplet.htm
第二種方式是建立XML DataIsland(XML資料島),范例如下:
< HTML >
< HEAD >
< xml id="xmldso" src="Books.xml" >< /xml >
< /HEAD >
< BODY >< /BODY >
< /HTML >
XMLDataIsland1.htm
或者直接將XML資料崁入DataIsland中,范例如下:
< HTML >
< HEAD >
< xml id="xmldso" >
< ?xml version="1.0"? >
< booklist >
< book >
< title >The Gourmet Microwave< /title >
< isbn >72-80081-082< /isbn >
< publisher >New Moon Books< /publisher >
< price >9.95< /price >
< details >Details.asp?isbn=72-80081-082< /details >
< author >Charlotte M. Cooper< /author >
< author >Shelley B. Burke< /author >
< author >Regina P. Murphy< /author >
< /book >
< /booklist >
< /xml >
< /HEAD >
< BODY >< /BODY >
< /HTML >
XMLDataIsland2.htm
這兩種方式都能建立DSO,不過第二種方式,也就是XML DataIsland的語法只有在IE5以后的版本才有支援,在這邊預設(shè)讀者都有IE5可以測試。建立好DSO,先看一下DSO里面的資料,也就是連結(jié)到的XML檔案Books.xml,如下列檔案內(nèi)容:
< ?xml version="1.0"? >
< booklist >
< book >
< title >The Gourmet Microwave< /title >
< isbn >72-80081-082< /isbn >
< publisher >New Moon Books< /publisher >
< price >9.95< /price >
< details >Details.asp?isbn=72-80081-082< /details >
< author >Charlotte M. Cooper< /author >
< author >Shelley B. Burke< /author >
< author >Regina P. Murphy< /author >
< /book >
< book >
< title >Sushi, Anyone?< /title >
< isbn >72-80081-024< /isbn >
< publisher >New Moon Books< /publisher >
< price >14.99< /price >
< details >Details.asp?isbn=72-80081-024< /details >
< author >Charlotte M. Cooper< /author >
< author >Yoshi Nagase< /author >
< /book >
< book >
< title >The Busy Executive‘‘s Database Guide< /title >
< isbn >9-001-122-12< /isbn >
< publisher >Binnet and Hardley< /publisher >
< price >19.95< /price >
< details >Details.asp?isbn=9-001-122-12< /details >
< author >Mayumi Ohno< /author >
< /book >
< book >
< title >Cooking With Computers: Surreptitous Balance Sheet< /title >
< isbn >9-001-122-90< /isbn >
< publisher >Binnet and Hardley< /publisher >
< price >11.95< /price >
< details >Details.asp?isbn=9-001-122-90< /details >
< author >Mayumi Ohno< /author >
< author >Ian H. Devling< /author >
< author >Peter Wilson II< /author >
< author >Lars Peterson< /author >
< /book >
< book >
< title >Straight Talk About Computers< /title >
< isbn >9-001-122-01< /isbn >
< publisher >Binnet and Hardley< /publisher >
< price >19.99< /price >
< details >Details.asp?isbn=9-001-122-01< /details >
< author >Lars Peterson< /author >
< /book >
< /booklist >
XML檔案中包含五本書,每本書都有一個以上的作者。接下來要如何讓HTML標簽來展現(xiàn)資料呢?其實很簡單,例如下面的范例,僅僅在標簽內(nèi)加上兩個屬性設(shè)定(datasrc與datafld),第一筆資料就能夠系結(jié)在標簽內(nèi)了:
< HTML >
< HEAD >
< xml id="xmldso" src="Books.xml" > < /xml >
< /HEAD >
< BODY > 書號:< span datasrc="#xmldso" datafld="isbn" >< /span >< br >
書名:< TEXTAREA rows=2 cols=20 id=textarea1 name=textarea1 datasrc="#xmldso" datafld="title" >< /TEXTAREA >< br >
出版商:< INPUT type="button" value="Button" id=button1 name=button1 datasrc="#xmldso" datafld="publisher" >< br >
價格:< INPUT type="text" id=text1 name=text1 datasrc="#xmldso" datafld="price" >
< /BODY >
< /HTML >
DataIsland3.htm
結(jié)果圖如下:
原來datasrc屬性就是指定DSO,而datafld就是指定欄位,并且個別用不同的標簽來展現(xiàn),讀者就會發(fā)現(xiàn)資料系結(jié)的彈性以及方便了。例如價格欄位資料會系結(jié)到TextBox的Value屬性,所以結(jié)果可以看到資料便展現(xiàn)在TextBox里面。
但是有一點必須要注意,并不是所有的HTML標簽都支援這兩個屬性,在以下的表格中列出支援的HTML標簽以及資料系結(jié)后所對應的標簽屬性:
HTML標簽 資料系結(jié)標簽屬性
A href
APPLET property value via PARAM
BUTTON innerText, innerHTML
DIV innerText, innerHTML
FRAME src
IFRAME src
IMG src
INPUT TYPE=BUTTON innerText, innerHTML
INPUT TYPE=CHECKBOX checked
INPUT TYPE=HIDDEN value
INPUT TYPE=PASSWORD value
INPUT TYPE=RADIO checked
INPUT TYPE=TEXT value
LABEL innerText, innerHTML
LEGEND innerText, innerHTML
MARQUEE innerText, innerHTML
SELECT obj.options(obj.selectedIndex).text
SPAN innerText, innerHTML
TEXTAREA value
如上表span標簽在設(shè)定完datasrc及dtafld之后,資料會存放在標簽的innerText或innerHTML屬性中,這代表資料能夠以TEXT純文字展現(xiàn)或以HTML展現(xiàn)。資料系結(jié)之后預設(shè)使以純文字展現(xiàn),也就是存放在innerText屬性,例如改寫B(tài)ooks.xml的第一筆資料的isbn欄位如下:
< book >
< title >The Gourmet Microwave< /title >
< isbn > < B < 72-80081-082 < /B < ;< /isbn >
< publisher >New Moon Books< /publisher >
< price >9.95< /price >
< details >Details.asp?isbn=72-80081-082< /details >
< author >Charlotte M. Cooper< /author >
< author >Shelley B. Burke< /author >
< author >Regina P. Murphy< /author >
< /book >
其中‘<’代表‘< ’符號,‘&glt;’代表‘ >’符號,主要是因為XML資料中大于和小于符號是保留字,所以必須以其他方式表現(xiàn),此時再度執(zhí)行DataIsland3.htm會得到以下結(jié)果:但是這不是想要的結(jié)果,主要的目的是希望書號欄位資料以粗體展現(xiàn),此時必須配合另一個HTML屬性,也就是修改DataIsland3.htm的span標簽,再加上一個屬性dataformatas設(shè)定為HTML。此時資料系結(jié)后,資料便會存放在span標簽的innerHTML屬性,也就是以HTML方式展現(xiàn),如下程式碼及結(jié)果:
書號:< span datasrc="#xmldso" datafld="isbn" dataformatas="HTML" >< /span >< br >
瀏覽資料
到目前為止,雖然資料系結(jié)很方便看到所需的資料,但是都只能看到第一筆,所以應該要有瀏覽的機制,也就是加上可以切換上下筆的功能。首先在頁面上放進四顆按鈕并給定按鈕文字內(nèi)容,然后加上被點選后所執(zhí)行的程式如下:
< HTML >
< HEAD >
< META name=VI60_defaultClientscript content=VBscript >
< META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0" >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< script ID=clientEventHandlersVBS LANGUAGE=vbscript >
< !--Sub button2_onclick xmldso.recordset.movefirst
End SubSub button3_onclick xmldso.recordset.moveprevious
if xmldso.recordset.bof then
xmldso.recordset.movefirst
end if
End SubSub button4_onclick xmldso.recordset.movenext
if xmldso.recordset.eof then
xmldso.recordset.movelast
end if
End SubSub button5_onclick xmldso.recordset.movelast
End Sub-- >
< /script >
< /HEAD >
< BODY >書號:< span datasrc="#xmldso" datafld="isbn" dataformatas=HTML >< /span >< br >
書名:< TEXTAREA rows=2 cols=20 id=textarea1 name=textarea1 datasrc="#xmldso" datafld="title" >< /TEXTAREA >< br >
出版商:< INPUT type="button" value="Button" id=button1 name=button1 datasrc="#xmldso" datafld="publisher" >< br >
價格:< INPUT type="text" id=text1 name=text1 datasrc="#xmldso" datafld="price" >< br >< INPUT type="button" value="第一筆" id=button2 name=button2 >
< INPUT type="button" value="上一筆" id=button3 name=button3 >
< INPUT type="button" value="下一筆" id=button4 name=button4 >
< INPUT type="button" value="最后一筆" id=button5 name=button5 >< /BODY >
< /HTML >
DataIsland3.htm
上面的程式中會將XML資料模擬成RecordSet,此時就可以透過RecordSet的Method來瀏覽資料。不過如果想要同時瀏覽多筆資料又該如何?這時可以使用Table標簽來做資料系結(jié),如以下方式:
< HTML >
< HEAD >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< /HEAD >
< BODY >< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso >
< THead >
< TD >書號< /TD >< TD >書名< /TD >< TD >價格< /TD >< TD >作者< /TD >
< /THead >
< TR >
< TD >< span datafld=isbn >< /span >< /TD >
< TD >< span datafld=title >< /span >< /TD >
< TD >< span datafld=price >< /span >< /TD >
< TD >< span datafld=author >< /span >< /TD >
< /TR >
< /TABLE >< /BODY >
< /HTML >
結(jié)果如下:
但是由于每一筆資料有多個作者欄位資料,所以資料系結(jié)的方式必須稍作修改,以槽狀結(jié)構(gòu)來系結(jié)資料:
< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso >
< THead >
< TD >書號< /TD >< TD >書名< /TD >< TD >價格< /TD >< TD >作者< /TD >
< /THead >
< TR >
< TD >< span datafld=isbn >< /span >< /TD >
< TD >< span datafld=title >< /span >< /TD >
< TD >< span datafld=price >< /span >< /TD >
< TD >
< table datasrc=#xmldso datafld=author >
< tr >< td >< span datafld="$Text" >< /span >< /td >< /tr >
< /table >
< /TD >
< /TR >
< /TABLE >
結(jié)果如下:
既然能夠瀏覽多筆資料,最好能加上換頁功能,而做法只要再配合兩個屬性-Table標簽的id及datapagesize屬性,以及簡短的程式就可以達成,范例如下:
< HTML >
< HEAD >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< script ID=clientEventHandlersVBS LANGUAGE=vbscript >
< !--Sub button1_onclick
Table1.previousPage
End SubSub button2_onclick Table1.nextPage
End Sub-- >
< /script >
< /HEAD >
< BODY >< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso id=Table1 datapagesize=2 >
< THead >
< TD >書號< /TD >< TD >書名< /TD >< TD >價格< /TD >< TD >作者< /TD >
< /THead >
< TR >
< TD >< span datafld=isbn >< /span >< /TD >
< TD >< span datafld=title >< /span >< /TD >
< TD >< span datafld=price >< /span >< /TD >
< TD >
< table datasrc=#xmldso datafld=author >
< tr >< td >< span datafld="$Text" >< /span >< /td >< /tr >
< /table >
< /TD >
< /TR >
< /TABLE >< INPUT type="button" value="上一頁" id=button1 name=button1 >
< INPUT type="button" value="下一頁" id=button2 name=button2 >< /BODY >
< /HTML >
DataIsland4.htm
結(jié)果如下:資料系結(jié)小技巧
對于資料系結(jié)也有許多小技巧,例如提供超連結(jié)、跑馬燈的效果或者TextBox系結(jié)提供編修資料的功能,范例如下:
< HTML >
< HEAD >
< TITLE >< /TITLE >
< xml id="xmldso" src="Books.xml" >< /xml >
< /HEAD >
< BODY >< TABLE WIDTH=100% BORDER=1 datasrc=#xmldso id=Table1 datapagesize=2 >
< THead >
< TD >書號< /TD >< TD >書名< /TD >
< TD >價格< /TD >< TD >出版商< /TD >
< TD >作者< /TD >
< /THead >
< TR >
< TD > < span datafld=isbn dataformatas=HTML >< /span > < /TD >
< TD > < a datafld=details >< span datafld=title >< /span >< /a >< < /TD >
< TD > < MARQUEE datafld=price >< /MARQUEE > < /TD >
< TD > < INPUT type="text" id=text1 name=text1 datafld=publisher > < /TD >
< TD >
< table datasrc=#xmldso datafld=author >
< tr >< td >
< font color=red > < span datafld="$Text" >< /span > < /font >
< /td >< /tr >
< /table >
< /TD >
< /TR >
< /TABLE >< /BODY >
< /HTML >
DataIsland4.htm
結(jié)果如下:
結(jié) 論
看過了以上幾個范例,讀者會真正了解本文第一段所談到資料系結(jié)的好處,使用上極為簡單易用。不過應用方式及小技巧不少,如果能妥善運用,對于資料的展現(xiàn)以及維護都會比使用ASP.NET和HTML標簽混雜的程式容易許多。
雖然展現(xiàn)快速容易,但是仍然有不足的地方,也就是彈性較小。如果想要做到更復雜的功能則就很困難,例如想要根據(jù)欄位內(nèi)容來做排序,這就要另外結(jié)合XSL技術(shù)或ASP.NET技術(shù)重新查詢資料庫。如果不需要復雜的功能,上面的這些范例就能夠解決掉大部分只需簡單展現(xiàn)的頁面。
在下一期的文章中會再結(jié)合XML的魔法師XML DOM(XML Document Object Model),完全整合這四期文章的技術(shù),讓XML充滿無限的變化。