JavaWeb课程设计图书馆管理系统.docx
- 文档编号:24392963
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:34
- 大小:725.98KB
JavaWeb课程设计图书馆管理系统.docx
《JavaWeb课程设计图书馆管理系统.docx》由会员分享,可在线阅读,更多相关《JavaWeb课程设计图书馆管理系统.docx(34页珍藏版)》请在冰豆网上搜索。
JavaWeb课程设计图书馆管理系统
JavaWeb课程设计
实验报告
班级:
计算机09-2
实验内容:
图书馆管理系统
成员:
赵伯涛44号(组长)
张宝红42号
黄海清22号
实验时间:
从2011年12月3日
至2011年12月9日
指导老师:
李启锐
一、实验目的。
1、在实践中巩固本学习所学的JavaWeb技术。
2、在实践中初步使用设计模式(GoF),体验设计模式带来的好处。
3、配合数据库的使用,实现一个功能完善的小型系统。
二、实验内容。
开发一个图书管理系统,实现图书馆的各种管理操作。
如图书入库、作废,借书证提供、挂失处理,图书的借出、归还、续借、丢失以及超期处理。
s
三、业务逻辑。
四、数据库设计。
根据业务逻辑设计出数据库。
表结构及关系如下图:
数据库导入文本保存在DataBaseSQL.txt文档中,数据库数据保存在Data.txt文档中。
五、框架结构。
采用了类似与MVC框架的框架结构,页面端使用了ExtJS技术(包含AJAX),增加了业务层和,数据库操作层。
控制器层调用业务层,业务层调用数据库操作层。
将控制,业务,数据库操作分别分层。
六、技术性代码。
(本实验的代码在Library.zip中)
1、tomcat数据库连接池技术。
在tomcat中的配置文件server.xml文件中配置项目Context标签,再加入Resource标签:
docBase="/home/sea/MyEclipse/LibraryOA/WebRoot" debug="0"> name="jdbc/webdb" auth="Container" type="javax.sql.DataSource" driverClassName="org.gjt.mm.mysql.Driver" url="jdbc: mysql: //localhost: 3306/LibraryOA" username="root" password="root" maxActive="50" maxIdle="20" maxWait="10000"/> 以上代码配置了数据库驱动,数据库地址,数据库用户名、密码,默认提供的连接数,最大提供的连接数,最长等待时间等参数。 2、Java中从连接池获取连接的类,使用了单例模式(来自GoF提出的设计模式): //DataBaseConnectionPond.java packagelibrary.util; importjava.sql.Connection; importjavax.sql.DataSource; //作者: 赵伯涛 publicclassDataBaseConnectionPond{ privatestaticDataBaseConnectionPonddbcp=null; privateDataSourceds=null; privateDataBaseConnectionPond()throwsException{ javax.naming.Contextctx=newjavax.naming.InitialContext(); ds=(DataSource)ctx.lookup("java: /comp/env/jdbc/webdb"); } publicConnectionGetConnettion()throwsException{ returnds.getConnection(); } publicstaticConnectiongetConnection()throwsException{ Connectionconn=null; if(dbcp==null){ Thread.sleep((long)(Math.random()*200)); synchronized(DataBaseConnectionPond.class){ if(dbcp==null){ dbcp=newDataBaseConnectionPond(); } } } try{ conn=dbcp.GetConnettion(); }catch(Exceptione){ } returnconn; } } 该类在整个项目部署的过程中只实例化了一个对象,故称单例。 可以通过该类的static函数getConnection()获取连接。 3、Dao(DataAccessObject)的模板化实现,使用了模板方法模式(来自GoF提出的设计模式): //SqlExecute.java packagelibrary.execute; importjava.sql.Connection; importlibrary.util.*; //作者: 赵伯涛 publicabstractclassSqlExecute{ publicConnectionconn; publicObjectresult; publicabstractvoidsetExecute()throwsException; publicObjectexecute(){ try{ conn=DataBaseConnectionPond.getConnection(); conn.setAutoCommit(false); setExecute(); mit(); }catch(Exceptione){ try{ conn.rollback(); }catch(Exceptionee){ } e.printStackTrace(); }finally{ try{ conn.close(); }catch(Exceptione){ } } returnresult; } } 该类是一个抽象类,必须通过继承该类来实现具体的功能,其中的execute()函数是一个模板方法,将try-catch-finaly、获取connection及connection的事务处理提取出来,具体Dao的功能应该写在setExecute()函数中,在具体实现Dao的功能的时候可以不用重复这些代码,方便程序员编码,也方便程序员维护程序。 下面举例使用这个模板类: //ReaderChangePasswordDao.java packagelibrary.dao; importjava.sql.PreparedStatement; importlibrary.execute.SqlExecute; importlibrary.model.ReaderModel; //作者: 赵伯涛 publicclassReaderChangePasswordDaoextendsSqlExecute{ privateReaderModelrm; //传入readerID,password,password2(旧密码) //返回影响行数 publicReaderChangePasswordDao(ReaderModelrm){ this.rm=rm; } @Override publicvoidsetExecute()throwsException{ Stringsql="updateReaderssetpassword=? wherereaderID=? andpassword=? "; PreparedStatementps=conn.prepareStatement(sql); ps.setString(1,rm.getPassword()); ps.setInt(2,rm.getReaderID()); ps.setString(3,rm.getPassword2()); this.result=ps.executeUpdate(); } } 上面的类继承了SqlExecute类,重写了它的setExecute()函数,通过构造函数传入操作时需要的参数,在写代码的时候可以更加专注于数据库的操作,因为其它操作由模板类做好了。 这对写一个数据库操作或许没什么大不了的,但是一个项目里边数据库操作肯定是几十个,几百个,甚至几千个,使用模板类减少的编码量是非常客观的。 下面举例使用ReaderChangePasswordDao类: //来自UserCommonService.java的部分代码 //读者修改密码 publicbooleanreaderChangePassword(intreaderID,StringnewPassword, StringoldPassword){ ReaderModelrm=newReaderModel(); rm.setReaderID(readerID); rm.setPassword(newPassword); rm.setPassword2(oldPassword); ReaderChangePasswordDaorcpd=newReaderChangePasswordDao(rm); intcount=(Integer)rcpd.execute(); if(count>0){ returntrue; }else{ returnfalse; } } 注意: 使用Dao的时候调用的应该是它的execute()方法(在抽象类中)。 4、时间显示 varcTime=newDate();//初始化日期 varmyYear=cTime.getFullYear();//年 varmyMonth=cTime.getMonth()+1;//月 varmyDate=cTime.getDate();//日 //获得时分秒 varmyHour=cTime.getHours();//时 varmyMinute=cTime.getMinutes();//分 varmySecond=cTime.getSeconds();//秒 if(myHour<10){//判断如果时钟小于10就显示两位,前一位用0代替 myHour='0'+myHour; } if(myMinute<10){//判断如果分钟小于10就显示两位,前一位用0代替 myMinute='0'+myMinute; } if(mySecond<10){//判断如果分秒钟小于10就显示两位,前一位用0代替 mySecond='0'+mySecond; } vartime=time=myYear+'/'+myMonth+'/'+myDate+''+myHour+': '+myMinute+': '+mySecond;//格式化时间 vartimer=setInterval(function(){//定义一个时钟,周期为1秒 varcTime=newDate(); varmyYear=cTime.getFullYear();//支持火狐 varmyMonth=cTime.getMonth()+1;//外国都是以0开头为一月 varmyDate=cTime.getDate(); //获得时分秒 varmyHour=cTime.getHours(); varmyMinute=cTime.getMinutes(); varmySecond=cTime.getSeconds(); if(myHour<10){ myHour='0'+myHour; } if(myMinute<10){ myMinute='0'+myMinute; } if(mySecond<10){ mySecond='0'+mySecond; } varcmp=Ext.getCmp("timer"); time=myYear+'/'+myMonth+'/'+myDate+''+myHour+': '+myMinute+': '+mySecond; cmp.setValue(time); },1000); 5、登录控制 //登录界面 Ext.onReady(function(){ Ext.QuickTips.init(); varform=newExt.Panel({//登录验证的form autoTabs: true, activeTab: 0, deferredRender: false, border: false, bodyStyle: "background-color: RGB(193,223,232);padding: 0px0px0px0px;", items: [{ xtype: 'box', width: 385, height: 80, autoEl: { tag: 'img', src: 'icons/borrowbooks.jpg' } },{ xtype: 'panel', bodyStyle: 'background-color: RGB(193,223,232);', layout: 'hbox', items: [{ xtype: 'panel', bodyStyle: 'background-color: RGB(193,223,232);', border: false, width: 120, height: 150, items: [{ xtype: 'panel', layout: 'hbox', border: false, bodyStyle: 'background-color: RGB(193,223,232);padding: 10px0px0px10px', items: [{ xtype: 'box', width: '30', height: '30', autoEl: { tag: 'img', src: 'icons/0.png' } },{ xtype: 'panel', border: false, bodyStyle: 'background-color: RGB(193,223,232);padding: 5px0px0px0px', items: [{ xtype: 'displayfield', value: " ;'onclick=viewWindow('"+l.names[0]+"')> }] }] },{ xtype: 'panel', layout: 'hbox', border: false, bodyStyle: 'background-color: RGB(193,223,232);padding: 10px0px0px10px', items: [{ xtype: 'box', width: '30', height: '30', autoEl: { tag: 'img', src: 'icons/6.png' } },{ xtype: 'panel', border: false, bodyStyle: 'background-color: RGB(193,223,232);padding: 5px0px0px0px', items: [{ xtype: 'displayfield', value: " ;'onclick=viewWindow('"+"找回密码"+"')> }] }] }] },{ xtype: 'panel', border: false, width: 320, height: 150, bodyStyle: 'background-color: RGB(193,223,232);', items: [{ xtype: 'panel', layout: 'form', border: false, items: [{ xtype: 'form', layout: 'form', id: 'loginno', labelWidth: 30, bodyStyle: 'background-color: RGB(193,223,232);padding: 15px0px0px0px', border: false, defaults: { width: 200 }, items: [{ xtype: 'textfield', fieldLabel: '编号', allowBlank: false }] },{ xtype: 'form', layout: 'form', id: 'loginpassword', labelWidth: 30, bodyStyle: 'background-color: RGB(193,223,232);padding: 10px0px0px0px', border: false, defaults: { width: 200 }, items: [{ xtype: 'textfield', fieldLabel: '密码', inputType: 'password', allowBlank: false }] }] }] }] }] }); functionlogin(){//登录验证函数 varformNo=Ext.getCmp("loginno"); varformPassword=Ext.getCmp("loginpassword"); varusername=formNo.items.items[0]; varpassword=formPassword.items.items[0]; if(username.getValue().trim()! =""&&password.getValue().trim()! =""){ Ext.Ajax.request({ url: 'servlet/LoginServlet', success: function(response){ varresult=Ext.decode(response.responseText); if(result.success){ location.href="index.html"; loginWindow.close(); }else{ Ext.Msg.alert('提示',result.msg,function(){ formPassword.getForm().reset(); }); }; }, params: { cmd: 'login', username: username.getValue().trim(), password: password.getValue().trim() }, scope: this }); }else{ Ext.Msg.alert('提示','编号和密码都不能为空! '); } } varloginWindow=newExt.Window({//登录窗口 title: '用户登录', layout: 'fit', width: 400, height: 240, shadow: true,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaWeb 课程设计 图书馆 管理 系统