《XML案例教程》課件第10章_第1頁
《XML案例教程》課件第10章_第2頁
《XML案例教程》課件第10章_第3頁
《XML案例教程》課件第10章_第4頁
《XML案例教程》課件第10章_第5頁
已閱讀5頁,還剩128頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第10章綜合應用實例——圖書管理系統10.1項目功能概述10.2數據庫設計10.3架構設計10.4Web表現層設計10.5業務邏輯層設計10.6代碼實現10.7本章小結習題10

10.1項目功能概述

本章綜合運用前面各章所介紹的知識設計一個圖書管理系統。圖書館的信息化管理從最初對業務管理實行信息化管理發展到對圖書館各個業務流程進行系統化和網絡化管理,并建立大規模的以個體文獻目錄聯機查詢為主的資源共享系統。本章僅介紹與讀者和圖書相關的一些基本功能及其設計實現。一個圖書管理系統包含管理員模塊和讀者模塊。管理員模塊負責維護讀者信息、圖書信息和圖書流通信息。其中,讀者信息管理主要供管理員錄入和修改讀者檔案以及維護讀者的借書證狀態;圖書信息管理主要維護圖書檔案的錄入、修改以及設置圖書狀態;圖書流通管理主要維護圖書的借閱與歸還。讀者模塊供讀者使用,讀者可以查詢自己的個人信息、圖書信息及圖書借閱信息,并能在規定的續借次數內進行圖書續借。

根據以上的分析可以設計出圖書管理系統的主要功能模塊圖,如圖10-1所示。圖10-1圖書管理系統功能模塊劃分

10.2數?據?庫?設?計

一個圖書管理系統中包含多張表,分別存儲相應子功能的數據,其中“讀者信息”表和“圖書信息”表是關鍵表,用于存儲讀者信息和圖書信息。圖書管理系統實際上就是對讀者信息和圖書信息進行管理。圖書管理系統中與讀者和圖書最相關的兩個流程是圖書借閱流程和圖書歸還流程。10.2.1圖書管理系統E-R圖

圖書管理系統中關鍵實體的E-R圖如圖10-2所示。圖10-2圖書管理系統E-R圖10.2.2圖書管理系統中的相關表

1.圖書信息表

圖書信息表books存儲圖書的主要信息,如表10-1所示。表10-1圖書信息表books

2.讀者信息表

讀者信息表users存儲讀者的主要信息,如表10-2所示。表10-2讀者信息表users

3.圖書借閱表

圖書借閱表bookborrow記錄讀者借閱圖書的信息,如表10-3所示。表10-3圖書借閱表bookborrow

4.圖書歸還表

圖書歸還表bookreturn記錄讀者還書的信息,如表10-4所示。表10-4圖書歸還表bookreturn

10.3架構設計

本節討論圖書管理系統的系統流程和軟件的架構模型。

10.3.1系統流程

圖書管理系統的系統流程如圖10-3所示。管理員可以直接管理讀者信息和圖書信息,并通過讀者和圖書之間的借閱關系管理圖書的流通過程。圖10-3系統流程圖10.3.2架構模型

圖書管理系統采用構建于B/S模式上的三層體系結構來實現。第一層為Web表現,第二層為業務邏輯層,第三層為數據資源層。Web表現層使用JavaScript腳本、HTML語言、樣式轉換語言XSLT和層疊樣式語言CSS構建系統各功能頁面,用戶通過操作功能界面實現和底層的數據交互。業務邏輯層是Web表現層和數據資源層的中間橋梁,負責接收表現層遞交過來的數據,并對數據依據業務需求進行邏輯處理,將處理后的結果遞交給下一層次處理。數據資源層是后臺的數據庫,負責接收并存儲邏輯層遞交來的數據。

Web服務器使用微軟的IIS構建,業務邏輯層運行于Web服務器上。為達到較好的用戶體驗和較高的數據傳輸效率,客戶端和服務器采用異步數據交互方式(即AJAX技術)??蛻舳讼蚍掌靼l送HTTP請求,服務器以XML文檔形式響應客戶端請求,請求與響應的過程異步進行。客戶端取得XML數據后,使用JavaScript、HTML和CSS重新構建局部頁面,而不刷新整個頁面,或使用客戶端的XSL文檔對象轉換XML數據,局部更新頁面。

10.4Web表現層設計

本節設計圖書管理系統的主要功能頁面。

10.4.1讀者信息管理

讀者信息管理的Web表現層頁面由讀者信息添加頁面、讀者信息查詢和更新頁面組成,如圖10-4和圖10-5所示。圖10-4所示的讀者信息添加頁面負責將讀者在頁面上輸入的讀者信息添加到數據庫。頁面的上部為功能操作區,功能操作區的下面是信息錄入區。在圖10-5所示的讀者信息查詢和更新頁面中的上半部分輸入讀者借書證號,單擊“查詢”按鈕,讀者信息將出現在下半部分的信息顯示區,可以修改顯示區的信息,修改完畢,單擊“更新”按鈕將修改后的數據保存到數據庫。圖10-4添加讀者信息頁面圖10-5查詢和更新讀者信息頁面10.4.2圖書信息管理

圖書信息維護頁面由圖10-6所示的添加圖書信息和圖10-7所示的查詢和更新圖書信息兩個頁面組成。頁面功能區劃分與讀者信息管理的頁面劃分類似。頁面的頂部為功能操作區,可以查詢、添加、更新圖書信息;頁面的下半部分為圖書信息的編輯區,可以添加圖書信息和修改圖書信息。圖10-6添加圖書信息頁面圖10-7查詢和更新圖書信息頁面10.4.3借書管理

圖書借閱管理頁面如圖10-8所示。頁面分為上、下兩個部分。上半部分左邊為讀者借書信息的統計區,上半部分右邊為待借圖書的簡要信息顯示區。下半部分的空白區為讀者已借圖書信息的顯示區。圖10-8圖書借閱頁面10.4.4還書管理

圖書歸還管理頁面如圖10-9所示。頁面分為上、下兩個部分。上半部分為功能區和待還圖書信息顯示區,包括待還圖書信息查詢和還書操作,以及依據讀者借書證號查詢讀者應還圖書信息。下半部分的空白區顯示讀者應還圖書。圖10-9圖書歸還頁面10.4.5圖書查詢

圖書信息查詢頁面如圖10-10所示。頁面分為上、下兩個區域。上半區域為功能區域,可以依據檢索類型和檢索模式查詢圖書,查詢的結果顯示在頁面下半部分的空白區。圖10-10圖書信息查詢頁面10.4.6圖書續借

圖書續借頁面如圖10-11所示,其劃分模式與圖書信息查詢頁面的劃分模式類似。上半部分為功能輸入區,讀者輸入借書證號和密碼登錄系統,讀者應還圖書信息將顯示在頁面下半部分的空白區。針對具體的圖書狀態,可以進行續借操作。圖10-11圖書續借頁面

10.5業務邏輯層設計

本章中的圖書管理系統是一個簡單的圖書管理系統。信息維護在設計時主要考慮讀者信息維護和圖書信息維護。流通管理在設計時僅考慮了圖書管理中最主要的模塊“圖書借閱模塊”、“圖書歸還模塊”和“圖書續借模塊”的設計。讀者信息維護和圖書信息維護模塊業務流程相對簡單,流通管理涉及到的業務流程相對復雜,本節將對流通管理的三個主要模塊的業務流程進行分析。10.5.1圖書借閱

圖書借閱模塊主要管理讀者借閱圖書的過程以及記錄讀者借閱圖書的信息。圖書借閱的業務流程描述如下:

(1)輸入借書證號,判斷借書證是否掛失。若借書證掛失,則流程結束;若借書證未掛失,則顯示讀者已借圖書信息和讀者借書統計信息。

(2)輸入圖書代碼,顯示待借圖書簡要信息,執行圖書“借出”操作。如果讀者“未還圖書數量”大于“借書上限”,或者超期圖書數量大于0,或者圖書狀態為“借出”或“掛失”,則禁止執行圖書“借出”操作;否則允許操作。

(3)“借出”操作執行下列事務:向圖書借閱表中添加借閱記錄,修改圖書信息表中圖書狀態為“借出”,并將圖書累計借出次數加1。

(4)“借出”事務執行完畢,借書流程結束。

圖書借閱流程如圖10-12所示。圖10-12圖書借閱業務流程10.5.2圖書歸還

圖書歸還模塊主要負責記錄讀者還書記錄,并修改圖書是否歸還的狀態,以便歸還的圖書可以進入流通領域的下一次借閱過程。圖書歸還的業務流程描述如下:

(1)輸入借書證號可以顯示讀者所有應還圖書信息。輸入圖書代碼顯示與該代碼相對應的圖書信息,并顯示讀者信息和讀者圖書借閱信息。

(2)通過下列事務執行“還書”操作:在圖書歸還表中添加一條讀者還書記錄,修改圖書借閱表中圖書狀態為“已還”,修改圖書信息表中圖書狀態為“可借”。

(3)歸還事務執行完畢,還書流程結束。

圖書歸還流程如圖10-13所示。圖10-13圖書歸還業務流程10.5.3圖書續借

當讀者借閱的圖書沒有過期,并且續借次數沒有超過規定的續借次數時,可以在網上對圖書直接進行續借,而不必去圖書館辦理續借手續。圖書續借流程描述如下:

(1)讀者輸入借書證號和密碼,顯示讀者應還圖書信息。執行圖書續借操作,如果當前日期大于圖書借閱表中應還日期(即超期),或者借閱次數超過規定次數,則禁止圖書續借

操作。

(2)如果圖書續借操作滿足操作條件,則執行如下的續借事務:圖書續借表中的借閱次數加1,圖書歸還表中應還日期加設定的天數(如允許續借30天)。

(3)圖書續借事務執行完畢,續借流程結束。

圖書續借流程如圖10-14所示。圖10-14圖書續借業務流程

10.6代碼實現

本節主要討論圖書管理系統客戶端和服務器端的代碼實現,并給出主要代碼的分析。

10.6.1XML文檔結構設計

客戶端與服務器端的數據交互以XML文檔形式進行,為方便客戶端和服務器端的處理,對客戶端發送的XML文檔結構和服務返回的XML文檔結構做了約定。

1.客戶端發送的XML結構

客戶端的XML文檔為一層結構,根元素名稱約定為<root>,除最后一個子元素命名為<flag>外,其余子元素以數據庫字段命名。<flag>元素封裝了數據的處理標識位,以數字字符作為標識位:“1”表示查詢數據庫數據記錄,“2”表示向數據庫添加數據記錄,“3”表示修改數據庫數據記錄,“4”表示刪除數據庫記錄。

案例說明:本案例演示查詢讀者借書證號為“102800401”的未還圖書記錄,客戶端的XML文檔可以描述為如下的結構。01<?xmlversion='1.0'encoding='utf-8'?>

02<root>

03<userNum><![CDATA[102800401]]></userNum>

04<flag><![CDATA[1]]></flag>

05</root>案例分析:第03行使用描述借書證號的數據字段“userNum”作為XML元素的名稱封裝讀者的借書證號“102800401”,第04行封裝了后臺數據的操作要求,查詢數據庫。為減少出錯,所有數據均使用字符數據段封裝。

2.服務器端返回的XML文檔結構

當查詢的結果集需返回給客戶端時,約定服務器端的XML文檔結構為兩層結構。根元素為<root>,第二層子元素為<row>,第三層子元素以數據庫字段封裝字段對應的內容。

案例說明:本案例演示服務器端返回借書證號為“102800401”的讀者未還圖書的XML文檔。01<?xmlversion='1.0'encoding='utf-8'?>

02<root>

03<row>

04<bookNum><![CDATA[10539402]]></bookNum>

05<callNum><![CDATA[TP393.092/1460]]></callNum>

06<bookname><![CDATA[精通ASP.NET2.0的Web2.0應用]]></bookname>07<author><![CDATA[鄭耀東編著]]></author>

08<borrowDate><![CDATA[2008-2-3]]></borrowDate>

09<limitDate><![CDATA[2008-5-3]]></limitDate>

10</row>

11<row>

12<bookNum><![CDATA[10526798]]></bookNum>

13<callNum><![CDATA[TP312/3548]]></callNum>14<bookname><![CDATA[XML實踐教程]]></bookname>

15<author><![CDATA[張銀鶴,張秋香,孫膺等編著]]></author>

16<borrowDate><![CDATA[2008-5-4]]></borrowDate>

17<limitDate><![CDATA[2008-8-4]]></limitDate>

18</row>

19</root>案例分析:底層元素名稱為數據庫字段——bookNum(借書證號)、callNum(索書號)、bookname(書名)、author(作者)、borrowDate(借閱日期)、limitDate(應還日期)。

從數據庫獲取數據構造服務器端的XML文檔可以通過使用如下案例中的公共模塊來實現。

案例說明:本案例演示依據記錄集構造XML文檔的公共模塊?!皉s”為服務器端查詢數據庫返回的記錄集。模塊名稱:makeXML

01functionmakeXML(rs)

02{//根據數據庫查詢的記錄集構造XML文檔

03varxmlstr="";

04while(!rs.EOF)

05{

06xmlstr=xmlstr+"<row>";

07for(vari=0;i<rs.fields.count;i++)

08{09varfld=rs.fields;//獲取記錄集中字段對象

10xmlstr=xmlstr+"<"+fld(i).name+">

<![CDATA["+fld(i).value+"]]></"+fld(i).name+">";

11}

12xmlstr=xmlstr+"</row>";

13rs.MoveNext();14}

15xmlstr="<?xmlversion='1.0'encoding='utf-8'?><root>"+xmlstr+"</root>";

16returnxmlstr;

17}案例分析:第07行至第11行構造最底層的元素字段,該元素字段封裝了數據。第06行和第12行構造第二層的元素<row>。第15行構造XML聲明和根元素<root>。10.6.2數據資源層的代碼實現

數據資源層的代碼負責與數據庫的交互,根據客戶端的請求對數據庫進行操作,通過以下幾個功能模塊來實現。

1.創建數據庫連接

案例說明:本模塊負責創建數據庫連接,數據庫連接成功,返回連接對象供使用,否則返回空值。模塊名稱:open_db

01functionopen_db()

02{

03try{

04varconn=Server.CreateObject("ADODB.Connection");

05conn.Open("driver={SQLServer};database=Books_DB;server=localhost;uid=sa;pwd=");

06returnconn;

07}

08catch(e){returnnull;}

09}

2.查詢數據庫并返回記錄集

案例說明:本模塊負責查詢數據庫,并返回記錄集。參數“sql”為查詢數據庫的select語句,由業務邏輯層構造。模塊名稱:return_rs

01functionreturn_rs(sql)

02{

03varrs=null;

04varconn=open_db(); //創建數據庫連接

05if(conn!=null)

06{

07try{08varcmd=Server.CreateObject("ADODB.Command");

09cmd.ActiveConnection=conn;

10cmd.CommandText=sql;

11rs=cmd.Execute(); //執行查詢操作,并返回記錄集

12}

13catch(e){rs=null;} //異常返回空記錄集

14}

15returnrs;

16}

3.操作數據庫不返回記錄集

案例說明:本模塊依據insert、update、delete語句操作數據庫,不返回記錄集,返回是否成功的bool值。模塊名稱:return_bool

01functionreturn_bool(sql)

02{

03varret=false;

04varconn=open_db();

05if(conn!=null)

06{

07try{

08varcmd=Server.CreateObject("ADODB.Command");

09cmd.ActiveConnection=conn;10cmd.CommandText=sql;

11cmd.Execute();

12ret=true;//操作成功返回true

13}

14catch(e){ret=false;}//操作失敗返回false

15}

16returnret;

17}

4.多表關聯操作的事務處理

案例說明:本模塊演示多表聯動操作的事務處理。array_sqlString為包含多條sql語句序列的數組。模塊名稱:return_trans

01functionreturn_trans(array_sqlString)

02{

03varresult=false;

04varconn=open_db();//創建數據庫連接

05if(conn!=null)

06{

07try{

08conn.BeginTrans; //事務開始

09for(iinarray_sqlString){

10conn.execute(array_sqlString[i]);//執行sql語句11}

12conn.CommitTrans; //執行事務提交

13result=true;

14}

15catch(e){

16conn.RollbackTrans; //出錯回滾

17result=false;

18}

19}

20returnresult;

21}案例分析:當進行借書和還書操作時涉及多個表的關聯操作,為確保多表的操作不出錯,需進行事務處理。當所有操作成功時,操作才能完成;只要有一個操作失敗,所有操作便都要取消。10.6.3客戶端與服務器異步數據傳輸邏輯

客戶端與服務器端數據傳輸采用異步方式進行,客戶端以post方式向服務器端發送數據。

案例說明:本案例演示客戶端向服務器端以post方式發送異步請求。模塊名稱:send_request_post

01functionsend_request_post(url,str){//初始化、指定處理函數、發送請求的函數

02//開始初始化XMLHttpRequest對象

03if(window.XMLHttpRequest){//Mozilla瀏覽器

04try{

05http_request=newXMLHttpRequest();

06if(http_request.overrideMimeType){//設置Mime類別07http_request.overrideMimeType("text/xml");

08}

09}catch(e){http_request=false;}

10}

11elseif(window.ActiveXObject){//IE瀏覽器

12try{

13http_request=newActiveXObject("Msxml2.XMLHTTP");

14}catch(e){

15try{16http_request=newActiveXObject("Microsoft.XMLHTTP");

17}catch(e){http_request=false;}

18}

19}

20if(!http_request){//異常,創建對象實例失敗

21window.alert("不能創建XMLHttpRequest對象實例.");

22returnfalse;

23}24http_request.onreadystatechange=processRequest;

//響應函數

25//確定發送請求的方式和url以及是否同步執行下段代碼

26http_request.open("Post",url,true);

27http_request.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");

28http_request.send(str); //發送異步請求

29}10.6.4服務器端的調度邏輯

服務器端的處理通過調度邏輯來完成。調度邏輯根據操作數據庫的標識符選擇操作數據庫的方式。圖書管理系統中讀者信息維護、圖書維護、圖書借閱、圖書歸還等主要模塊都有單獨的調度邏輯。案例說明:本案例演示各模塊調度邏輯的工作流程。

01<%@Language="JScript"%>

02<!--#includefile="book_public.js"--> //封裝了數據庫的操作函數

03<%

04varXMLDom=Server.CreateObject("Microsoft.XMLDOM");

05XMLDom.load(Request);

06//讀取數據庫操作符標識位07varflag=XMLDom.documentElement.lastChild.text;

08Response.ContentType="text/xml";

09Response.Charset="gb2312";

10switch(flag)

11{

12case"1"://查詢操作

13//此處添加查詢并以XML文檔形式返回結果的函數14break;

15case"2"://插入操作

16//此處添加向數據插入數據的函數

17break;

18case"3"://更新操作

19//此處添加更新數據庫的函數

20break;

21case"4"://刪除操作

22//此處添加刪除數據庫記錄的函數23break;

24default://

25Response.Write("-1");

26}

27XMLDom=null;

28%>案例分析:第02行引入外部文件“book_public.js”,該文件包含了業務邏輯層主要功能模塊的代碼實現,這些模塊供第10行至第23行的調度邏輯調用。第04行和第05行創建一個DOM對象,并將客戶端發送過來的XML文檔加載到DOM中。第07行讀取數據處理標識位賦值給變量flag,供第10行的switch語句使用。第08行和第09行設置服務器向客戶端返回支持中文編碼的XML文檔。10.6.5業務邏輯層主要模塊代碼實現

業務邏輯層的主要模塊有讀者信息維護、圖書信息維護、圖書借閱、圖書歸還、圖書續借、圖書檢索等模塊,本節主要討論讀者信息維護模塊、圖書借閱模塊和圖書歸還模塊的代碼實現,其余模塊作為課后習題形式給出。

1.讀者信息維護

讀者信息維護包括讀者信息添加、查詢和更新。下面首先討論讀者信息的添加。

函數userInsert()收集客戶端的讀者信息,并向服務器端的處理程序userHandle.asp發HTTP請求,處理程序userHandle.asp是10.6.4中描述的調度邏輯。函數userInsert()第12行的MakeUserXML()函數負責將客戶端的讀者信息拼裝成XML文檔,并發送給服務器。

案例說明:本模塊演示客戶端向服務器端發送包含讀者信息的XML文檔。模塊名稱:userInsert

01functionuserInsert()

02{

03varobjUserNum=document.getElementById("userNum");

04if(objUserNum.value=="")

05{

06alert("借書證號不能為空!");

07}08else

09{

10varurl=window.location.toString();

11url=url.replace(/userInsertHTMLPage.htm/,"userHandle.asp");

12send_request_post(url,MakeUserXML());//

13}

14}函數MakeUserXML()創建包含讀者信息的XML文檔,代碼如下。第15行<flag>元素封裝了處理標識位“2”,表示向數據庫添加讀者信息。

案例說明:本模塊演示獲取客戶端頁面讀者信息構造包含數據處理標識位的XML文檔。模塊名稱:MakeUserXML

01functionMakeUserXML()

02{

03varxmlstr="";

04xmlstr=xmlstr+"<userNum>

<![CDATA["+document.getElementById("userNum").value+"]]></userNum>";

05xmlstr=xmlstr+"<username>

<![CDATA["+document.getElementById("username").value+"]]></username>";06xmlstr=xmlstr+"<gender>

<![CDATA["+document.getElementById("gender").value+"]]></gender>";

07xmlstr=xmlstr+"<usertype>

<![CDATA["+document.getElementById("usertype").value+"]]></usertype>";

08xmlstr=xmlstr+"<restrictNum>

<![CDATA["+document.getElementById("restrictNum").value+"]]></restrictNum>";09xmlstr=xmlstr+"<classID>

<![CDATA["+document.getElementById("classID").value+"]]></classID>";

10xmlstr=xmlstr+"<cardname>

<![CDATA["+document.getElementById("cardname").value+"]]></cardname>";

11xmlstr=xmlstr+"<cardId>

<![CDATA["+document.getElementById("cardId").value+"]]></cardId>";12xmlstr=xmlstr+"<department>

<![CDATA["+document.getElementById("department").value+"]]></department>";

13xmlstr=xmlstr+"<telephone>

<![CDATA["+document.getElementById("telephone").value+"]]></telephone>";

14xmlstr=xmlstr+"<email>

<![CDATA["+document.getElementById("email").value+"]]></email>";15xmlstr=xmlstr+"<flag><![CDATA[2]]></flag>"

16xmlstr="<?xmlversion='1.0'encoding='utf-8'?><root>"+xmlstr+"</root>";

17returnxmlstr;

18}處理程序userHandle.asp讀取客戶端發送過來的XML文檔,并根據數據處理標識位執行向數據庫插入數據的操作。

添加讀者信息到數據庫:

return_bool(insertUser(XMLDom))

其中,函數insertUser構建向數據庫插入數據的sql語句;參數XMLDom是包含讀者信息的XML對象,用于構造Insert語句。函數insertUser的返回值為構造好的Insert語句。將返回的sql語句作為參數,調用數據資源層的函數模塊return_bool實現讀者數據添加到數據庫的操作。下面討論讀者信息的查詢和更新。

根據讀者的借書證號查詢讀者信息??蛻舳嗽跇嬙彀钑C號的請求XML文檔時,數據處理標識位為“1”,服務器端收到請求文檔,讀取標識位,根據數據處理標識位調用查詢模塊,獲得指定讀者的信息,并以XML文檔形式返回給客戶端??蛻舳说捻憫瘮到馕鍪盏降腦ML文檔,將XML文檔中數據與頁面表單項綁定,實現數據查詢和編輯。

案例說明:本模塊為客戶端的響應函數,當服務器端返回的數據下載到客戶端時觸發該函數,處理返回的信息。模塊名稱:processRequest

01functionprocessRequest()

02{//響應查詢讀者信息的事件,讀者信息以XML形式返回

03if((http_request.readyState==4)&&(http_request.status==200))

04{

05varxmlText=http_request.responseText;

06if(!xmlText){

07returnalert("你查找的讀者不存在!");

08}09//建立XMLDOM對象,接收服務器端返回的XML文檔

10varXMLDom=newActiveXObject(“Microsoft.XMLDOM”);

11XMLDom.async=false;//設置為同步方式獲取數據

12XMLDom.loadXML(xmlText); //將XML文檔加載到XMLDom對象中

13binduser(XMLDom);//將返回的讀者信息綁定到頁面表單項

14}

15}解析XMLDom,將XMLDom中節點封裝的數據與頁面表單對應項綁定,綁定的處理函數binduser()描述如下:01functionbinduser(XMLDom)

02{

03document.getElementById("username").value=

XMLDom.documentElement.firstChild.childNodes[2].text;

04document.getElementById("gender").value=

XMLDom.documentElement.firstChild.childNodes[3].text;

05document.getElementById("usertype").value=

XMLDom.documentElement.firstChild.childNodes[4].text;06document.getElementById("restrictNum").value=

XMLDom.documentElement.firstChild.childNodes[5].text;

07document.getElementById("classID").value=

XMLDom.documentElement.firstChild.childNodes[6].text;

08document.getElementById("cardname").value=

XMLDom.documentElement.firstChild.childNodes[7].text;

09document.getElementById("cardId").value=

XMLDom.documentElement.firstChild.childNodes[8].text;10document.getElementById("department").value=

XMLDom.documentElement.firstChild.childNodes[9].text;

11document.getElementById("telephone").value=

XMLDom.documentElement.firstChild.childNodes[10].text;

12document.getElementById("email").value=

XMLDom.documentElement.firstChild.childNodes[11].text;13varuserstatus=

((XMLDom.documentElement.firstChild.childNodes[12].text=="true")?true:false);

14document.getElementById("userstatus").checked=userstatus;

15}客戶端的數據編輯完成后,重新生成XML請求文檔,數據處理標識也為“3”,服務器接收到XML文檔后根據數據處理標識位調用更新處理函數構造update語句,并將數據更新到數據庫。

圖書信息維護模塊的實現過程與讀者信息維護模塊的實現過程類似,這里不再重復。

2.圖書借閱

首先要根據讀者借書證號檢查讀者未還圖書數量和超期圖書數量,如果讀者未還圖書數量超過最大借書數量或有過期圖書,則不能借書。統計未還圖書數量和超期圖書數量的函數如下:

案例說明:根據讀者Id統計讀者未還圖書數量。圖書借閱表(bookborrow)中圖書狀態為“1”(borrowstatus='1')的圖書是未還圖書。模塊名稱:notReturnBooks

01functionnotReturnBooks(userId)

02{

03varresult=null;

04varsqlstr="selectcount(bookId)asnotReturnBooksfrom[bookborrow]where

[userId]=cast('"+userId+"'asint)and[borrowstatus]='1'";

05varrs=return_rs(sqlstr);

06if(rs!=null&&!rs.EOF){result=makeXML(rs);}

07returnresult;

08}案例分析:模塊notReturnBooks的第04行構造統計讀者未還圖書的sql語句,第05行調用數據資源層return_rs模塊查詢讀者未還圖書量。第06行調用函數makeXML(rs)將返回的記錄集轉換為XML文檔。

案例說明:根據讀者Id統計讀者超期圖書數量,當前日期超過圖書應還日期則圖書過期。模塊名稱:overdueBooks

01functionoverdueBooks(userId)

02{

03varresult=null;

04varsqlstr="selectcount([bookId])asoverdueBooksfrom[bookborrow]where[userId]=cast('"+userId+"'asint)and[borrowstatus]='1'and(datediff(day,getDate(),[limitDate])<0)";

05varrs=return_rs(sqlstr);

06if(rs!=null&&!rs.EOF){result=makeXML(rs);}

07returnresult;

08}需借閱的圖書信息根據圖書的編碼從數據庫讀取。當滿足借閱條件時可以執行圖書的借閱過程。

案例說明:本案例演示圖書借閱事務處理模塊,第22行調用數據資源層的事務處理模塊return_trans完成借書過程涉及到的多表關聯操作。模塊名稱:borrowBook

01functionborrowBook(userId,bookId)

02{

03vararray_sqlString=newArray();

04vardate=newDate();

05//設置借書時間

06varborrowDate=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();

07date.setMonth(date.getMonth()+3); //每本圖書限借3個月08//設置還書時間

09varlimitDate=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();

10varborrowregistrar=Session("username"); //從session中獲取管理員用戶名

11//構造添加借書記錄的sql語句12varinser_bookborrow="insertinto[bookborrow]([bookId],[userId],"+"[borrowDate],[limitDate],[renewNum],"+"[borrowStatus],[borrowregistrar])values('"+bookId+"','"+userId+"','"+borrowDate+"','"+limitDate+"','1','1','"+borrowregistrar+"')";

13//構造修改圖書信息表圖書狀態的sql語句(借出狀態為'2')

14varupdate_bookstatus="update[books]set[bookstatus]='2',[borrowNum]=cast([borrowNum]asint)+1where[bookId]='"+bookId+"'";15//將兩天sql語句追加到array_sqlString數組中

16array_sqlString[0]=inser_bookborrow;

17array_sqlString[1]=update_bookstatus;

18

19//檢測讀者所借圖書是否已被借出,已被借出則不能借閱

20if(checkBookStatus(bookId)){return"-1";}21//圖書未被借出,則執行圖書借閱事務,并返回讀者借閱圖書結果集

22if(return_trans(array_sqlString)) {returnback_borrowedbook(userId);}

23return"-1"; //借閱不成功

24}服務器端向客戶端返回XML文檔有三種情況:第一種是返回讀者基本信息和未還圖書數量以及超期圖書數量的統計信息;第二種是返回讀者將要借閱的圖書信息;第三種是返回讀者未還的所有圖書信息的列表。依據這三種情況客戶端的響應函數要分別進行處理。響應函數的結構如下:

案例說明:本模塊響應服務器的反饋處理,當XML文檔反饋到客戶端后,處理程序根據預先約定的XML文檔中關鍵位置的關鍵元素名稱決定做何處理。模塊名稱:processRequest

01functionprocessRequest()

02{

03if((http_request.readyState==4)&&(http_request.status==200))

04{

05varxmlText=http_request.responseText;

06//建立XMLDOM對象,接收服務器端返回的XML文檔07varXMLDom=newActiveXObject("Microsoft.XMLDOM");

08XMLDom.async=false;//設置為同步方式獲取數據

09XMLDom.loadXML(xmlText);

10varfld_flag=XMLDom.documentElement.firstChild.childNodes[1].nodeName;

11switch(fld_flag)12{

13case"userNum": //處理反饋的讀者信息和讀者借書統計信息

14bindUser(XMLDom);

15getUserBooks(document.getElementById("userId").value);

16break;

17case"bookNum": //處理反饋的將要借閱的圖書信息18bindBook(XMLDom);

19break;

20case"borrowId": //處理讀者所有未還圖書的信息

21bindBorrowBook(XMLDom);

22break;

23}

24}

25}案例分析:第14行和第18行的XML元素綁定到頁面表單的過程在這里不再描述,方法在“讀者信息維護”模塊的分析中已經做了討論。第21行的綁定處理將在后面的分析中

討論。

第15行當讀者信息、讀者未還圖書量和過期圖書量的統計信息綁定到客戶端的頁面后,根據讀者Id去服務器端取讀者所有未還圖書的詳細信息。函數getUserBooks向服務器發

請求。案例說明:向服務器請求讀者未還圖書信息。

模塊名稱:getUserBooks

01functiongetUserBooks(userId)

02{

03varurl=window.location.toString();

04url=url.replace(/borrowHTMLPage.htm/,"borrowHandle.asp");

05send_request_post(url,MakeNotReturnBooksXML(userId));

06}案例說明:本模塊演示構造請求讀者未還圖書信息的XML文檔,包含讀者Id和處理標識“1”。模塊名稱:MakeNotReturnBooksXML

01functionMakeNotReturnBooksXML(userId)

02{

03varxmlstr="";

04xmlstr=xmlstr+"<userId><![CDATA["+userId+"]]></userId>";

05xmlstr=xmlstr+"<flag><![CDATA[1]]></flag>"

06xmlstr="<?xmlversion='1.0'encoding='utf-8'?><root>"+xmlstr+"</root>";

07returnxmlstr;

08}案例說明:綁定讀者未還圖書的信息。

模塊名稱:bindBorrowBook

01functionbindBorrowBook(XMLDom)

02{

03//定義數據文檔對象XSLDom,加載XSL樣式文檔

04varXSLDom=document.getElementById("xslds").XMLDocument;

05//啟用XSL轉換,并將轉換的結果顯示在層checkResult中

06document.getElementById("borrowDiv").innerHTML=XMLDom.transformNode(XSLDom);

07}案例分析:模塊bindBorrowBook第04行獲取客戶端的數據島對象,數據島對象中保存了XML的轉換文檔XSL。第06行啟用XSL將包含未還圖書信息的XML文檔轉換為HTML文檔,并輸出到層對象borrowDiv中,以列表形式呈現在客戶端的頁面中。XSL轉換文檔的結構如下:

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<tablestyle="font-size:10pt;font-family:宋體;width:620px;margin:2px;">

05<theadalign="left">06<th>編號</th>

07<th>標題</th>

08

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論