《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技术)。客户端向服务器发送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文档的公共模块。“rs”为服务器端查询数据库返回的记录集。模块名称: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实现读者数据添加到数据库的操作。下面讨论读者信息的查询和更新。

根据读者的借书证号查询读者信息。客户端在构造包含借书证号的请求XML文档时,数据处理标识位为“1”,服务器端收到请求文档,读取标识位,根据数据处理标识位调用查询模块,获得指定读者的信息,并以XML文档形式返回给客户端。客户端的响应函数解析收到的XML文档,将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

提交评论