《JavaWeb课程设计——图书馆管理系统.pdf》由会员分享,可在线阅读,更多相关《JavaWeb课程设计——图书馆管理系统.pdf(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、JavaWebJavaWeb 课程设计课程设计实验报告实验报告班级:班级:实验内容:实验内容:成员:成员:计算机 092图书馆管理系统赵伯涛 44 号(组长)张宝红 42 号黄海清 22 号实验时间:实验时间:从 2011 年 12 月 3 日至 2011 年 12 月 9 日指导老师:指导老师:一、实验目的。一、实验目的。1、在实践中巩固本学习所学的 JavaWeb 技术。1/33李启锐2、在实践中初步使用设计模式(GoF),体验设计模式带来的好处.3、配合数据库的使用,实现一个功能完善的小型系统.二、实验内容二、实验内容.开发一个图书管理系统,实现图书馆的各种管理操作。如图书入库、作废,借
2、书证提供、挂失处理,图书的借出、归还、续借、丢失以及超期处理。s三、业务逻辑。三、业务逻辑。2/33四、数据库设计。四、数据库设计。根据业务逻辑设计出数据库。表结构及关系如下图:3/33数据库导入文本保存在 DataBaseSQL.txtDataBaseSQL.txt 文档中,数据库数据保存在Data.txtData.txt 文档中。五、框架结构。五、框架结构。4/33采用了类似与 MVC 框架的框架结构,页面端使用了 ExtJS 技术(包含AJAX),增加了业务层和,数据库操作层.控制器层调用业务层,业务层调用数据库操作层。将控制将控制,业务,数据库操作分别分层业务,数据库操作分别分层。六、
3、技术性代码。六、技术性代码。(本实验的代码在 LibraryLibrary。zipzip 中)1、tomcat 数据库连接池数据库连接池技术。在 tomcat 中的配置文件 server.xmlserver.xml文件中配置项目 Context 标签,再加入 Resource 标签:。.Context path=”LibraryOA。docBase=/home/sea/MyEclipse/LibraryOA/WebRoot”。.debug=0”5/33ResourceResourcename=”jdbc/webdbname=”jdbc/webdbauth=”Containerauth=”Con
4、tainertype=javaxtype=javax。sqlsql。DataSource”。DataSource”driverClassName=orgdriverClassName=org。gjtgjt。mmmm。mysql.Driver”。mysql.Driver”url=”jdbc:url=”jdbc:mysqlmysql:/localhost:3306/LibraryOA/localhost:3306/LibraryOAusername=rootusername=rootpassword=rootpassword=rootmaxActive=”50”maxActive=”50”maxI
5、dle=20”maxIdle=20”maxWait=”10000”/maxWait=”10000”/以上代码配置了数据库驱动,数据库地址,数据库用户名、密码,默认提供的连接数,最大提供的连接数,最长等待时间等参数。2、Java 中从连接池获取连接从连接池获取连接的类,使用了单例模式单例模式(来自 GoF 提出的设计模式):/DataBaseConnectionPond.java/DataBaseConnectionPond.javapackage library.util;import java。sql.Connection;import javax.sql.DataSource;/作者:赵伯
6、涛public class DataBaseConnectionPond private static DataBaseConnectionPond dbcp=null;private DataSource ds=null;privateprivate DataBaseConnectionPond()throws Exception javax.naming。Context ctx=new javax。naming。InitialContext();ds=(DataSource)ctx。lookup(java:/comp/env/jdbc/webdb);public Connection Ge
7、tConnettion()throws Exception return ds。getConnection();public static Connection getConnection(public static Connection getConnection()throws Exception 6/33Connection conn=null;if(dbcp=null)Thread.sleep((long)(Math。random()200);synchronized(DataBaseConnectionPond.class)if(dbcp=null)dbcp=new DataBase
8、ConnectionPond();try conn=dbcp。GetConnettion();catch(Exception e)return conn;该类在整个项目部署的过程中只实例化了一个对象,故称单例.可以通通过该类的过该类的 staticstatic 函数函数 getConnectiongetConnection()获取连接获取连接。3、DaoDao(DataData AccessAccess ObjectObject)的模板化实现)的模板化实现,使用了模板方法模式模板方法模式(来自 GoF 提出的设计模式):/SqlExecute.java/SqlExecute.javapacka
9、ge library.execute;import java.sql。Connection;import library。util。*;/作者:赵伯涛public abstractabstract class SqlExecute public Connection conn;public Object result;public abstract void setExecutepublic abstract void setExecute()throws Exception)throws Exception;public Object execute()try conn=DataBaseCo
10、nnectionPond。getConnection();conn.setAutoCommit(false);setExecute()setExecute();7/33conn。commit();catch(Exception e)try conn。rollback();catch(Exception ee)e。printStackTrace();finally try conn。close();catch(Exception e)return result;该类是一个抽象类抽象类,必须通过继承该类来实现具体的功能,其中的execute(execute()函数是一个模板方法函数是一个模板方法,
11、将 trycatch-finaly、获取 connection及 connection 的事务处理提取出来,具体具体 DaoDao 的功能应该写在的功能应该写在 setExecutesetExecute()函数中函数中,在具体实现在具体实现 DaoDao 的功能的时候可以不用重复这些代码,方便程的功能的时候可以不用重复这些代码,方便程序员编码序员编码,也方便程序员维护程序也方便程序员维护程序。下面举例使用这个模板类:/ReaderChangePasswordDao.java/ReaderChangePasswordDao.javapackage library。dao;import java。
12、sql。PreparedStatement;import library.execute.SqlExecute;import library.model.ReaderModel;/作者:赵伯涛public class ReaderChangePasswordDao extends SqlExecute private ReaderModel rm;/传入 readerID,password,password2(旧密码)/返回 影响行数public ReaderChangePasswordDaoReaderChangePasswordDao(ReaderModel rm)this。rm=rm;8
13、/33OverrideOverridepublic void setExecutesetExecute()()throws Exception String sql=update Readers set password=?where readerID=?and password=?;PreparedStatement ps=conn。prepareStatement(sql);ps.setString(1,rm.getPassword();ps.setInt(2,rm.getReaderID());ps.setString(3,rm。getPassword2());this。result=p
14、s.executeUpdate();上面的类继承了继承了 SqlExecuteSqlExecute 类类,重写了它的重写了它的 setExecute()setExecute()函数函数,通过构通过构造函数传入操作时需要的参数造函数传入操作时需要的参数,在写代码的时候可以更加专注于数据库的操作,因为其它操作由模板类做好了.这对写一个数据库操作或许没什么大不了的,但是一个项目里边数据库操作肯定是几十个,几百个,甚至几千个,使用模板类减少的编码量是非常客观的。下面举例使用ReaderChangePasswordDao 类:/来自来自 UserCommonService.javaUserCommonS
15、ervice.java 的部分代码的部分代码/读者修改密码public boolean readerChangePassword(int readerID,StringnewPassword,String oldPassword)ReaderModel rm=new ReaderModel();rm。setReaderID(readerID);rm.setPassword(newPassword);rm.setPassword2(oldPassword);ReaderChangePasswordDao rcpd=new ReaderChangePasswordDao(rm);int count
16、=(Integer)rcpd.executercpd.execute()();if(count 0)return true;else return false;9/33注意:使用使用 DaoDao 的时候调用的应该是它的的时候调用的应该是它的 execute()execute()方法方法(在抽象类中)(在抽象类中)。4、时间显示/获得时分秒var myHour=cTime。getHours();var myMinute=cTime.getMinutes();var mySecond=cTime.getSeconds();if(myHour 10)myHour=0+myHour;var myYe
17、ar=cTime.getFullYear();/支持火狐var myMonth=cTime。getMonth()+1;/外国都是以 0 开头为一月var myDate=cTime。getDate();/获得时分秒var myHour=cTime。getHours();/时var myMinute=cTime。getMinutes();/分var mySecond=cTime。getSeconds();/秒if(myHour 10)/判断如果时钟小于 10 就显示两位,前一位用 0 代替if(myMinute 10)/判断如果分钟小于 10 就显示两位,前一位用 0 代替if(mySecond
18、10)/判断如果分秒钟小于 10 就显示两位,前一位用 0 代替var time=time=myYear+/+myMonth+/+myDate+myHour+:+myMinute+:var timer=setInterval(function()/定义一个时钟,周期为 1 秒var cTime=new Date();mySecond=0+mySecond;myMinute=0+myMinute;myHour=0+myHour;var myYear=cTime.getFullYear();/年var myMonth=cTime.getMonth()+1;/月var myDate=cTime。ge
19、tDate();/日var cTime=new Date();/初始化日期+mySecond;/格式化时间10/33if(myMinute 10)if(mySecond 10)var cmp=Ext.getCmp(timer);time=cmp.setValue(time);mySecond=0+mySecond;myMinute=0+myMinute;myYear+/+myMonth+/+myDate+myHour+:+myMinute+:+mySecond;,1000);5、登录控制/登录界面Ext.onReady(function()Ext。QuickTips.init();var fo
20、rm=new Ext。Panel(/登录验证的 form autoTabs:true,activeTab:0,deferredRender:false,border:false,bodyStyle:”backgroundcolor:RGB(193,223,232);padding:0px 0px 0px 0px;,items:xtype:box,width:385,height:80,autoEl:xtype:panel,bodyStyle:backgroundcolor:RGB(193,223,232);,layout:hbox,items:xtype:panel,bodyStyle:bac
21、kground-color:RGB(193,223,232);,border:false,width:120,tag:img,src:icons/borrowbooks.jpg,11/33height:150,items:xtype:panel,layout:hbox,border:false,bodyStyle:backgroundcolor:RGB(193,223,232);padding:10px 0px 0pxitems:xtype:box,width:30,height:30,autoEl:xtype:panel,border:false,bodyStyle:backgroundco
22、lor:RGB(193,223,232);padding:5px 0pxitems:xtype:displayfield,tag:img,src:icons/0。png10px,,0px 0px,value:”a href=javascript:;onclick=viewWindow(+l.names0+”)font size=2查阅xtype:panel,layout:hbox,border:false,bodyStyle:backgroundcolor:RGB(193,223,232);padding:10px 0px 0pxitems:xtype:box,width:30,height:
23、30,autoEl:xtype:panel,border:false,tag:img,src:icons/6。png书目/fontfont size=2找回密码/a,xtype:panel,border:false,width:320,height:150,bodyStyle:backgroundcolor:RGB(193,223,232);,items:xtype:panel,layout:form,border:false,items:,xtype:form,layout:form,id:loginpassword,labelWidth:30,bodyStyle:background-co
24、lor:RGB(193,223,232);padding:border:false,xtype:form,layout:form,id:loginno,labelWidth:30,bodyStyle:backgroundcolor:RGB(193,223,border:false,defaults:,items:xtype:textfield,fieldLabel:编号,allowBlank:falsewidth:200232);padding:15px 0px 0px 0px,10px 0px 0px 0px,13/33 defaults:,items:xtype:textfield,fie
25、ldLabel:密码,inputType:password,allowBlank:falsewidth:200 );function login()/登录验证函数var formNo=Ext.getCmp(”loginno”);var formPassword=Ext。getCmp(loginpassword);var username=formNo。items.items0;var password=formPassword.items.items0;if(username。getValue().trim()!=”&password.getValue()。trim()!=”)Ext.Ajax
26、.request(url:servlet/LoginServlet,success:function(response)var result=Ext.decode(response。responseText);,params:,scope:thiscmd:login,username:username。getValue().trim(),password:password。getValue()。trim()if(result.success);location.href=index.html;loginWindow.close();Ext.Msg。alert(提示,result。formPas
27、sword。getForm().reset(););elsemsg,function();else 14/33);Ext。Msg。alert(提示,编号和密码都不能为空!);var loginWindow=new Ext。Window(/登录窗口 title:用户登录,layout:fit,width:400,height:240,shadow:true,shadowOffset:5,plain:true,maximizable:false,draggable:false,closable:false,resizable:false,animateTarget:document。body,it
28、ems:form,keys:/给登录按钮添加事件key:Ext。EventObject。ENTER,fn:function(),scope:thislogin();,buttons:icon:icons/accept。png,text:登录,handler:function()login();,icon:icons/rss_go。png,text:重置,handler:function()var formNo=Ext。getCmp(loginno”);var formPassword=Ext.getCmp(”loginpassword”);formNo。getForm()。reset();formPassword.getForm()。reset(););loginWindow。show();/显示登录窗口15/33七、效果截图七、效果截图.16/3317/3318/3319/3320/3321/3322/3323/3324/3325/3326/3327/3328/3329/3330/3331/33八、实验心得。八、实验心得。通过本次实验,我们不单单巩固了我们的Jsp 技术,同时业务逻辑能力32/33得到了提高,能通过业务逻辑设计一个数据库,并且在实现业务逻辑的过程中初步使用了 GoF 提出的设计模式,同时也体验到它带来的好处。在共同合作开发的过程中,学会如何分工及沟通。33/33