




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章要求:第15章课程设计——图书馆管理系统图书馆管理系统的设计目的图书馆管理系统的开发环境要求图书馆管理系统的功能结构及系统流程图书馆管理系统的数据库设计主要功能模块的界面设计主要功能模块的关键代码图书馆管理系统的调试运行本章要求:第15章课程设计——图书馆管理系统图书馆管理系统主要内容1.课程设计目的2.功能描述3.总体设计4.数据库设计5.实现过程6.调试运行7.课程设计总结第15章课程设计——图书馆管理系统主要内容1.课程设计目的第15章课程设计——图书馆管理系统15.1课程设计目的本章提供了“图书馆管理系统”作为这一学期的课程设计之一,本次课程设计旨在提升学生的动手能力,加强大家对专业理论知识的理解和实际应用。本次课程设计的主要目的如下:加深对面向对象程序设计思想的理解,能对网站功能进行分析,并设计合理的类结构。掌握JSP网站的基本开发流程。掌握JDBC技术在实际开发中的应用。掌握Servlet技术在实际开发中的应用。掌握JSP经典设计模式中Model2的开发流程。提供网站的开发能力,能够运用合理的控制流程编写高效的代码。培养分析问题、解决实际问题的能力。15.1课程设计目的本章提供了“图书馆管理系统”15.2功能描述图书馆管理系统是一个小型的图书馆管理系统,该系统的主要功能如下:美观友好的操作界面,能保证系统的易用性。管理图书类型信息、图书信息和书架信息等功能。读者类型和读者档案管理功能。可以实现图书的借阅、续借和归还功能。提供查看图书借阅排行榜功能。具有借阅到期提醒功能。查询图书借阅信息。图书档案查询功能。15.2功能描述图书馆管理系统是一个小型的图书馆管理系统15.3.1构建开发环境15.3.2网站功能结构15.3.3系统流程图15.3总体设计15.3.1构建开发环境15.3总体设计图书馆管理系统的开发环境具体要求如下:开发平台:WindowsXP(SP2)/WindowsServer2003(SP2)/Windows7。开发技术:JSP+Servlet+HTML5+JavaScript。后台数据库:MySQL。Java开发包:JavaSEDevelopmentKET(JDK)version7Update3。Web服务器:Tomcat7.0.27。浏览器:IE9.0以上版本、Firefox等。分辨率:最佳效果1024×768像素。15.3.1构建开发环境图书馆管理系统的开发环境具体要求如下:15.3.1构建开在图书馆管理系统中主要包含6大功能模块,分别为系统设置模块、读者管理模块、图书管理模块、图书借还模块、系统查询模块和更改口令模块,它们的具体介绍如下:系统设置:用来对系统的一些基础参数进行设置,主要包括图书管理信息、管理员设置、参数设置、书架设置等。读者管理:用来对读者类型和读者档案进行管理,主要包括读者类型管理和读者档案管理等。图书管理:用来对图书类型和图书档案进行管理,主要包括图书类型设置和图书档案管理等。图书借还:用来实现图书的借阅、续借和归还,主要包括图书借阅、图书续借、图书归还等。系统查询:用来实现图书和借阅信息的查询,主要包括图书档案查询、图书借阅查询、借阅到期提醒等。更改口令:主要用于修改登录管理员的密码。15.3.2网站功能结构在图书馆管理系统中主要包含6大功能模块,分别为系统设图书馆管理系统的功能结构图如图15-1所示。图15-1图书馆管理系统的功能结构图图书馆管理系统的功能结构图如图15-1所示。图书馆管理系统的系统流程如图15-2所示。图15-2图书馆管理系统的系统流程图15.3.3系统流程图图书馆管理系统的系统流程如图15-2所示。15.3.3系统流15.4数据库设15.4.1实体图15.4.2数据表设计15.4数据库设15.4.1实体图根据对系统所做的需求分析,规划出本系统中使用的数据库实体分别为图书档案实体、读者档案实体、图书借阅实体、图书归还实体和管理员实体。下面将介绍几个关键实体的实体图。图书档案实体图书档案实体包括编号、条形码、书名、类型、作者、译者、出版社、价格、页码、书架、库存总量、录入时间、操作员和是否删除等属性。其中“是否删除属性”用于标记图书是否被删除,由于图书馆中的图书信息不可以被随意删除,所以即使当某种图书不能再借阅,而需要删除其档案信息时,也只能采用设置删除标记的方法。图书档案实体的实体图如图15-3所示。图15-3图书档案实体图15.4.1实体图根据对系统所做的需求分析,规划出本系统中使用的数据库读者档案实体读者档案实体包括编号、姓名、性别、条形码、职业、出生日期、有效证件、证件号码、电话、电子邮件、登记日期、操作员、类型和备注等属性。读者档案实体的实体图如图15-4所示。图15-4读者档案实体图读者档案实体借阅档案实体借阅档案实体包括编号、读者编号、图书编号、借书时间、应还时间、操作员和是否归还等属性。借阅档案实体的实体图如图15-5所示。图15-5借阅档案实体图借阅档案实体归还档案实体归还档案实体包括编号、读者编号、图书编号、归还时间和操作员等属性。借阅档案实体的实体图如图15-6所示。图15-6归还档案实体图归还档案实体结合实际情况及对用户需求的分析,图书馆管理系统的db_library数据库中需要创建如图15-7所示的12张数据表。图15-7db_library数据库所包含的数据表15.4.2数据表设计结合实际情况及对用户需求的分析,图书馆管理系统的db_lib下面将给出这些数据表的结构及说明。tb_manager(管理员信息表)管理员信息表主要用来保存管理员信息。表tb_manager的结构如表15-1所示。表15-1 表tb_manager的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)nameVARCHAR(30)YesNULL管理员名称pwdVARCHAR(30)YesNULL密码下面将给出这些数据表的结构及说明。字段名数据类tb_purview(权限表)权限表主要用来保存管理员的权限信息,该表中的id字段与管理员信息表(tb_manager)中的id字段相关联。表tb_purview的结构如表15-2所示。表15-2 表tb_purview的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(11)NoYes0管理员ID号syssetTINYINT(1)Yes0系统设置readersetTINYINT(1)Yes0读者管理booksetTINYINT(1)Yes0图书管理borrowbackTINYINT(1)Yes0图书借还sysqueryTINYINT(1)Yes0系统查询tb_purview(权限表)字段名数据类型是tb_bookinfo(图书信息表)图书信息表主要用来保存图书信息。表tb_bookinfo的结构如表15-3所示。表15-3 表tb_bookinfo的结构及说明字段名数据类型是否为空是否主键默认值描述barcodeVARCHAR(30)YesNULL条形码booknameVARCHAR(70)YesNULL书名typeidINT(10)unsignedYesNULL类型authorVARCHAR(30)YesNULL作者translatorVARCHAR(30)YesNULL译者ISBNVARCHAR(20)YesNULL出版社priceFLOAT(8,2)YesNULL价格pageINT(10)UnsignedYesNULL页码bookcaseINT(10)UnsignedYesNULL书架inTimeDATEYesNULL录入时间operatorVARCHAR(30)YesNULL操作员TINYINT(1)Yes0是否删除idINT(11)NoYesID(自动编号)tb_bookinfo(图书信息表)字段名数据类tb_parameter(参数设置表)参数设置表主要用来保存办证费及书证的有效期限等信息。表tb_parameter的结构如表15-4所示。表15-4 表tb_parameter的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)costINT(10)UnsignedYesNULL办证费validityINT(10)UnsignedYesNULL有效期限tb_parameter(参数设置表)字段名数据tb_booktype(图书类型表)图书类型表主要用来保存图书类型信息。表tb_booktype的结构如表15-5所示。表15-5 表tb_booktype的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)typenameVARCHAR(30)YesNULL类型名称daysINT(10)UnsignedYesNULL可借天数tb_booktype(图书类型表)字段名数据类tb_bookcase(书架信息表)书架信息表主要用来保存书架信息。表tb_bookcase的结构如表15-6所示。表15-6 表tb_bookcase的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)nameVARCHAR(30)YesNULL书架名称tb_bookcase(书架信息表)字段名数据类tb_borrow(图书借阅信息表)图书借阅信息表主要用来保存图书借阅信息。表tb_borrow的结构如表15-7所示。表15-7 表tb_borrow的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)readeridINT(10)UnsignedYesNULL读者编号bookidINT(10)YesNULL图书编号borrowTimeDATEYesNULL借书时间backtimeDATEYesNULL应还时间operatorVARCHAR(30)YesNULL操作员ifbackTINYTIN(1)Yes0是否归还tb_borrow(图书借阅信息表)字段名数据类tb_giveback(图书归还信息表)图书归还信息表主要用来保存图书归还信息。表tb_giveback的结构如表15-8所示。表15-8 表tb_giveback的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)readeridINT(11)YesNULL读者编号bookidINT(11)YesNULL图书编号backTimeDATEYesNULL归还时间operatorVARCHAR(30)YesNULL操作员tb_giveback(图书归还信息表)字段名数据tb_readertype(读者类型信息表)读者类型信息表主要用来保存读者类型信息。表tb_readertype的结构如表15-9所示。表15-9 表tb_readertype的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)nameVARCHAR(50)YesNULL名称numberINT(4)YesNULL可借数量tb_readertype(读者类型信息表)字段名数tb_reader(读者信息表)读者信息表主要用来保存读者信息。表tb_reader的结构如表15-10所示。表15-10 表tb_reader的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)nameVARCHAR(20)YesNULL姓名sexVARCHAR(4)YesNULL性别barcodeVARCHAR(30)YesNULL条形码vocationVARCHAR(50)YesNULL职业birthdayDATEYesNULL出生日期paperTypeVARCHAR(10)YesNULL有效证件paperNOVARCHAR(20)YesNULL证件号码telVARCHAR(20)YesNULL电话emailVARCHAR(100)YesNULL电子邮件createDateDATEYesNULL登记日期operatorVARCHAR(30)YesNULL操作员remarkTEXTYesNULL备注typeidINT(11)YesNULL类型tb_reader(读者信息表)字段名数据类型tb_library(图书馆信息表)图书馆信息表主要用来保存图书馆信息。表tb_library的结构如表15-11所示。表15-11 表tb_library的结构及说明字段名数据类型是否为空是否主键默认值描述idINT(10)UnsignedNoYesID(自动编号)librarynameVARCHAR(50)YesNULL图书馆名称curatorVARCHAR(10)YesNULL馆长telVARCHAR(20)YesNULL联系电话addressVARCHAR(100)YesNULL联系地址emailVARCHAR(100)YesNULL联系邮箱urlVARCHAR(100)YesNULL图书馆网址createDateDATEYesNULL建馆时间introduceTEXTYesNULL图书馆简介tb_library(图书馆信息表)字段名数据类tb_publishing(出版社信息表)出版社信息表主要用来保存出版社信息。表tb_publishing的结构如表15-12所示。表15-12 表tb_publishing的结构及说明字段名数据类型是否为空是否主键默认值描述ISBNVARCHAR(20)NoYesISBN号pubnameVARCHAR(30)YesNULL出版社名称tb_publishing(出版社信息表)字段名数15.5实现过程15.5.1系统登录设计15.5.2主界面设计15.5.3图书借阅设计15.5.4图书续借设计15.5.5图书归还设计15.5实现过程15.5.1系统登录设计系统登录是进入图书馆管理系统的入口。在运行本系统后,首先进入的是系统登录页面,在该页面中,系统管理员可以通过输入正确的管理员名称和密码登录到系统,当用户未输入管理员名称或密码时,系统会通过JavaScript进行判断,并给予提示信息。系统登录的运行结果如图15-8所示。图15-8系统登录的设计结果15.5.1系统登录设计系统登录是进入图书馆管理系统的入口。在运行本系统后,1.界面设计系统登录页面主要用于收集管理员的输入信息及通过自定义的JavaScript函数验证输入信息是否为空,该页面中所涉及到的表单元素如表15-13所示。表15-13 系统登录页面所涉及的表单元素名称元素类型重要属性含义form1formmethod="post"action="manager?action=login"管理员登录表单nametextsize="25"管理员名称pwdpasswordsize="25"管理员密码Submitsubmitvalue="确定"onclick="returncheck(form1)"“确定”按钮Submit3resetvalue="重置"“重置”按钮Submit2buttonvalue="关闭"onClick="window.close();"“关闭”按钮1.界面设计名称元素类型重要属性含编写自定义的JavaScript函数,用于判断管理员名称和密码是否为空。代码如下:<scriptlanguage="javascript">functioncheck(form){ if(.value==""){ //判断管理员名称是否为空 alert("请输入管理员名称!");.focus();returnfalse; } if(form.pwd.value==""){ //判断密码是否为空 alert("请输入密码!");form.pwd.focus();returnfalse; } }</script>编写自定义的JavaScript函数,用于判断管理员名称和密2.关键代码在实现系统登录时,主要是如何在Servlet中获取提交的登录信息,以及验证输入的管理员信息是否合法,如果合法则将将页面重定向到系统主界面,否则给出提示信息。这时将涉及到以下两个方法。//在Servlet中编写的方法,用于获取提交的登录信息,以及调用DAO方法验证登录信息,//并根据验证结果做出相应的处理publicvoidmanagerLogin(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ ManagerFormmanagerForm=newManagerForm();//实例化managerForm类 managerForm.setName(request.getParameter("name"));//获取管理员名称并设置name属性 managerForm.setPwd(request.getParameter("pwd"));//获取管理员密码并设置pwd属性 //调用ManagerDAO类的checkManager()方法 intret=managerDAO.checkManager(managerForm); if(ret==1){ /**********将登录到系统的管理员名称保存到session中***************************/HttpSessionsession=request.getSession();session.setAttribute("manager",managerForm.getName());/***********************************************************************/ //转到系统主界面 request.getRequestDispatcher("main.jsp").forward(request,response); }else{ request.setAttribute("error","您输入的管理员名称或密码错误!"); request.getRequestDispatcher("error.jsp") .forward(request,response);//转到错误提示页 }}2.关键代码publicintcheckManager(ManagerFormmanagerForm){ intflag=0; //标记变量,值为0时表示不成功,值为1时表示成功 //连接SQL语句,并过滤管理员名称中的危险字符 Stringsql="SELECT*FROMtb_managerwherename='" +ChStr.filterStr(managerForm.getName())+"'"; ResultSetrs=conn.executeQuery(sql); try{ if(rs.next()){ //获取输入的密码并过滤输入字符串中的危险字符 Stringpwd=ChStr.filterStr(managerForm.getPwd()); if(pwd.equals(rs.getString(3))){ flag=1; //表示验证成功 }else{ flag=0; //表示验证不成功 } }else{ flag=0; //表示验证不成功 } }catch(SQLExceptionex){ flag=0; //表示验证不成功 }finally{ conn.close(); //关闭数据库连接 } returnflag;}publicintcheckManager(Manage在实现系统登录时,从网站安全的角度考虑,仅仅上面介绍的系统登录页面并不能有效的保存系统的安全,一旦系统主界面的地址被他人获得,就可以通过在地址栏中输入系统的主界面地址而直接进入到系统中。这时,我们可以在每个页面的顶端添加以下验证用户是否登录的代码。<%Stringmanager=(String)session.getAttribute("manager");if(manager==null||"".equals(manager)){ //验证用户是否登录 response.sendRedirect("login.jsp"); //重定向网页到login.jsp页}%>这样,当系统调用每个页面时,都会判断session变量manager是否存在,如果不存在,将页面重定向到系统登录页面。在实现系统登录时,从网站安全的角度考虑,仅仅上面介绍管理员通过“系统登录”模块的验证后,可以登录到图书馆管理系统的主界面。系统主界面主要包括Banner信息栏、导航栏、排行榜和版权信息4部分。其中,导航栏中的功能菜单将根据登录管理员的权限进行显示。例如,系统管理员mr登录后,将拥有整个系统的全部功能,因为它是超级管理员。主界面的设计效果如图15-9所示。图15-9主界面的设计效果15.5.2主界面设计管理员通过“系统登录”模块的验证后,可以登录到图书馆
1.界面设计在如图15-9所示的主界面中,Banner信息栏、导航栏和版权信息,并不是仅存在于主界面中,其他功能模块的子界面中也需要包括这些部分。因此,可以将这几个部分分别保存在单独的文件中,这样,在需要放置相应功能时只需包含这些文件即可,主界面的布局如图15-10所示。图15-10主界面的布局1.界面设计应用<%@include%>指令包含文件的方法进行主界面布局的代码如下:<%@includefile="banner.jsp"%><%@includefile="navigation.jsp"%><section><divstyle="text-align:right;padding-right:10px;height:30px;"class="word_orange">当前位置:首页>>> </div><divstyle="height:57px;clear:both"><!--显示图书借阅排行榜--><imgsrc="Images/main_booksort.gif"height="57px"></div><divstyle="height:300px;padding-left:20px;">… <!--此处省略了显示图书借阅排行的代码--></div></section><%@includefile="copyright.jsp"%>在上面的代码中,第一行的代码,用于应用<%@include%>指令包含banner.jsp文件,该文件用于显示Banner信息及当前登录管理员;第二行的代码,用于应用<%@include%>指令包含navigation.jsp文件,该文件用于显示当前系统时间及系统导航菜单;最后一行的代码,用于应用<%@include%>指令包含copyright.jsp文件,该文件用于显示版权信息。应用<%@include%>指令包含文件的方法进行主界面2.关键代码在实现主界面时,需要显示图书借阅排行榜,所以需要编写DAO方法从数据库中统计出借阅排行数据,并保存到Collection集合中。从数据库中统计借阅排行数据的关键代码如下:publicCollection<BorrowForm>bookBorrowSort(){Stringsql="select*from(SELECTbookid,count(bookid)asdegreeFROM"+ "tb_borrowgroupbybookid)asborrjoin(selectb.*,asbookcaseName"+ ",p.pubname,t.typenamefromtb_bookinfobleftjointb_bookcase"+ "conb.bookcase=c.idjointb_publishingponb.ISBN=p.ISBNjoin"+ "tb_booktypetonb.typeid=t.idwhereb.del=0)"+ "asbookonborr.bookid=book.idorderbyborr.degreedesclimit10";Collection<BorrowForm>coll=newArrayList<>(); //创建并实例化Collection对象BorrowFormform=null; //声明BorrowForm对象ResultSetrs=conn.executeQuery(sql); //执行查询语句try{while(rs.next()){form=newBorrowForm(); //实例化BorrowForm对象form.setBookId(rs.getInt(1)); //获取图书IDform.setDegree(rs.getInt(2)); //获取借阅次数form.setBookBarcode(rs.getString(3)); //获取图书条形码form.setBookName(rs.getString(4)); //获取图书名称form.setAuthor(rs.getString(6)); //获取作者form.setPrice(Float.valueOf(rs.getString(9))); //获取定价form.setBookcaseName(rs.getString(16)); //获取书架名称form.setPubName(rs.getString(17)); //获取出版社form.setBookType(rs.getString(18)); //获取图书类型coll.add(form); //保存到Collection集合中}2.关键代码管理员登录后,选择“图书借还/图书借阅”命令,进入到图书借阅页面,在该页面中的“读者条形码”文本框中输入读者的条形码(如:20120224000001)后,单击“确定”按钮,系统会自动检索出该读者的基本信息和未归还的借阅图书信息。如果找到对应的读者信息,就将其显示在页面中,此时输入图书的条形码或图书名称后,单击“确定”按钮,借阅指定的图书,图书借阅页面的运行结果如图15-11所示。图15-11图书借阅页面15.5.3图书借阅设计管理员登录后,选择“图书借还/图书借阅”命令,进入到1.界面设计图书借阅页面总体上可以分为两个部分:一部分用于查询并显示读者信息;另一部分用于显示读者的借阅信息和添加读者借阅信息。图书借阅页面在Dreamweaver中的设计效果如图15-12所示图15-12在Dreamweaver中图书借阅页面的设计效果1.界面设计由于系统要求一个读者只能同时借阅一定数量的图书,并且该数量由读者类型表tb_readerType中的可借数量number决定,所以这里编写了自定义的JavaScript函数checkbook(),用于判断当前选择的读者是否还可以借阅新的图书,同时该函数还具有判断是否输入图书条形码或图书名称的功能,代码如下:<scripttype="text/javascript">functioncheckbook(form){ if(form.barcode.value==""){ //判断是否输入读者条形码 alert("请输入读者条形码!");form.barcode.focus();return; } if(form.inputkey.value==""){ //判断查询关键字是否为空 alert("请输入查询关键字!");form.inputkey.focus();return; } if(form.number.value-form.borrowNumber.value<=0){ //判断是否可以再借阅其他图书 alert("您不能再借阅其他图书了!");return; } form.submit(); //提交表单}</script>说明:在JavaScript中比较两个数值型文本框的值时,不使用运算符“==”,而是将这两个值相减,再判断其结果。由于系统要求一个读者只能同时借阅一定数量的图书,并且2.关键代码在实现图书借阅时,需要编写Servlet方法,用于实现图书借阅。实现图书借阅的方法bookborrow()的具体代码如下://编写Servlet方法,实现图书借阅privatevoidbookborrow(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{
//查询读者信息
readerForm.setBarcode(request.getParameter("barcode")); //获取读者条形码 //根据读者条形码获取读者信息
ReaderFormreader=(ReaderForm)readerDAO.queryM(readerForm);request.setAttribute("readerinfo",reader); //保存读者信息到request中//查询读者的借阅信息request.setAttribute("borrowinfo",borrowDAO.borrowinfo(request.getParameter("barcode"))); //完成借阅Stringf=request.getParameter("f"); //获取查询条件Stringkey=request.getParameter("inputkey"); //获取输入的关键字if(key!=null&&!key.equals("")){ //判断是否有符合条件的图书Stringoperator=request.getParameter("operator");BookFormbookForm=bookDAO.queryB(f,key); //根据查询条件获取图书信息if(bookForm!=null){intret=borrowDAO.insertBorrow(reader,bookDAO.queryB(f,key),operator); //保存图书借阅信息if(ret==1){request.setAttribute("bar",request.getParameter("barcode"));request.getRequestDispatcher("bookBorrow_ok.jsp").forward(request,response);2.关键代码
}else{ //保存提示信息到request中request.setAttribute("error","添加借阅信息失败!"); //转到错误提示页request.getRequestDispatcher("error.jsp").forward(request,response);}}else{request.setAttribute("error","没有该图书!"); //保存提示信息到request中 //转到错误提示页request.getRequestDispatcher("error.jsp").forward(request,response);}}else{ request.getRequestDispatcher("bookBorrow.jsp").forward(request,response);}}}else{在实现图书借阅的方法中,还需要调用ReaderDAO类的queryM()方法、BorrowDAO类的borrowinfo()方法、BookDAO类的queryB()方法和BorrowDAO类的insertBorrow()方法,具体代码如下://ReaderDAO类的queryM()方法,用于查询读者信息publicReaderFormqueryM(ReaderFormreaderForm){ ReaderFormreaderForm1=null; Stringsql=""; if(readerForm.getId()!=null){ //根据读者ID查询读者信息 sql="selectr.*,astypename,t.numberfromtb_readerrleftjointb_readerTypetonr.typeid=t.idwherer.id="+readerForm.getId()+""; }elseif(readerForm.getBarcode()!=null){//根据读者条形码查询读者信息 sql="selectr.*,astypename,t.numberfromtb_readerrleftjointb_readerTypetonr.typeid=t.idwherer.barcode="+readerForm.getBarcode()+""; } ResultSetrs=conn.executeQuery(sql); //执行查询语句 Stringbirthday=""; try{在实现图书借阅的方法中,还需要调用ReaderDAOwhile(rs.next()){ readerForm1=newReaderForm(); readerForm1.setId(Integer.valueOf(rs.getString(1))); //获取读者ID readerForm1.setName(rs.getString(2)); //获取读者姓名 readerForm1.setSex(rs.getString(3)); //获取读者性别 readerForm1.setBarcode(rs.getString(4)); //获取读者条形码 readerForm1.setVocation(rs.getString(5)); //获取职业 birthday=rs.getString(6); //获取生日 readerForm1.setBirthday(birthday==null?"":birthday); readerForm1.setPaperType(rs.getString(7)); //获取证件类型 readerForm1.setPaperNO(rs.getString(8)); //获取证件号码 readerForm1.setTel(rs.getString(9));//获取联系电话 readerForm1.setEmail(rs.getString(10));//获取E-mail地址 readerForm1.setCreateDate(rs.getString(11));//获取创建日期 readerForm1.setOperator(rs.getString(12)); //获取操作员 readerForm1.setRemark(rs.getString(13));//获取备注 readerForm1.setTypeid(rs.getInt(14));//获取读者类型ID readerForm1.setTypename(rs.getString(15)); //获取读者类型名称 readerForm1.setNumber(rs.getInt(16)); //获取可借数量}catch(SQLExceptionex){ } conn.close();//关闭数据库连接 returnreaderForm1;}//BorrowDAO类的borrowinfo()方法,用于查询借阅信息while(rs.next()){publicCollection<BorrowForm>borrowinfo(Stringstr){Stringsql="selectborr.*,book.bookname,book.price,pub.pubname,"+ "bookcasename,r.barcodefrom(select*fromtb_borrow"+ "whereifback=0)asborrleftjointb_bookinfobookonborr.bookid"+ "=book.idjointb_publishingpubonbook.isbn=pub.isbnjoin"+ "tb_bookcasebsonbook.bookcase=bs.idjointb_readerron"+ "borr.readerid=r.idwherer.barcode='"+str+"'";ResultSetrs=conn.executeQuery(sql);//执行查询语句Collection<BorrowForm>coll=newArrayList<>();BorrowFormform=null;try{while(rs.next()){form=newBorrowForm();form.setId(Integer.valueOf(rs.getInt(1))); //获取ID号form.setBorrowTime(rs.getString(4)); //获取借阅时间form.setBackTime(rs.getString(5)); //获取归还时间form.setBookName(rs.getString(8)); //获取图书名称form.setPrice(Float.valueOf(rs.getFloat(9))); //获取定价form.setPubName(rs.getString(10)); //获取出版社form.setBookcaseName(rs.getString(11)); //获取书价名称coll.add(form); //添加借阅信息到Collection集合中}publicCollection<BorrowForm>catch(SQLExceptionex){System.out.println("借阅信息:"+ex.getMessage()); //输出异常信息}conn.close(); //关闭数据库连接returncoll;}//BookDAO类的queryB()方法,用于查询图书信息publicBookFormqueryB(Stringf,Stringkey){BookFormbookForm=null;Stringsql="selectb.*,asbookcaseName,p.pubnameaspublishing,t.typename"+ "fromtb_bookinfobleftjointb_bookcaseconb.bookcase=c.idjoin"+ "tb_publishingponb.ISBN=p.ISBNjointb_booktypeton"+ "b.typeid=t.idwhereb."+f+"='"+key+"'"; //查询图书信息的SQL语句ResultSetrs=conn.executeQuery(sql); //执行查询语句try{if(rs.next()){bookForm=newBookForm();bookForm.setBarcode(rs.getString(1)); //获取图书条形码bookForm.setBookName(rs.getString(2)); //获取图书名称bookForm.setTypeId(rs.getInt(3)); //获取图书类型IDcatch(SQLExceptionex){bookForm.setAuthor(rs.getString(4)); //获取作者bookForm.setTranslator(rs.getString(5)); //获取译者bookForm.setIsbn(rs.getString(6)); //获取图书的ISBN号bookForm.setPrice(Float.valueOf(rs.getString(7)));//此处必须进行类型转换bookForm.setPage(rs.getInt(8)); //获取页码bookForm.setBookcaseid(rs.getInt(9)); //获取书架IDbookForm.setInTime(rs.getString(10)); //获取入库时间bookForm.setOperator(rs.getString(11)); //获取操作员bookForm.setDel(rs.getInt(12)); //获取是否删除bookForm.setId(Integer.valueOf(rs.getString(13)));//获取图书ID号bookForm.setBookcaseName(rs.getString(14)); //获取书架名称bookForm.setPublishing(rs.getString(15)); //获取出版社bookForm.setTypeName(rs.getString(16)); //获取类型名称}}catch(SQLExceptionex){}conn.close(); //关闭数据库连接returnbookForm;}//BorrowDAO类的insertBorrow()方法,用于保存图书借阅信息bookForm.setAuthor(rs.getStripublicintinsertBorrow(ReaderFormreaderForm,BookFormbookForm, Stringoperator){ Stringsql1="selectt.daysfromtb_bookinfobleftjointb_booktypeton" +"b.typeid=t.idwhereb.id="+bookForm.getId()+"";//获取可借天数的SQL语句 ResultSetrs=conn.executeQuery(sql1); //执行SQL语句 intdays=0; try{ if(rs.next()){ days=rs.getInt(1); //获取可借天数 } }catch(SQLExceptionex){ } //计算归还时间 Calendarcalendar=Calendar.getInstance(); //获取系统日期 SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd"); java.sql.Datedate=java.sql.Date.valueOf(format.format(calendar .getTime()));//借书日期 calendar.add(calendar.DAY_OF_YEAR,days); //加上可借天数 java.sql.DatebackTime=java.sql.Date.valueOf(format.format(calendar .getTime()));//归还日期 Stringsql="Insertintotb_borrow(readerid,bookid,borrowTime,backTime,"+"operator)values("+readerForm.getId()+","+bookForm.getId() +",'"+date+"','"+backTime+"','"+operator+"')"; intfalg=conn.executeUpdate(sql); //执行更新语句conn.close(); //关闭数据库连接 returnfalg;publicintinsertBorrow(Reader管理员登录后,选择“图书借还”/“图书续借”命令,进入到图书续借页面,在该页面中的“读者条形码”文本框中输入读者的条形码(如20120224000001)后,单击“确定”按钮,系统会自动检索出该读者的基本信息和未归还的借阅图书信息。如果找到对应的读者信息,则将其显示在页面中,此时单击“续借”超链接,即可续借指定图书(即将该图书的归还时间延长到指定日期,该日期由续借日期加上该书的可借天数计算得出)。图书续借页面的运行结果如图15-13所示。图15-13图书续借页面15.5.4图书续借设计管理员登录后,选择“图书借还”/“图书续借”命令,进1.界面设计图书续借页面的设计方法同图书借阅页面类似,所不同的是,在图书续借页面中没有添加借阅图书的功能,而是添加了“续借”超链接。图书续借页面在Dreamweaver中的设计效果如图15-14所示。图15-14在Dreamweaver中的图书续借页面的设计效果在单击“续借”超链接时,还需要将读者条形码和借阅ID号一起传递到图书续借的Servlet控制类中,代码如下:<ahref="borrow?action=bookrenew&barcode=<%=barcode%>&id=<%=id%>">续借</a>1.界面设计2.关键代码实现图书续借功能与图书借阅类似,所不同的是实现图书续借的方法bookrenew()和保存图书续借信息的方法renew()。这两个方法的关键代码如下://图书续借的方法bookrenew()privatevoidbookrenew(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{//查询读者信息readerForm.setBarcode(request.getParameter("barcode")); //获取读者条形码 //根据读者条形码查询读者信息ReaderFormreader=(ReaderForm)readerDAO.queryM(readerForm); request.setAttribute("readerinfo",reader);//查询读者的借阅信息request.setAttribute("borrowinfo",borrowDAO.borrowinfo(request.getParameter("barcode")));if(request.getParameter("id")!=null){intid=Integer.parseInt(request.getParameter("id"));if(id>0){ //执行继借操作intret=borrowDAO.renew(id);if(ret==0){request.setAttribute("error","图书继借失败!");request.getRequestDispatcher("error.jsp").forward(request,response);}else{2.关键代码request.setAttribute("bar",request.getParameter("barcode"));request.getRequestDispatcher("bookRenew_ok.jsp").forward(request,response);}}}else{ request.getRequestDispatcher(“bookRenew.jsp”).forward(request,response);//保存图书续借信息的方法renew()publicintrenew(intid){//根据借阅ID查询图书ID的SQL语句Stringsql0="SELECTbookidFROMtb_borrowWHEREid="+id+""; ResultSetrs1=conn.executeQuery(sql0); //执行查询语句intflag=0;try{if(rs1.next()){ //获取可借天数Stringsql1="selectt.daysfromtb_bookinfobleftjoin"+ "tb_booktypetonb.typeid=t.idwhereb.id=" +rs1.getInt(1)+""; //获取可借天数的SQL语句ResultSetrs=conn.executeQuery(sql1); //执行查询语句intdays=0;try{if(rs.next()){days=rs.getInt(1); //获取可借天数}}catch(SQLExceptionex){//计算归还时间request.setAttribute("bar",rCalendarcalendar=Calendar.getInstance(); //获取系统日期SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");//设置日期格式//借书日期java.sql.Datedate=java.sql.Date.valueOf(format.format(calendar.getTime()));calendar.add(calendar.DAY_OF_YEAR,days); //加上可借天数java.sql.DatebackTime=java.sql.Date.valueOf(format.format(calendar.getTime()));//归还日期Stringsql="UPDATEtb_borrowSETbacktime='"+backTime+"'whereid="+id+""; //更新归还时间完成续借flag=conn.executeUpdate(sql); //执行更新语句}}catch(Exceptionex1){}conn.close(); //关闭数据库连接returnflag;}Calendarcalendar=Calendar.ge管理员登录后,选择“图书借还”/“图书归还”命令,进入到图书归还页面,在该页面中的“读者条形码”文本框中输入读者的条形码(如:20120224000001)后,单击“确定”按钮,系统会自动检索出该读者的基本信息和未归还的借阅图书信息。如果找到对应的读者信息,则将其显示在页面中,此时单击“归还”超链接,即可将指定图书归还。图书归还页面的运行结果如图15-15所示图15-15图书归还页面15.5.5图书归还设计管理员登录后,选择“图书借还”/“图书归还”命令,进1.界面设计图书归还页面的设计方法同图书续借页面类似,所不同的是,将图书续借页面中的“续借”超链接转化为“归还”超链接。在单击“归还”超链接时,也需要将读者条形码、借阅ID号和操作员一同传递到图书归还的Servlet控制类中,代码如下:<ahref="borrow?action=bookback&barcode=<%=barcode%>&id=<%=id%>&operator=<%=manager%>">归还</a>2.关键代码实现图书归还与实现图书续借类似,所不同的是实现图书归还的方法bookback()和执行归还操作的方法back()。下面分别介绍这两个方法。实现图书归还的方法bookback()实现图书归还的方法bookback()与实现图书续借的方法bookrenew()基本相同,所不同的是如果从页面中传递的借阅ID号大于0,则调用BorrowDAO类的back()方法执行图书归还操作,并且需要获取页面中传递的操作员信息。图书归还的方法bookback()的关键代码如下:intid=Integer.parseInt(request.getParameter("id"));Stringoperator=request.getParameter("operator"); //获取页面中传递的操作员信息if(id>0){//执行归还操作intret=borrowDAO.back(id,operator); //调用back()方法执行图书归还操作… //此处省略了其他代码}1.界面设计执行归还操作的方法back()执行归还操作的方法back()的具体代码如下:publicintback(intid,Stringoperator){//根据借阅ID获取读者ID和图书IDStringsql0="SELECTreaderid,bookidFROMtb_borrowWHEREid="+id+"";ResultSetrs1=conn.executeQuery(sql0); //执行查询语句intflag=0;try{if(rs1.next()){ Calendarcalendar=Calendar.getInstance();//获取系统日期SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");java.sql.Datedate=java.sql.Date.valueOf(format.format(calendar.getTime()));//还书日期intreaderid=rs1.getInt(1); //获取读者IDintbookid=rs1.getInt(2); //获取图书IDStringsql1="INSERTINTOtb_giveback(readerid,bookid,backTime"+ ",o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗器械临床试验质量管理规范化在2025年的临床试验监管政策变化趋势报告
- 2025年城市公园改造提升项目社会稳定风险评估与风险评估方法改进研究综述报告
- 生态农业可持续发展模式与技术创新报告
- 2025年元宇宙社交平台虚拟现实与虚拟现实教育游戏化应用研究报告
- 2025年元宇宙社交平台虚拟现实社交平台内容创新研究报告
- 共享办公空间增值服务在智慧旅游中的应用策略报告
- 2025年医院信息化建设电子病历系统用户体验优化研究报告
- 细胞因子靶点发现与验证技术2025年应用分析
- 2025年医药行业CRO模式下的临床试验法规更新与合规应对报告
- 2025届咸阳市重点中学英语七下期末调研模拟试题含答案
- 东航java面试题及答案编程
- 安全意识四不伤害培训课件
- 医学影像读片试题及答案
- API RP 1175-2022 管道泄漏检查计划管理
- 缝纫车间安全培训课件
- 交通安全设施施工安全风险辨识与防控表
- 搬运重物安全培训
- Unit 1 Section B 1a-2b 读写(2024新版)人教版七年级(下册)
- 无人机应急救援应用-深度研究
- 康复医学科治疗技术操作规范2023版
- 初三体育中考课外训练计划
评论
0/150
提交评论