还剩56页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
题目图书管理系统—流通模块的设计与实现学生姓名邢鹏飞学号1118014023所在学院数学与计算机科学学院专业班级计算机科学与技术本科1101班指导教师李军______完成地点陕西理工学院2015年05月27日本科毕业设计任务书院(系)名数学与计算机科学学院专业班级计算机科学与技术(计本1101姓名邢鹏飞
1、毕业设计题目图书管理系统—流通模块的设计与实现
1、毕业设计工作日2014年11月27日起至2015年6月20日止
1、毕业设计进行地点陕西理工学院
1、毕业设计内容要求本课题要求开发一个图书馆管理系统,该系统主要内容及功能包括书籍数据库要按照中图分类要求进行分类创建;图书管理业务分两大模块,即采编与流通采编模块分为采购与编目两个子模块在采购子模块中完成书籍的采购计划编制、组织采购、图书资产管理、书籍报废等功能;编目子模块要求根据采购结果完成每种书籍按册进行编目并进行入库中央库、专业阅览室等操作等功能流通模块分为读者管理与借阅管理两个子模块读者管理模块要完成读者的开销户管理、读者借阅历史状态查询、读者的信誉记录管理等功能;图书的借阅管理模块必须完成馆藏图书检索、书籍状态查询、借还操作等功能系统角色管理系统角色是指参与系统的人员包括图书馆工作人员和读者在对系统进行操作时充当的角色,不同角色有不同的系统操作权限;系统应根据图书馆的管理办法合理确定角色,并将不同人员赋予不同的角色数据维护模块该模块主要对数据库进行备份与数据恢复功能本课题要求两人合作完成,两人共同设计数据库,一人完成采编模块与系统角色管理,另一人完成流通模块与系统维护模块开题时间2015年3月5日,并与此前提交开题报告课题完成时间2015年5月30日答辩时间2015年6月10日前指导教师系教研室计算机科学与技术系(教研室)主任签名批准日期2015-12-20接受设计任务开始执行日期2015-1-15学生签名基于J2EE的图书管理系统--流通模块的设计与实现邢鹏飞(陕理工数学与计算机科学学院计算机科学与技术专业计本1101班,陕西汉中723000)指导老师李军[摘要]随着信息技术的不断发展计算机技术已经在各行各业得到广泛的应用图书馆作为一种信息资源的集散地,图书借阅频繁,用户管理多变,包含大量的信息数据,因此需要一个完善的图书管理系统来实现对读者信息、图书借阅、用户检索进行统
一、实时管理,达到各类用户的需求本文设计了图书管理系统的详细功能,其中功能包括读者管理、图书管理、借阅管理、书刊检索等功能对于这些功能又详细设计了每个功能的具体实现每个业务功能之间又是彼此联系并相互作用系统包含管理员、读者用户两部分,分别有不同的使用权限,管理员对数据库进行操作,完成借阅、添加、删除、等各功能;用户对数据库进行查询,完成查询、修改等功能[关键词]图书管理;需求;数据库;CirculationofbooksmanagementsystembasedonJ2EEmoduledesignandimplementationXingPengfei(Grade01Class11MajorComputerScienceandTechnologySchoolofMathematicsandcomputerScienceShaanxiUniversityofTechnologyHanzhong723000Shaanxi)Tutor:LIJUNAbstract Withthedevelopmentofinformationtechnologycomputertechnologyhasbeenwidelyusedinallwalksoflife.Libraryasakindofinformationresourcecenterbecauselibraryhaslotsofuserdatacontainsalargeamountofinformationsoweneedaperfectbooksmanagementsystemtoimplementtheinformationtoreadersborrowbookstheuserretrievalundertakeunityreal-timemanagementandmeetthedemandofallkindsofusers.Inthispaperthedesignofbooksmanagementsystemfunctionindetailwhichfeaturesincludethereadermanagementlibrarymanagementlibrarymanagementbooksretrievalandotherfunctions.Forthesefunctionsandthedetaileddesignontheconcreterealizationofeachfunction.Eachbusinessfunctionisbetweencontactandinteractionwitheachother.Systemincludeadministratorandreaderstwopartsrespectivelyhavedifferentusagerightsadministratorofdatabaseoperationslendingadddeleteandsoonvariousfunctions.Theusertoquerythedatabasequerymodifyandotherfunctions.Keywords:Booksmanagementsystem;demand;database;目录TOC\o1-3\h\z\u1引言12需求分析与可行性分析
22.1可行性分析
22.
1.1技术可行性
22.
1.2操作可行性
22.2需求分析
22.
2.1数据需求
22.
2.2功能需求
22.
2.3系统流程图23概要设计
43.1系统目标
43.2系统结构功能分析44数据库设计
54.1数据库概念结构设计
54.2数据库逻辑结构设计65详细设计
95.1登录页
95.2账号维护
115.
2.1修改密码
115.
2.2添加管理员
145.
2.3重置管理员密码
165.3用户管理
185.
3.1添加用户
185.4图书管理
215.
4.1添加图书
215.5借阅管理
235.
5.1用户借书
235.
5.2用户还书
255.
5.3缴纳罚款276系统调试与测试
296.1测试的主要方法
296.
1.1管理员登录
296.
1.2重置管理员密码
296.
1.3添加读者
296.
1.4添加图书
296.
1.5读者借书
306.
1.6读者还书
306.
1.7欠款缴纳30总结31致谢32参考文献33附录A外文翻译34附录B系统使用说明书531引言图书作为信息的一种载体,仍是人们获得知识的一种重要途径,因而作为图书管的运行情况则关系到知识的传播速度问题旧的图书馆管理模式完全是人工操作,从新书采购、编目、入库,检索,借阅、归还、无一不是人工处理,需要大量劳动力与工作量,人为原因造成一些失误也再所难免当读者想要借阅一本书时,首先要查询大量书卡,而且需要一定的图书管理知识在借阅时还要填写许多相关卡片,使得图书馆的管理效率低下,图书流通速度较慢,因而从一定程度上也影响了知识的传播速度图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,因此有大量信息数据需要进行管理,然而,有很多图书馆都是初步使用计算机进行图书管理以前对信息管理的主要方式是基于文本、表格等纸介质的处理手段,对于图书借阅情况统计采用对借书卡的人工检查,借阅天数等用人工计算、手抄进行数据信息处理工作量大,容易出错;由于数据繁多,容易丢失,且不易查找越来越多的读者希望通过网络方便、快捷地进行图书查阅、借阅传统管理方法必然被以计算机为基础的信息管理所取代因此开发图书信息管理系统利用计算机对图书资料以及读者进行管理能够提高工作效率提高图书利用率充分发挥图书的作用读者通过网络及时方便地查寻所需的图书;管理人员利用强大的管理功能方便的管理图书管的图书信息、图书管理的读者信息通过统计图书的借阅情况及时了解库存把握读者对图书需求方向以满足读者对各类图书的需求为图书馆的业务发展和建设起指导作用2需求分析与可行性分析
2.1可行性分析
2.
1.1技术可行性技术可行性要考虑现有的技术条件是否能够顺利完成开发工作,软硬件配置是否满足开发的需求等本图书管理系统用的是JAVA语言开发,调试相对简单,当前的计算机硬件配置也完全能满足开发的需求,因此在技术上是绝对可行的软件方面由于目前单机模式相对发展成熟,故软件的开发平台成熟可行它们速度快、容量大、可靠性能高、价格低,完全能满足系统的需求
2.
1.2操作可行性 在设计系统的过程中,充分考虑到管理人员和用户的习惯界面风格使用简单大方形式呈现使用方便,而无需进行任何软件的安装,操作简单;按权限使用并提供多种查询手段,在操作上可行
2.2需求分析
2.
2.1数据需求数据主要包括图书数据和用户数据,图书数据包括图书基本数据、图书借阅历史数据、丢失数据、图书借阅数据、欠款数据用户数据包括用户数据、管理员数据系统对数据的操作主要围绕用户和图书操作的方法分为借阅、查询、删除、修改、续借等数据操作
2.
2.2功能需求系统的总目标是实现图书管理的系统化、自动化、规范化系统已经实现的图书管理模块用户端系统登录、信息维护、书刊借阅、预约通知、书刊检索书刊借阅包括当前借阅、历史借阅、图书丢失、罚款记录、图书证挂失当前借阅包括续借与图书挂失书刊检索包括一般检索和复杂检索检索结果包括可否预约管理端系统登录、信息维护、用户管理、图书管理、借阅管理信息维护包括修改密码、添加管理员、管理员列表、重置用户密码、重置管理员密码用户管理包括添加用户和用户列表图书管理包括添加图书和图书列表借阅管理包括用户还书、用户借书、缴纳欠款
2.
2.3系统流程图图
2.1管理员端流程图图
2.2读者端流程图3概要设计
3.1系统目标该系统主要建立一个基于B/S模式的图书馆管理系统面对当今很多图书馆仍是人工管理带来的检索速度慢效率低借阅归还图书量大图书统计工作量大藏书不能完成及时更新的问题该系统可以跟系统的三种用户类型的使用实现:
1.对于读者在本系统的应用下可实现按照各种方式如:书名出版社作者查询图书馆的藏书清单方便借阅图书、查阅借阅历史、续借图书、归还图书挂失图书、缴纳罚款、修改密码等
2.对于图书馆工作人员普通管理员能够实现方便的添加用户、添加图书、对图书进行查询、用户进行查询、进行借书、还书、缴纳罚款、重置用户密码等功能便捷的对图书信息进行修改、删除等操作对读者信息进行相关修改删除管理等操作
3.对于系统管理员可以对系统用户进行添加、修改、删除、权限设置等操作
3.2系统结构功能分析绘制系统功能图的过程,实际上就是对系统功能模块进行分解设计的过程,即合理地将数据流程图转变为所需要的系统结构图 系统结构图将会使读者和用户能直观的了解系统的结构模式,理解系统的各个功能的结构,能很好地方便用户使用和理解整个系统图
3.1系统业务流程图4数据库设计
4.1数据库概念结构设计1图书信息(编号,图书名称,作者,出版社,ISBN号,价格,状态) 2图书借阅历史读者ID,图书编号借出时间,应还时间,状态 3用户信息(编号,姓名,年龄,性别,班级,学院,权限,密码)4丢失信息读者ID,图书编号借出时间 5图书借阅信息(读者ID,图书编号借出时间,应还时间)6管理员信息(管理ID,管理密码,管理级别)7欠款信息(欠款ID,读者ID,图书编号借出时间,应还时间,欠款)图
4.1图书表E-R图图
4.2图书借阅历史表E-R图图
4.3用户信息表E-R图图
4.4图书丢失表E-R图图
4.5图书借阅表E-R图图
4.6管理员表E-R图图
4.7欠款表E-R图
4.2数据库逻辑结构设计图书信息表结构设计图书信息表主要用于存储图书馆中所藏图书的相关信息其中的相关信息是在图书入库时由图书管理员进行添加完善此表主要用于读者和图书管理员对馆中图书的查询系统用户根据图书的某个属性进行查询便可得知图书的其他相关信息表的具体结果如下: 表
4.1图书信息表字段名称字段类型字段长度可否为空说明bNobNameauthorpublishisbnpricestatusvarchar2varchar2varchar2varchar2varchar2varchar2varchar2205030200502010否否否否否否否图书编号书名作者出版社ISBN价格状态用户信息表结构设计学生用户信息表的设计是为了图书馆管理员对用户进行管理其中用户StudentNO号码都是唯一的是用户在借阅图书时需要输入对读者身份进行识别的信息读者班级、院系等信息是为了与读者进行联系借阅权限决定了读者是否可借阅图书表的具体结构设计如下:表
4.2用户信息表字段名称字段类型字段长度可否为空说明studentNostudentNameagegenercladepartmentpermittedpwdvarchar2varchar2intvarchar2varchar2varchar2varchar2varchar22050865050120否否否否否否否否学号姓名年龄性别班级院系状态密码管理员信息表结构设计此表的设计是为了用户借阅图书提供支持管理用户的一些罚款、借阅、挂失、欠款、等操作表的具体结构设计如下:表
4.3管理员信息表字段名称字段类型字段长度可否为空说明adNopwdidtvarchar2varchar2varchar220202否否否管理员ID管理员密码管理级别图书借阅历史表结构设计:历史表是一个记录表,里面记录了用户自己的所有借阅记录用户可以根据往日借阅记录来对自己进行借阅决策表
4.4图书借阅历史表字段名称字段类型字段长度可否为空说明studentNobNoborrowDategiveDatestatusvarchar2varchar2datedatevarchar22020505020否否否否否学号图书编号借书日期还书日期状态丢失信息表丢失信息表也是一个记录表,里面记录了用户由于个人原因,导致图书丢失的记录表
4.5丢失信息表字段名称字段类型字段长度可否为空说明studentNobNoborrowDatevarchar2varchar2date202020否否否学号图书编号借阅日期图书借阅信息表借阅信息表里面保存着当前的借阅记录,一旦用户还书之后这条记录随后被清除,并且加到历史记录表中表
4.6图书借阅信息表字段名称字段类型字段长度可否为空说明studentNobNoborrowDatetoGiveDatevarchar2varchar2datedate20205050否否否否学号图书编号借阅日期应还日期欠款信息表欠款信息表里面记录了用户的当前欠款表
4.7欠款信息表字段名称字段类型字段长度可否为空说明idstudentNobNoborrowDatetogivedategiveDatemoneyvarchar2varchar2varchar2datedatedatevarchar220202050505020否否否否否否否欠款ID学号图书编号借书日期应还日期还书日期欠款金额5详细设计
5.1登录页用户登录系统后,可以进入系统的主界面,欢迎页面显示系统的简介信息,左面是功能菜单,管理员用户可以看见系统模块图
5.1管理员登录界面实现代码%@pagecontentType=text/html;charset=gbk%%@pageimport=java.util.*com.hw.datamodel.User%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetlinkhref=/images/globalstyle.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckAdmin{varuname=document.login.uname.value;//得到输入的登录名varpwd=document.login.pwd.value;//得到输入的密码ifuname.trim=={//用户名为空的情况alert请填写用户名!!!;//弹出提示对话框login.uname.focus;//用户名文本框得到输入焦点return;//返回}ifpwd=={//密码为空的情况alert请填写密码!!!;//弹出提示对话框login.pwd.value=;//将密码框清空login.pwd.focus;//密码文本框得到输入焦点return;//返回}ifpwd.trim.length6{alert密码不能包含空格且长度不得小于6位!!!;login.pwd.value=;//将密码框清空login.pwd.focus;//密码框得到输入焦点return;//返回}document.login.submit;//提交登陆表单}/script/headbodydivid=fatherdivid=loginform%UseradName=Usersession.getAttributeuser;//得到当前登陆的学生学号ifadName==null{%登陆管理系统formname=loginaction=/LibraryDemo/admin/loginmethod=posttabletrtdalign=right用户名/tdtdalign=leftinputtype=textname=uname/br/td/trtrtdalign=right密nbsp;nbsp;nbsp;nbsp;码/tdtdalign=leftinputtype=passwordname=pwdbr/td/trtrtd/tdtdalign=centerinputtype=hiddenname=actionvalue=login!--inputtype=buttonvalue=登陆onclick=checkAdmin/--imgsrc=/images/dla.gifid=dlonclick=checkAdminonmouseover=document.all.dl.src=/images/dlb.gifonmouseout=document.all.dl.src=/images/dla.gifonmousedown=document.all.dl.src=/images/dlc.gifstyle=cursor:hand/nbsp;nbsp;nbsp;nbsp;imgsrc=/images/cza.gifid=czonclick=resetonmouseover=document.all.cz.src=/images/czc.gifonmouseout=document.all.cz.src=/images/cza.gifonmousedown=document.all.cz.src=/images/czc.gifonmouseup=document.all.cz.src=/images/czc.gifstyle=cursor:hand/td/tr%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null{%trtdcolspan=2fontcolor=redsize=2%=message%/font/td/tr%}%/table/form%}else{out.printlnadName.getUname+,您好!br/br/欢迎进入管理端系统!!!;out.printlnbr/br/ahref=accountManage/adManagetarget=;out.printlnbottomFrame【账号维护】/a;out.printlnahref=admin/logout【注销】/a;}%/divdivid=message提示ulli管理员的用户名和密码由超级管理员设置/librbrli保存好密码,不要向任何人透露密码/librbrli登陆进入系统可修改密码/librbrli如果忘记密码请持有效证件到超级管理员处取回/li/ul/div/div/body/html
5.2账号维护
5.
2.1修改密码图
5.2管理员修改密码实现代码%@pagecontentType=text/html;charset=gbk%%@pageimport=java.util.*com.hw.datamodel.User%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckAdChangePwd{varoldPwd=document.adChangePwd.oldPwd.value;varnewPwd=document.adChangePwd.newPwd.value;varnewPwdAgain=document.adChangePwd.newPwdAgain.value;ifoldPwd=={alert旧密码为空!!!;adChangePwd.oldPwd.value=;adChangePwd.newPwd.value=;adChangePwd.newPwdAgain.value=;adChangePwd.oldPwd.focus;return;}ifoldPwd.trim.length6{alert旧密码不得包含空格且长度不得小于6位!!!;adChangePwd.oldPwd.value=;adChangePwd.oldPwd.focus;return;}ifnewPwd=={alert新密码为空!!!;adChangePwd.newPwd.value=;adChangePwd.newPwdAgain.value=;adChangePwd.newPwd.focus;return;}ifnewPwd.trim.length6{alert新密码不得包含空格且长度不得小于6位!!!;adChangePwd.newPwd.value=;adChangePwd.newPwdAgain.value=;adChangePwd.newPwd.focus;return;}ifnewPwd!=newPwdAgain{alert两次输入密码不一致!!!;adChangePwd.newPwd.value=;adChangePwd.newPwdAgain.value=;adChangePwd.newPwd.focus;return;}document.adChangePwd.submit;}/script/headbody%Useruser=Usersession.getAttributeuser;ifnull==user{response.sendRedirectadmin_login.jsp;}%divid=Menu%@includefile=adm_left_menu.jsp%/divdivid=info_tabledivid=ad_managefontsize=4center修改密码formname=adChangePwdaction=/LibraryDemo/accountManage/adChangePWdmethod=posttabletrtdalign=right请输入旧密码/tdtdalign=leftinputname=oldPwdtype=passwordsize=20/td/trtrtdalign=right请输入新密码/tdtdalign=leftinputname=newPwdtype=passwordsize=20/td/trtrtdalign=right再次输入新密码/tdtdalign=leftinputname=newPwdAgaintype=passwordsize=20/td/trtrtd/tdtd!--inputtype=buttonvalue=修改onclick=checkAdChangePwd/--imgsrc=/images/xga.gifid=xgonclick=checkAdChangePwdonmouseover=document.all.xg.src=/images/xgb.gifonmouseout=document.all.xg.src=/images/xga.gifonmousedown=document.all.xg.src=/images/xgc.gifstyle=cursor:hand/nbsp;nbsp;inputtype=hiddenname=actionvalue=adChangePwd/!--inputtype=resetvalue=清空/--imgsrc=/images/qka.gifid=qkonclick=resetonmouseover=document.all.qk.src=/images/qkb.gifonmouseout=document.all.qk.src=/images/qka.gifonmousedown=document.all.qk.src=/images/qkc.gifonmouseup=document.all.qk.src=/images/qkb.gifstyle=cursor:hand/td/tr%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null{%trtdcolspan=10fontcolor=redsize=2center%=message%/center/font/td/tr%}%/table/form/div/div/body/html
5.
2.2添加管理员图
5.3添加管理员界面实现代码%@pagecontentType=text/html;charset=gbk%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckAddAdmin{varadID=document.addAdmin.adID.value;varadPwd=document.addAdmin.adPwd.value;ifadID.trim=={alert管理员名不得为空!!!;addAdmin.adID.value=;addAdmin.adPwd.value=;addAdmin.adID.focus;return;}ifadID.trim.length3{alert管理员名不得包含空格且长度不得小于3位!!!;addAdmin.adID.value=;addAdmin.adPwd.value=;addAdmin.adID.focus;return;}ifadPwd=={alert管理员密码为空!!!;addAdmin.adPwd.value=;addAdmin.adPwd.focus;return;}ifadPwd.trim.length6{alert管理员密码不得包含空格且长度不得小于6位!!!;addAdmin.adPwd.value=;addAdmin.adPwd.focus;return;}document.addAdmin.submit;}/script/headbodydivid=Menu%@includefile=adm_left_menu.jsp%/divdivid=info_tabledivid=ad_managefontsize=4center添加管理员formname=addAdminaction=/LibraryDemo/accountManage/add_adminmethod=posttabletrtdalign=right管理员ID/tdtdalign=leftinputname=adIDtype=textsize=20/td/trtrtdalign=right管理员密码/tdtdalign=leftinputname=adPwdtype=passwordsize=20/td/trtrtd/tdtd!--inputtype=buttonvalue=添加onclick=checkAddAdmin/--imgsrc=/images/tja.gifid=tjonclick=checkAddAdminonmouseover=document.all.tj.src=/images/tjb.gifonmouseout=document.all.tj.src=/images/tja.gifonmousedown=document.all.tj.src=/images/tjc.gifstyle=cursor:hand/nbsp;nbsp;nbsp;nbsp;inputtype=hiddenname=actionvalue=addAdmin/!--inputtype=resetvalue=清空/--imgsrc=/images/qka.gifid=qkonclick=resetonmouseover=document.all.qk.src=/images/qkb.gifonmouseout=document.all.qk.src=/images/qka.gifonmousedown=document.all.qk.src=/images/qkc.gifonmouseup=document.all.qk.src=/images/qkb.gifstyle=cursor:hand/td/tr%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null{%trtdcolspan=10fontcolor=redsize=3center%=message%/center/font/td/tr%}%/table/form/div/div/body/html
5.
2.3重置管理员密码图
5.4重置管理员密码界面代码实现%@pageimport=com.hw.datamodel.User%%@pagecontentType=text/html;charset=gbk%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckReset{varadID=document.resetPwd.adID.value;varadPwd=document.resetPwd.adPwd.value;ifadID.trim=={alert管理员名不得为空!!!;return;}ifadPwd.trim.length6{alert管理员密码不得包含空格且长度不得小于6;return;}document.resetPwd.submit;}/script/headbodydivid=Menu%@includefile=adm_left_menu.jsp%/divdivid=info_tabledivid=ad_managefontsize=4center重置密码formname=resetPwdaction=/LibraryDemo/accountManage/resetPwdmethod=posttabletrtdalign=right管理员ID/tdtdalign=leftinputname=adIDtype=textsize=20/td/trtrtdalign=right管理员密码/tdtdalign=leftinputname=adPwdtype=passwordsize=20/td/trtrtd/tdtdimgsrc=/images/tjaa.gifid=tjaonclick=checkResetonmouseover=document.all.tja.src=/images/tjbb.gifonmouseout=document.all.tja.src=/images/tjaa.gifonmousedown=document.all.tja.src=/images/tjcc.gifstyle=cursor:hand/nbsp;nbsp;nbsp;nbsp;inputtype=hiddenname=actionvalue=reset_admin_pwd/!--inputtype=resetvalue=清空/--imgsrc=/images/qka.gifid=qkonclick=resetonmouseover=document.all.qk.src=/images/qkb.gifonmouseout=document.all.qk.src=/images/qka.gifonmousedown=document.all.qk.src=/images/qkc.gifonmouseup=document.all.qk.src=/images/qkb.gifstyle=cursor:hand/td/tr%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null%trtdcolspan=10fontcolor=redsize=3center%=message%/center/font/td/tr%}%/table/form/div/div/body/html
5.3用户管理
5.
3.1添加用户图
5.5添加用户界面代码实现%@pagecontentType=text/html;charset=gbk%%@pageimport=java.util.*com.hw.datamodel.User%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckAddStu{varstudentNO=document.addStu.studentNO.value;varstudentName=document.addStu.studentName.value;varage=document.addStu.age.value;varcla=document.addStu.cla.value;vardepartment=document.addStu.department.value;ifstudentNO.trim=={alert学号不能为空!!!;return;}varrex=/^\d*$/;if!rex.teststudentNO{alert学号只能由数字组成!!!;return;}ifstudentName.trim=={alert姓名不能为空!!!;return;}ifage.trim=={alert年龄不能为空!!!;return;}varreg=/^\d{12}$/;if!reg.testage{alert年龄格式不对!!!;return;}ifcla.trim=={alert系别不能为空!!!;return;}ifdepartment.trim=={alert系别不能为空!!!;return;}document.addStu.submit;}/script/headbody%Useruser=Usersession.getAttributeuser;ifnull==user{response.sendRedirectadmin_login.jsp;}%divid=Menu%@includefile=stum_left_menu.jsp%/divdivid=info_tablebrdivid=stuInfobrbrfontsize=3添加用户brbrformname=addStuaction=studentManage/addStudentmethod=posttableborder=0align=centertrtdalign=right学号/tdtdinputtype=textname=studentNO/td/trtrtdalign=right姓名/tdtdinputtype=textname=studentName/td/trtrtdalign=right年龄/tdtdinputtype=textname=age/td/trtrtdalign=right性别/tdtdinputtype=radioname=gendervalue=男checked=true男inputtype=radioname=gendervalue=女女/td/trtrtdalign=right班级/tdtdinputtype=textname=cla/td/trtrtdalign=right系别/tdtdinputtype=textname=department/td/trtrtdinputtype=hiddenname=actionvalue=add_stu/tdtd!--inputtype=buttonvalue=添加onclick=checkAddStu--imgsrc=/images/tja.gifid=tjonclick=checkAddStuonmouseover=document.all.tj.src=/images/tjb.gifonmouseout=document.all.tj.src=/images/tja.gifonmousedown=document.all.tj.src=/images/tjc.gifstyle=cursor:hand/nbsp;nbsp;nbsp;nbsp;!--inputtype=resetvalue=重置--imgsrc=/images/qka.gifid=qkonclick=resetonmouseover=document.all.qk.src=/images/qkb.gifonmouseout=document.all.qk.src=/images/qka.gifonmousedown=document.all.qk.src=/images/qkc.gifonmouseup=document.all.qk.src=/images/qkb.gifstyle=cursor:hand/td/tr/table/form%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null{%centerfontcolor=redsize=3%=message%/font/center%}%/divdivid=message提示brbrli输入学生信息请认真填写/librbrli学号和年龄应为数字组成,不得包含其他字符/librbrli添加学生后,学生的借书权限默认为可以借书/librbrli添加学生时,学生的登录密码默认为学生学号/librbr/div/div/body/html
5.4图书管理
5.
4.1添加图书图
5.6添加图书界面实现代码%@pagecontentType=text/html;charset=gbk%%@pageimport=java.util.*com.hw.datamodel.User%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckAddBook{document.addBook.submit;}/script/headbody%Useruser=Usersession.getAttributeuser;ifnull==user{response.sendRedirectadmin_login.jsp;}%divid=Menu%@includefile=book_left_menu.jsp%/divdivid=info_tablebrdivid=stuInfobrbrfontsize=3添加图书brbrformname=addBookaction=/LibraryDemo/book/addBookmethod=posttableborder=0align=centertrtdalign=right图书编号/tdtdinputtype=textname=bNO/td/trtrtdalign=right图书名称/tdtdinputtype=textname=bName/td/trtrtdalign=right作者/tdtdinputtype=textname=author/td/trtrtdalign=right出版社/tdtdinputtype=textname=publish/td/trtrtdalign=rightISBN号/tdtdinputtype=textname=isbn/td/trtrtdalign=right价格/tdtdinputtype=textname=price/td/trtrtdinputtype=hiddenname=actionvalue=add_book/tdtd!--inputtype=buttonvalue=添加onclick=checkAddBook--imgsrc=/images/tja.gifid=tjonclick=checkAddBookonmouseover=document.all.tj.src=/images/tjb.gifonmouseout=document.all.tj.src=/images/tja.gifonmousedown=document.all.tj.src=/images/tjc.gifstyle=cursor:hand/nbsp;nbsp;nbsp;nbsp;!--inputtype=resetvalue=重置--imgsrc=/images/qka.gifid=qkonclick=resetonmouseover=document.all.qk.src=/images/qkb.gifonmouseout=document.all.qk.src=/images/qka.gifonmousedown=document.all.qk.src=/images/qkc.gifonmouseup=document.all.qk.src=/images/qkb.gifstyle=cursor:hand/td/tr/table/form%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null{%centerfontcolor=redsize=3%=message%/font/center%}%/divdivid=message提示brbrli输入图书信息请认真填写/librbrli图书编号和ISBN号应为数字组成,不得包含其他字符/librbrli添加图书后,图书的购进时间默认为当前日期,状态为在馆/librbr/div/div/body/html
5.5借阅管理
5.
5.1用户借书图
5.7用户借书界面代码实现%@pagecontentType=text/html;charset=gbk%%@pageimport=java.util.*com.hw.datamodel.User%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckBorrow{varstuNO=document.borrow.stuNO.value;varbNO=document.borrow.bNO.value;varreg=/^\d*$/;ifstuNO.trim=={alert学生学号不得为空!!!;return;}if!reg.teststuNO{alert学号格式不对;return;}ifbNO.trim=={alert图书编号不得为空!!!;return;}if!reg.testbNO{alert图书编号号格式不对;return;}document.borrow.submit;}/script/headbody%Useruser=Usersession.getAttributeuser;ifnull==user{response.sendRedirectadmin_login.jsp;}%divid=Menu%@includefile=borrow_left_menu.jsp%/divdivid=info_tablecenterbrbrfontsize=4图书借阅/centerformname=borrowaction=/LibraryDemo/BorrowManage/borrowmethod=postinputtype=hiddenname=actionvalue=borrow_booktablealign=centertrtdalign=right请输入学号/tdtdinputtype=textname=stuNO//td/trtrtdalign=right请输入图书编号/tdtdinputtype=textname=bNO/td/trtrtd/tdtdalign=right!--inputtype=buttonvalue=提交onclick=checkBorrow--imgsrc=/images/tjaa.gifid=tjaonclick=checkBorrowonmouseover=document.all.tja.src=/images/tjbb.gifonmouseout=document.all.tja.src=/images/tjaa.gifonmousedown=document.all.tja.src=/images/tjcc.gifstyle=cursor:hand//td/tr%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null{%trtdcolspan=2centerfontcolor=redsize=3%=message%/center/font/td/tr%}%/table/form/div/body/html
5.
5.2用户还书图
5.8用户还书界面代码实现%@pagecontentType=text/html;charset=gbk%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckReturn{varbNO=document.rebook.bNO.value;varreg=/^\d*$/;ifbNO.trim=={alert图书编号不得为空!!!;return;}if!reg.testbNO{alert图书编号号格式不对;return;}document.rebook.submit;}/script/headbodydivid=Menu%@includefile=borrow_left_menu.jsp%/divdivid=info_tablecenterbrbrfontsize=4图书归还/centerformname=rebookaction=BorrowManage/returnmethod=postinputtype=hiddenname=actionvalue=return_booktablealign=centertrtdalign=right请输入图书编号/tdtdinputtype=textname=bNO/td/trtrtd/tdtdalign=right!--inputtype=buttonvalue=提交onclick=checkReturn--imgsrc=/images/tjaa.gifid=tjaonclick=checkReturnonmouseover=document.all.tja.src=/images/tjbb.gifonmouseout=document.all.tja.src=/images/tjaa.gifonmousedown=document.all.tja.src=/images/tjcc.gifstyle=cursor:hand//td/tr%Stringmessage=Stringrequest.getAttributemessage;ifmessage!=null{%trtdcolspan=2centerfontcolor=redsize=3%=message%/center/font/td/tr%}%/table/form/div/body/html
5.
5.3缴纳罚款图
5.9缴纳罚款界面代码实现%@pagecontentType=text/html;charset=gbk%htmlheadlinkhref=/images/div.csstype=text/cssrel=stylesheetscripttype=text/javascriptsrc=/images/trim.js/scriptscripttype=text/javascriptfunctioncheckAmer{varstuNo=document.amerce.stuNo.value;varreg=/^\d*$/;ifstuNo.trim=={alert学生学号不得为空!!!;return;}if!reg.teststuNo{alert学号格式不对;return;}document.amerce.submit;}/script/headbodydivid=Menu%@includefile=borrow_left_menu.jsp%/divdivid=info_tablecenterbrbrfontsize=4罚款缴纳/centerformname=amerceaction=/LibraryDemo/BorrowManage/amercemethod=postinputtype=hiddenname=actionvalue=get_amer_listtablealign=centertrtdalign=right请输入学生学号/tdtdinputtype=textname=stuNo/td/trtrtd/tdtdalign=right!--inputtype=buttonvalue=查询onclick=checkAmer--imgsrc=/images/tjaa.gifid=tjaonclick=checkAmeronmouseover=document.all.tja.src=/images/tjbb.gifonmouseout=document.all.tja.src=/images/tjaa.gifonmousedown=document.all.tja.src=/images/tjcc.gifstyle=cursor:hand//td/tr%Stringmessage=Stringrequest.getAttributemessage;}%/table/form/div/body/html6系统调试与测试
6.1测试的主要方法系统采用的测试方法是黑盒测试法,运用等价类划分的方法来设计测试用例 黑盒测试法是把被测试对象看成一个黑盒子,测试人员完全不考虑程序的内部结构和处理过程,只在软件的接口出进行测试,依据需求说明书,检查程序是否满足功能要求所以,黑盒测试又称为功能测试或数据驱动测试
6.
1.1管理员登录表
6.1管理员登陆测试测试对象测试用户名数据测试密码数据预期结果测试结果管理员编号密码不输入不输入请填写用户名请填写用户名管理员编号密码输入admin不输入请填写密码请填写密码管理员编号密码不输入输入123456请填写用户名请填写用户名管理员编号密码输入admin输入123456登录成功登录成功管理员编号密码输入admm输入123456用户名或密码错误用户名或密码错误
6.
1.2重置管理员密码表
6.2重置管理员密码测试测试对象测试用户名数据测试密码数据预期结果测试结果管理员编号密码不输入不输入请填写用户名请填写用户名管理员编号密码输入admin不输入请填写密码请填写密码管理员编号密码不输入输入123456请填写用户名请填写用户名管理员编号密码输入admin输入123456无权限无权限管理员编号密码输入adminn输入123456管理用户不存在管理用户不存在
6.
1.3添加读者表
6.3添加读者测试测试对象学号数据姓名数据年龄数据班级数据系别数据预期结果测试结果读者不输入不输入不输入不输入不输入学号不能为空学号不能为空读者18014023不输入不输入不输入不输入姓名不能为空姓名不能为空读者18014023邢鹏飞不输入不输入不输入年龄不能为空年龄不能为空读者18014023邢鹏飞18不输入不输入班级不能为空班级不能为空读者18014023邢鹏飞18计本1101不输入系别不能为空系别不能为空读者18014023邢鹏飞18计本1101数计学院添加成功添加成功读者18014023邢鹏飞18计本1101数计学院读者已存在读者已存在
6.
1.4添加图书表
6.4添加图书测试测试对象编号数据名称数据作者数据出版社数据ISBN数据预期结果测试结果图书不输入不输入不输入不输入不输入编号不能为空编号不能为空图书111111不输入不输入不输入不输入名称不能为空名称不能为空图书111111数据结构不输入不输入不输入作者不能为空作者不能为空图书111111数据结构严蔚敏不输入不输入出版社不能为空出版社不能为空图书111111数据结构严蔚敏北京不输入ISBN不能为空ISBN不能为空图书111111数据结构严蔚敏北京123456添加成功添加成功图书111111数据结构严蔚敏北京123456图书已存在图书已存在
6.
1.5读者借书表
6.5读者借书测试测试对象测试学号数据测试图书编号数据预期结果测试结果学号图书编号不输入不输入学号不能为空学号不能为空学号图书编号18014023不输入图书编号不能为空图书编号不能为空学号图书编号不输入610400学号不能为空学号不能为空学号图书编号18014023640401请先缴纳罚款请先缴纳罚款学号图书编号18014024610402读者不存在读者不存在学号图书编号18014025610403图书不存在图书不存在学号图书编号18014026610404图书以借出图书以借出学号图书编号18014027610405图书以丢失图书以丢失学号图书编号18014028610406图书以预约图书以预约学号图书编号18014029610407请到管理员处解锁请到管理员处解锁
6.
1.6读者还书表
6.6读者还书测试测试对象测试图书编号数据预期结果测试结果图书编号不输入图书编号不能为空图书编号不能为空图书编号610400此书在馆此书在馆图书编号610401此书已丢失此书已丢失图书编号610402借阅成功借阅成功
6.
1.7欠款缴纳表
6.7缴纳罚款测试测试对象测试图书编号数据预期结果测试结果读者编号不输入读者编号不能为空读者编号不能为空读者编号18014023读者不存在读者不存在读者编号18014024此读者无欠款记录此读者无欠款记录读者编号18014025缴纳成功缴纳成功总结由于人工管理图书工作量大、容易出错,所以设计实现了图书管理系统系统的基本功能有图书添加、用户添加、图书借阅、归还图书、借阅罚款、图书续借、图书挂失、图书证挂失、当前借阅、历史借阅、当前欠款、密码修改、密码重置系统开发的过程中也遇到了许多困难和问题,例如配置文件、中文显示乱码、数据库无法连接等等配置文件主要通过上网查阅资料得以解决,中文乱码是由于页面编码格式与配置文件里面默认编码格式不一致,数据库无法连接是由于没有赋予Oracle用户连接权限最终图书管理系统功能基本完成,但是还存在一些缺陷例如不能及时的通过邮件或者短信的形式提醒用户借阅时间即将到达、用户在系统中没有查找出自己想要的书籍,这个条件应该作为采购员的采购依据续借的次数没有加以限制致谢本篇论文虽然凝聚着自己的汗水,但却不是个人智慧的结晶,没有导师的指引和赠予,没有父母和同学的帮助和支持,我在大学的学习成长肯定会大打折扣当我打完毕业论文的最后一个字符,涌上心头的不是长途跋涉后抵达终点的欣喜,而是源自心底的诚挚谢意我首先要感谢我的指导老师李军老师,对我的构思以及论文的内容不厌其烦的进行多次指导和悉心指点,使我在完成论文的同时也深受启发和教育经过李老师的精心指导,我在他的身上学到了很多东西,认真的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅再次由衷感谢答辩组的各位老师对我的指导和教诲,我也在努力的积蓄着力量,尽自己的微薄之力回报母校的培养之情,争取使自己成为一个对社会有贡献的人参考文献
[1]张凤霞. 图书管理系统的设计与实现[J].科技信息
2009.9
[2]张海藩. 软件工程导论(第四版)[M]. 北京清华大学出版社,
2003.
[3]王俊杰.精通Java Script动态网页编程[M].北京:人民邮电出版社
2007.
[4]张秋余杨玥. 基于用例的需求建模方法[J]. 计算机工程与设计,
2006.19
[5]刘志成.数据库系统原理与应用[M].北京:机械工业出版社
2007.
[6]何秀芳.网页制作与网站建设从入门到精通[M].北京人民邮电出版社2007.
[7]张海潘.软件工程[J].清华大学出版社.
2003.
[8]赵元杰. Oracle 10g系统管理员简明教程[M]. 北京人民邮电出版社,2006
[9]陆荣幸,郁洲. J2EE平台上MVC设计模式的研究与实现[J]. 计算机应用研究[J],
2003.
[10]孙卫琴,李洪称. Tomcat与Java Web开发技术详解[M]. 北京电子工业出版社,
2003.
[11]何成万,余秋惠. MVC模型2及软件框架Struts的研究[J]. 计算机工程,20026
[12]Marty Hall,Larry Brown著,赵学良译. Servlet与JSP核心编程(第2版)[M]. 北京清华大学出版社,
2004. 附录A外文翻译3ClassesandobjectsObjective-Cisanobject-orientedlanguage:itmanagesclassesandobjects.Objective-CusesastrictobjectmodelunlikeC++whichhasmanydiscrepanciesagainsttheidealobjectmodel.ForinstanceinObjective-Cclassesareobjectsandcanbedynamicallymanaged:itispossibletoaddclassesatrun-timecreateinstancesbasedonthenameoftheclassaskaclassforitsmethodsandsoon.ThisismuchmorepowerfulthanC++RTTIcf.section
13.1onpage62whichhavebeenaddedtoavery“static”language.DiscouragingRTTIuseiscommonsincetheresultsmaydependonthecompileritselfandlackportability.
3.1RootclasstypeidnilandNilvaluesInanobject-orientedlanguageeachprogrammakesuseofasetofclasses.UnlikeC++Objective-Cdefinesarootclass.Everynewclassshouldbeadescendantoftherootclass.InCocoathatclassisNSObjectanditprovidesahugenumberoffacilitiesfortherun-timesystem.TherootclassnotionisnotspecifictoObjective-C;it’srelatedtotheobjectmodel.SmalltalkandJavamakeuseofarootclasswhileC++doesnot.StrictlyspeakingeveryobjectshouldbeoftypeNSObjectandeverypointertoanobjectcouldbedeclaredasNSObject*.Infactonecanusethetypeidinstead.Thisisashortandhandywaytodeclareapointertoanyobjectandprovidesdynamictype-checkinginsteadofstatictype-checking.Itisveryusefulforsomeweaktypingongenericmethods.PleasenotethatanullpointertoanobjectshouldbesettonilnotNULL.Thesevaluesarenotinterchangeable.AnormalCpointercanbesettoNULLbutnilwasintroducedinObjective-Cforpointerstoobjects.InObjective-Cclassesarealsoobjectsmeta-classinstancesanditispossibletodeclareapointertoaclass.TheirnullvalueisNil.
3.2ClassdeclarationItishardtoshowwithasingleexampleallthedifferencesbetweenObjective-CandC++forclassdeclarationandimplementation.Syntaxandconceptsareinterleavedandrequireexplanation.Inthefollowingthedifferencesareexposedsequentiallyandspecifically.
3.
2.1AttributesandmethodsInObjective-Cattributesarecalledinstancedataandmemberfunctionsarecalledmethods.C++Objective-CclassFoo{doublex;public:intfintx;floatgintxinty;};intFoo::fintx{...}floatFoo::gintxinty{...}@interfaceFoo:NSObject{doublex;}-intf:intx;-floatg:intx:inty;@end@implementationFoo-intf:intx{...}-floatg:intx:inty{...}@endInC++attributesandmethodsaredeclaredtogetherinsidethebracesoftheclass.MethodimplementationsyntaxissimilartoCwiththeadditionofthescoperesolutionoperatorFoo::.InObjective-Cattributesandmethodscannotbemixed.Theattributesaredeclaredinbracesthemethodsfollow.Theirimplementationliesinan@implementationblock.ThisisamajordifferencewithC++sincesomemethodscanbeimplementedwithoutbeingexposedintheinterface.Thisisdetailedlater.Brieflythisisawaytocleanupheaderfilesbyremovingunnecessarydeclarations“private”methodsandsilentlyredefinedvirtualmethodslikedestructors.PleaseseeSection
4.
3.2onpage21forfurtherexplanations.Instancemethodsareprefixedbytheminussymbol“-”andclassmethodsbytheplussymbol“+”cf.section
3.
3.9onpage18;thissymbolhasnothingtodowiththeUMLnotationandthemeaningpublicorprivate.Thetypeoftheparametersareenclosedinparenthesisandtheparametersareseparatedbythesymbol“:”.PleaseseeSection
3.
3.1onthenextpageforfurtherexplanationsonthesyntaxofprototypes.InObjective-Cthereisnoneedforasemi-colonattheendofaclassdeclaration.Alsonotethatthekeywordtodeclareaclassis@interfaceandnot@class.Thekeyword@classisonlyusedinforwarddeclarationscf.section
3.
2.2onthecurrentpage.Finallyifthereisnoinstancedatainaclassthebraceswhichwouldenclosenothingcanbeommitted.
3.
2.2Forwarddeclarations:@class@protocolToavoidcyclicdependenciesinheaderfilestheClanguagesupportstheforwarddeclarationthatallowsthecodertodeclareaclasswhentheonlyrequiredknowledgeisitsexistenceandnotitsstructure.InC++thekeywordclassisused;inObjective-Citis@class.Thekeyword@protocolcanalsobeusedtoanticipatethedeclarationofaprotocolcf.section
4.4onpage
22.C++//InfileFoo.h#ifndef__FOO_H__#define__FOO_H__classBar;//forwarddeclarationclassFoo{Bar*bar;public:voiduseBarvoid;};#endif//InfileFoo.cpp#includeFoo.h#includeBar.hvoidFoo::useBarvoid{...}Objective-C//InfileFoo.h@classBar;//forwarddeclaration@interfaceFoo:NSObject{Bar*bar;}-voiduseBar;@en//InfileFoo.m#importFoo.h#importBar.h@implementationFoo-voiduseBar{}@end
3.
2.3publicprivateprotectedOnemajorfeatureoftheobjectmodelisdataencapsulationwhichlimitsthevisibilityofdatatosomepartsofthecodeinordertoensureitsintegrityC++Objective-CclassFoo{public:intx;intapple;protected:inty;intpear;private:intz;intbanana;};@interfaceFoo:NSObject{@publicintx;@protected:inty;@private:intz;}-intapple;-intpear;-intbanana;@endInC++attributesandmethodscanbelongtoapublicprotectedorprivatescope.Thedefaultmodeisprivate.InObjective-Conlytheinstancedatacanbepublicprotectedorprivateandthedefaultvisibilityisprotected.Methodscanonlybepublic.Howeveritispossibletomimictheprivatemodebyimplementingsomemethodsinthe@implementationwithoutdeclaringtheminthe@interfaceorusingthenotionofclasscategorycf.section
4.5onpage
25.Itdoesnotpreventmethodsfrombeingcalledbuttheyarelessexposed.ImplementingamethodwithoutapreviousdeclarationisaspecialpropertyofObjective-CandhasaspecificpurposeasexplainedinSection
4.
3.2onpage
21.Inheritancecannotbetaggedpublicprotectedorprivate.Theonlywayispublic.InheritanceinObjective-ClooksmorelikeJavathanC++section4onpage
21.
3.
2.4staticattributesIt’snotpossibleinObjective-CtodeclareaclassdataattributestaticasinC++.Howeveritispossibletodothesamethinginadifferentway:useaglobalvariableintheimplementationfileoptionallywiththestaticCkeywordtolimitthescope.Theclasscanthenuseaccessorsonitwithclassmethodsornormalmethodsanditsinitializationcanbedoneintheinitializemethodoftheclasscf.section
5.
1.10onpage
34.
3.3MethodsThesyntaxforamethodinObjective-CisdifferentfromthesyntaxforcommonCfunctions.Thissectionaimstodescribethissyntaxandaddssomeinformationontheunderlyingmessagesendingprinciple.
3.
3.1Prototypeandcallinstancemethodsclassmethods•Amethodisprefixedby“−”ifitisaninstancemethodcommoncaseorby“+”ifitisaclassmethodstaticinC++.ThissymbolisinnowaylinkedtotheUMLnotationforpublicorprivate.MethodsarealwayspublicinObjective-C;•thetypesforthereturnvalueorfortheparametersareenclosedbyparentheses;•theparametersareseparatedbyacolon“:”;•theparameterscanbeassociatedwithalabelanamespecifiedjustbefore“:”;thelabelisthenpartofthenameofthemethodandmodifiesit.Thatmakescallstothisfunctionparticularlyreadable.Infactthelabelusageshouldbesystematic.Notethatthefirstparametercannothavealabel–indeeditslabelisalreadythenameofthemethod;•amethodnamecanbethesameasanattributenamewithoutconflict.Thisisveryusefulforgetterscf.section
6.
4.8onpage
46.C++//prototypevoidArray::insertObjectvoid*anObjectunsignedintatIndex//usewithashelfinstanceoftheArrayclassandabookobjectshelf.insertObjectbook2;Objective-CWithoutlabeldirecttranslationfromC++//prototype//ThemethodisnamedinsertObject::thecolonbeingusedtoseparate//theparametersitisnotascoperesolutionoperatorlikeinC++-voidinsertObject:idanObject:unsignedintindex//usewithashelfinstanceoftheArrayclassandabookobject[shelfinsertObject:book:2];Withlabel//prototype.TheindexparameterisnowlabeledatIndex//ThemethodisnownamedinsertObject:atIndex://Thecallcaneasilybereadlikeasentence-voidinsertObject:idanObjectatIndex:unsignedintindex//usewithashelfinstanceoftheArrayclassandabookobject[shelfinsertObject:book:2];//Error![shelfinsertObject:bookatIndex:2];//OKPleasenotethatthesyntaxwithsquarebracketsshouldnotbereadascallingthemethodinsertObjectofobject“shelf”butrathersendingthemessageinsertObjecttoobject“shelf”.ThisiswhatmakesObjective-C.Onecansendanymessagetoanytarget.Ifitisnotabletohandlethemessageitcanignoreitanexceptionisraisedbuttheprogramdoesnotabort.Ifatthetimeitreceivesthemessageatargetisabletohandleitthenthematchingmethodwillbecalled.Thecompilerisabletoraiseawarningifamessageissenttoaclassforwhichitisknownthatnomatchingmethodexists.Thisisnotconsideredasanerrorthankstotheforwardingfacilitycf.section
3.
4.3onpage
19.Ifatargetisonlyknownunderthetypeidnowarningwillbemadeatcompiletime;apotentialerrorwouldberaisedatrun-time.
3.
3.2thisselfandsuperTherearetwoparticulartargetsforamessage:selfandsuper.selfisthecurrentobjectlikethisinC++superistheparentclass.ThekeywordthisdoesnotexistinObjective-C.Itisreplacedbyself.NB:selfisnotarealkeyworditisahiddenparameterthateachmethodreceivesthevalueofwhichisthecurrentobject.ItsvaluecanbechangedunlikeC++’sthiskeyword.Howeverthisisonlyusefulinconstructorscf.section
5.1onpage
27.
133.
3.3AccessinginstancevariablesinsideamethodLikeinC++anObjective-Cmethodcanaccesstheinstancevariablesofitscurrentobject.Theoptionalthis-inC++canbewrittenself-.C++Objective-CclassFoo{intx;inty;voidfvoid;};voidFoo::fvoid{x=1;inty;//makingambiguitywiththis-yy=2;//usinglocalythis-y=3;//disambiguating}@interfaceFoo:NSObject{intx;inty;}-voidf;@end@implementationFoo-voidf{x=1;inty;//makingambiguitywiththis-yy=2;//usinglocalyself-y=3;//disambiguating}@end
3.
3.4PrototypeidandsignatureoverloadingAfunctionisapartofcodethatcanbereferencedforinstancetouseasfunctionpointersorfunctors.Moreoverevenifthenameofthefunctionisagoodcandidateforauniqueidonemusttakecarewhenusingoverloading.C++andObjective-Cuseoppositewaystodifferentiateprototypes.Thefirstisbasedonparameterstypeswhilethesecondisbasedonparameterlabels.InC++twofunctionscanhavethesamenameaslongastheirparametershavedifferenttypes.Whenusingmethodstheconstoptionisalsodiscriminative.C++intfint;intffloat;//OKfloatisdifferentfromintclassFoo{public:intgint;intgfloat;//OKfloatisdifferentfromintintgfloatconst;//OKconstisdiscriminative};classBar{public:intgint;//OKweareinBar::differentfromFoo::}InObjective-CallfunctionsareCfunctions:theycannotbeoverloadedunlessthecompilercanbetoldtouseC99;likegccdoes.Howevermethodsuseadifferentsyntaxandcanbedifferentiatedthankstoparameterlabels.Objective-Cintfint;intffloat;//Error:Cfunctionscannotbeoverloaded@interfaceFoo:NSObject{}-intg:intx;-intg:floatx;//Error:thismethodisnotdifferent//fromthepreviousonenolabel-intg:intx:inty;//OK:twoanonymouslabels-intg:intx:floaty;//Error:notdifferentfromthe//previousone-intg:intxandY:inty;//OK:secondlabelisandY-intg:intxandY:floaty;//Error:notdifferentfromthe//previousone-intg:intxandAlsoY:inty;//OK:secondlabelis//andAlsoYdifferentfromandY@endThelabel-basedidentifyingmethodisusefulforexpressingtheexact“name”ofthefunctionasstatedbelow.@interfaceFoo:NSObject{}//Themethodnameisg-intg;//Themethodnameisg:-intg:floatx;//Themethodnameisg::-intg:floatx:floaty;//Themethodnameisg:andY:-intg:floatxandY:floaty;//Themethodnameisg:andZ:-intg:floatxandZ:floatz@endClearlytwoObjective-Cmethodsaredifferentiatedbylabelsinsteadoftypes.Thisisawaytoreplace“pointersonmemberfunctions”expressedbyselectorsasexplainedinsection
3.
3.5onthecurrentpage.
3.
3.5Pointertomemberfunction:SelectorInObjective-Cthemethodshaveaparticularsyntaxusingparenthesesandlabels.Itisnotpossibletodeclarefunctionswiththissyntax.ThenotionofpointertofunctionsisthesameinCandObjective-C.Itisonlyforpointersonmethodswhereadifferenceoccurs.InC++thesyntaxishardbutconsistentwiththeClangage:thepointerfocusisontypes.C++classFoo{public:intffloatx{...}};FoobarintFoo::*p_ffloat=Foo::f;//PointertoFoo::fbar.*p_f
1.2345;//callingbar.f
1.2345;InObjective-Canewtypehasbeenintroduced.Sucha“pointertoamethod”iscalledaselector.ItstypeisSELanditsvalueiscomputedusing@selectorontheexactnameofthemethodwithlabelsofparameters.CallingthemethodcanbedoneusingtheclassNSInvocation.MostofthetimeutilitymethodsoftheperformSelector:familyinheritedfromNSObjectarehandierbutalittlerestrictive.Thesimplestthreeonesare:-idperformSelector:SELaSelector;-idperformSelector:SELaSelectorwithObject:idanObjectAsParameter;-idperformSelector:SELaSelectorwithObject:idanObjectAsParameterwithObject:idanotherObjectAsParameter;Thereturnedvalueisthesameasthatofthecalledmethod.FormethodswhichhaveparametersthatarenotobjectsoneshouldgenerallyusewrapperclasseslikeNSNumberthatcanprovidefloatintandsoon.TheNSInvocationclasswhichismoregeneralandpowerfulcanalsobeusedseethedocumentation.Accordingtowhathasbeensaidnothingpreventsamethodfrombeingcalledonanobjecteveniftheobjectdoesnotimplementit.Infactthemethodiseffectivelytriggeredifthemessageisaccepted.Butanexceptionthatcanbecaughtisraisedwhentheobjectdoesnotknowthemethod;theapplicationisnotinterrupted.MoreoveritispossibletocheckthatanobjectcantriggeramethodbycallingrespondsToSelector:.Finallythevalueof@selectoriscomputedatcompile-timewhichdoesnotslowdownthecode.Objective-C@interfaceSlave:NSObject{}-voidreadDocumentation:Document*document;@end//Letussupposeanarrayarray[]of10slaves//andadocumentdocument//Normalmethodcallfori=0;i10;++i[array[i]readDocumentation:document];//JustfortheexampletrytouseperformSelector:insteadfori=0;i10;++i[array[i]performSelector:@selectorreadDocumentation:withObject:document];//ThetypeofaselectorisSEL//Thefollowingversionisnotmoreefficientthanthepreviousone//since@selectorisevaluatedatcompile-timeSELmethodSelector=@selectorreadDocumentation:;fori=0;i10;++i[slaves[i]performSelector:methodSelectorwithObject:document];//foranobjectfoowhichtypeisnotknownid//thetestisnotmandatorybutpreventsanexceptiontoberaised//iftheobjecthasnoreadDocumentation:method.if[foorespondsToSelector:@selectorreadDocumentation:][fooperformSelector:@selectorreadDocumentation:withObject:document];Aselectorcanthusbeusedasaverysimplefunctionparameter.Genericalgorithmslikesortingmaybeeasilyspecializedthatwaycf.
11.3onpage
55.Aselectorisnotstrictlyspeakingapointertoafunction;itsrealunderlyingtypeisaCstringregisteredbytherun-timeasamethodidentifier.Whenaclassisloadeditsmethodsareautomaticallyregisteredinatablesothat@selectorcanworkasexpected.Thiswayforinstancetheequalityoftwoselectorscanbedoneonadresseswith==ratherthanreylingonastringcomparison.TherealadressofamethodseenasaCfunctioncanbeobtainedwithadifferentnotionandthetypeIMPthatisbrieflypresentedinsection
11.
3.2onpage
55.Itisrarelyusedbutforoptimization.VirtualcallsforinstancearehandledbyselectorsbutnotbyIMP.TheObjective-CequivalentforC++methodpointersisdefinitelyinselectors.FinallyyoumayrememberthatselfisinObjective-ClikethisinC++ahiddenparameterofeverymethodthatstoresthecurrentobject.Youcanalsonotethatthereisasecondhiddenparameter_cmdwhichisthecurrentmethod.Objective-C@implementationFoo-voidf:idparameter//equivalenttoaCfunctionoftype//voidfidselfSEL_cmdidparameter{idcurrentObject=self;SELcurrentMethod=_cmd;[currentObjectperformSelector:currentMethodwithObject:parameter];//recursivecall[selfperformSelector:_cmdwithObject:parameter];//idem}@end
3.
3.6DefaultvaluesofparametersObjective-Cdoesnotallowadefaultvaluetobespecifiedfortheparametersoffunctionsormethods.Oneshouldcreateasmuchfunctionsasnecessarywhensomeparameterscouldbeoptional.Inthecaseofconstructorsoneshouldusethenotionofdesignatedinitializersection
5.
1.7onpage
32.
3.
3.7VariablenumberofargumentsObjective-Callowstheuseofmethodswithavariablenumberofarguments.LikeinCthesyntaxreliesonusing“...”asthelastargument.ThisisrarelyusefulevenifmanyCocoamethodsaredoingso.MoredetailscanbefoundintheObjective-Cdocumentation.
3.
3.8AnonymousargumentsInC++itispossibletogivenonametoaparameterinaprototypesincethetypeissufficienttocharacterizethesignatureofafunction.ThisisnotpossibleinObjective-C.
3.
3.9Prototypemodifiersconststaticvirtual“=0“friendthrowInC++afewmodifierscanbeaddedtotheprototypeofafunction.NoneofthemexistinObjective-C.Hereisthelist:•const:amethodcannotbesetconst.Asaconsequencethemutablekeywordcannotexist;•static:makingthedifferencebetweenaninstancemethodandaclassmethodisdonethroughtheuseof“-”or“+”infrontoftheprototype;•virtual:Objective-Cmethodsarevirtualsothekeywordisuseless.Purevirtualmethodsareimplementedwithaformalprotocolcf.section
4.4onpage22;•friend:thereisno“friend”notioninObjective-C;•throw:inC++onecanrestrictamethodtotransmitsomeexceptionsonly.ThisisnotpossibleinObjective-C.
183.4Messagesandtransmission
3.
4.1SendingamessagetonilBydefaultitislegaltosendamessagecallamethodtonil.Themessageisjustignored.Thecodecanbegreatlysimplifiedbyreducingthenumberoftestsusuallymadewiththenullpointer.GCChasanoptiontodisablethathandybehaviourforextraoptimizations.
3.
4.2DelegatingamessagetoanunknownobjectDelegationiscommonwithuserinterfaceelementsinCocoatablesoutlines...takingadvantageoftheabilitytosendamessagetoanunknownobject.Anobjectcanforexampledelegatesometaskstoanassistant.//Thisisafunctiontodefineanassistant-voidsetAssistant:idslave{[assistantautorelease];//seethesectionaboutmemorymanagementassistant=[slaveretain];}//themethodperformHardWorkcanusedelegation-voidperformHardWork:idtask{//theassistantisnotknown//wecheckthatitcanhandlethemessageif[assistantrespondsToSelector:@selectorperformHardWork:][assistantperformHardWork:task];else[selffindAnotherAssistant];}
3.
4.3Forwarding:handlinganunknownmessageInC++codecannotbecompiledifamethodiscalledonanobjectthatdoesnotimplementit.InObjective-Cthere’sadifference:onecanalwayssendamessagetoanobject.Ifitcan’tbehandledatrun-timeitwillbeignoredandraiseanexception;moreoverinsteadofignoringititcanforwardthemessagetoanotherobject.Whenthecompileristoldthetypeofanobjectitcandetectifamessagesending–methodcall–willfailandraiseawarning.Howeverthisisnotanerrorsinceinthiscaseanalternativeisavailable.ThissecondchanceisrepresentedbyacalltotheforwardInvocation:methodwhichcanberedefinedtoredirectthemessageattheverylastmoment.ThisisobviouslyamethodofNSObjectwhichdoesnothingbydefault.Hereisanotherwaytomanageassistantobjects.-voidforwardInvocation:NSInvocation*anInvocation{//ifweareherethatisbecausetheobjectcannothandle//themessageoftheinvocation//thebadselectorcanbeobtainedbysendingselector//totheobjectanInvocationif[anotherObjectrespondsToSelector:[anInvocationselector]][anInvocationinvokeWithTarget:anotherObject];else//donotforgettotrywiththesuperclass[superforwardInvocation:anInvocation];}EvenifamessagecanbehandledatlastinaforwardInvocation:andonlythereacheckbasedonrespondsToSelector:willstillreturnNO.IndeedtherespondsToSelector:mechanismisnotdesignedtoguesswhetherforwardInvocation:willworkornot.Usingtheforwardinvocationcanbethoughtasabadpracticebecauseitistriggeringsomecodewhileanerrorshouldoccur.InfactverygoodusescanbemadeofthatmechanismlikeintheimplementationoftheCocoa’sNSUndoManager.Itallowsanexceptionnalypleasantsyntax:theUndomanagercanrecordscallstomethodsthoughitisnotitselfthetargetofthosecalls.
3.
4.4DowncastingDowncastingisneededinC++tocallmethodsonasubclasswhenonlyaparentclasspointerisknownthisismadepossibleusingdynamic_cast.InObjective-Cthispracticeisnotnecessarysinceamessagecanbesenttoanobjecteventifitseemsthattheobjectcannothandleit.Howevertoavoidacompilerwarningonecansimplycastthetypeoftheobject;thereisnoexplicitdowncastingoperatorinObjective-CthetraditionnalcastsyntaxoftheClanguagecanbeused.//NSMutableStringisasubclassofNSStringstringofcharacters//thatallowsmutatingoperations//theappendString:methodonlyexistsinNSMutableStringNSMutableString*mutableString=...initializingamutablestring...NSString*string=mutableString;//storinginanNSStringpointer//thosedifferentcallsareallvalid[stringappendString:@foo];//compilerwarning[NSMutableString*stringappendString:@foo];//nowarning[idstringappendString:@foo];//nowarning译文
3.类和对象Objective-C是一种面向对象的语言,它管理着类和对象Objective-C使用一种严格的对象模型,不像C++它与理想中对象模型有很多不同比如,在Objective-C中,类和对象能够动态地进行管理,它可以在运行时增加对象,基于对象的名称创造实例,查询一类的方法等等较于C++RTTI62页
13.1更强大的是它已经增加了一种十分“静态的“语言令人气馁的是RTTI的用法是与之相同的,究其原因可能是它自身编译程序的问题和缺乏可移植性
3.1根类,身份证件类型,零和零的价值在一种面向对象的语言里,每一个程序都可以使用一组对象,与C++不同,Objective-C规定一种根类,每一种新的类都应有根类的后裔在Cocoa中,类就是NSObject而且它可以为体系在运行时提供很多工具设备Objective-C根类的概念并不是明确的,它与对象模型有关Smalltalk和Java利用一种根类,而C++没有严格来讲,每一种对象都应该有NSObject类型,且对于每一个对象指令都能被作为NSObject*事实上,它能使用身份证件类型去代替这是一种很简单方便的办法,为对象去公布这些指令,而且可以提供动态的类型检查去代替静态的类型检查它对于一些相应较弱的类型是比较有用的方法请注意那些Null指令应该被清零,而非Null它们的价值是不可替换的一个正常的C的指令能够被改变成Null,但是要被介绍在Objective-C中是为了指令对象在Objective-C中,类也是对象(元类势力)可以声明一个指令一个类,它们的Null值为零
3.2类声明很难使用简单的实例来展示Objective-C和C++两者在类声明和现实上的不同,语法和概念被交叉和要求解释接下来,它们二者的不同将会按顺序明确地暴露
3.
2.1属性和方法在Objective-C中,属性被叫做实例数据,成员函数被称为方法C++Objective-CclassFoo{doublex;public:intfintx;floatgintxinty;};intFoo::fintx{...}floatFoo::gintxinty{...}@interfaceFoo:NSObject{doublex;}-intf:intx;-floatg:intx:inty;@end@implementationFoo-intf:intx{...}-floatg:intx:inty{...}@end在C++中,属性和方法被定义为类的两大支撑,方法实现的语法相似于C,另外还有范围解析操作符(Foo::)在Objectice-C中,属性和方式不容混淆属性为主,方式为辅,它们的实现在于@implementationblock.和C++主要的不同是,很多方式可以在没有暴露于界面的情况下被显示,这是比后者更详细的简单来讲,这是一种通过移动没有必要的公告去处理头等文件的方法(“私人的”方法,重新去定义虚拟析构函数等方法)请看21页
4.
3.2部分更深入的解释实例方法通过减字符“-”被至于前方,类方法通过“+”被连接(cf.18页
3.
3.9部分)这种体系没有什么符号,比较大众化或私密参数类型被附在括号里,参数通过“”被分类请看下一页
3.
3.1在标准排列方面有深入的解释在Objectice-C中,在结尾类公告上没有必要用分号,还要注意类公告的关键字是@interface而不是@class.最后,如果没有一些关于类的实例数据作为支柱,没有附上什么东西,可以被查找
3.
3.
2.前置声明@class.@protocol为了避免循环处理头等文件,C语言支持前置声明,它允许编码器去布置类,那时,知识仅仅作为它的存在形式而不是组织结构在C++中,类的关键字被使用在Objectice-C中,它是@class.@protocol的关键字也能被用来预测公告的拟定cf.22页
4.4部分C++//InfileFoo.h#ifndef__FOO_H__#define__FOO_H__classBar;//forwarddeclarationclassFoo{Bar*bar;public:voiduseBarvoid;};#endif//InfileFoo.cpp#includeFoo.h#includeBar.hvoidFoo::useBarvoid{...}C++//InfileFoo.h#ifndef__FOO_H__#define__FOO_H__classBar;//forwarddeclarationclassFoo{Bar*bar;public:voiduseBarvoid;};#endif//InfileFoo.cpp#includeFoo.h#includeBar.hvoidFoo::useBarvoid{...}
3.
2.3公共的,私人的,被保护的物体模型的主要特征是数据包装,它限制了部分数据的可见性为了确保它的完整性C++//InfileFoo.h#ifndef__FOO_H__#define__FOO_H__classBar;//forwarddeclarationclassFoo{Bar*bar;public:voiduseBarvoid;};#endif//InfileFoo.cpp#includeFoo.h#includeBar.hvoidFoo::useBarvoid{...}在C++中,属性和方式属于公共的被保护的或私人的部分,系统默认方式是私人的在Objectice-C中,只有实例数据是公共的,被保护的,或者私人的系统默认值的可见性是被保护的,方式是公共的,然而,没有在@interface声明它们或者使用类的范畴的概念的情况下通过@implementation使用一些方法实现模仿私人范围是可能的(cf.25页
4.5部分)它没有阻止这种叫法,但是也鲜有暴露没有以前的声明去实现一种方式是一种特殊的Objectice-C的性质有着特殊的能力详情在21页
4.
3.2部分遗产不能被公开连接,保护,唯一的方式是公开的继承在Objectice-C中,更多地像C++而不是Java(21页4部分)
3.
2.4静态属性在Objectice-C中去声明一类数据属性是不可能的(像C++中静态的),然而,用不同方法去做相同事情确实可能的在安装文件中使用全球的变量(C语言中关键字很容易限制部分文字)类能使用存储器(用类方式或正常方式)它的初始值能够在初始化方式的类中被处理(cf.34页
5.
1.10部分)
3.3方式在Objectice-C方式的语法是不同于C语言功能的语法这部分是为了描述语法,还有加上一些信息在原有的信息规则上
3.
3.1原型,访问,实例方式,类的方式*一种方式前缀“-”实例方式或通过“+”一类方式(像静态的C++),这种符号绝不是那种公共的或私人的与UML符号有联系的方式通常在Objectice-C中是公开的返回值或参数的类型通过括号被包装起来参数通过“”被分类参数和商标被联系起来,在“”前被详细说明商标是方式名称的一部分,可以被修改,这使它的功能更为实用事实上,商标用法是比较系统的,第一个参数的注解其实没有商标,它的商标是方式的名称方式名称和属性名称可以相同,这是毫无疑问的(cf.46页
6.
4.8部分)C++//InfileFoo.h#ifndef__FOO_H__#define__FOO_H__classBar;//forwarddeclarationclassFoo{Bar*bar;public:voiduseBarvoid;};#endif//InfileFoo.cpp#includeFoo.h#includeBar.hvoidFoo::useBarvoid{...}C++//InfileFoo.h#ifndef__FOO_H__#define__FOO_H__classBar;//forwarddeclarationclassFoo{Bar*bar;public:voiduseBarvoid;};#endif//InfileFoo.cpp#includeFoo.h#includeBar.hvoidFoo::useBarvoid{...}请注意用方括号语法时,不应被理解为调用方法 insertObject 对象的架子,而是发送消息 insertObject 到对象的架子这就是Objective-C可以向任何目标发送的任何消息而它不能处理的消息,可以忽略(引发异常,该计划不会中止)如果说,在接收到此消息的时间,目标能够处理它,然后将调用匹配的方法编译器之所以能够提出警告,是因为如果一条消息发送到一个类,它是知道没有匹配的方法存在这不是视为错误由于货运设施(19页
3.
4.3部分)如果目标只已知类型 广告下,将在编译作出时没有警告 ; 在运行时可能出现的错误会更多
3.
3.2自我和超级一个消息有两个特定目标自我和 超级超级 是当前对象,超级类别这样做的关键在于它取而代之的是自我NB:自我不是真正的关键字,它接收到的每个方法,其中的值都是当前对象隐藏的参数可以更改它的值,与c++的不同的是这些关键字然而,这仅在构造函数中
3.
3.3在方法内部的访问实例变量像在c++中,Objective-C的一种方法可以访问其当前的对象的实例变量可选的在c++可以找出自身C++//InfileFoo.h#ifndef__FOO_H__#define__FOO_H__classBar;//forwarddeclarationclassFoo{Bar*bar;public:voiduseBarvoid;};#endif//InfileFoo.cpp#includeFoo.h#includeBar.hvoidFoo::useBarvoid{...}
3.
3.4原型 广告 和签名的重载函数是一部分的代码可以被引用,例如用作函数是一个唯一的 广告 的合适人选,一个人必须小心使用重载C++ 和 Objective-C的目的是使用相反的方式来区分原型前者基于参数类型,而后者基于参数标签在 c++中,两个函数可以具有相同的名称,只要它们的参数有不同的 方法C++intfint;intffloat;//OKfloatisdifferentfromintclassFoo{public:intgint;intgfloat;//OKfloatisdifferentfromintintgfloatconst;//OKconstisdiscriminative};classBar{public:intgint;//OKweareinBar::differentfromFoo::}在Objective-C中,所有的函数都是 C语言 函数它们不能重载(除非可以通知编译器使用(qq;gcc )然而,方法使用不同的语法,并能根据参数标签区分Objective-Cintfint;intffloat;//Error:Cfunctionscannotbeoverloaded@interfaceFoo:NSObject{}-intg:intx;-intg:floatx;//Error:thismethodisnotdifferent//fromthepreviousonenolabel-intg:intx:inty;//OK:twoanonymouslabels-intg:intx:floaty;//Error:notdifferentfromthe//previousone-intg:intxandY:inty;//OK:secondlabelisandY-intg:intxandY:floaty;//Error:notdifferentfromthe//previousone-intg:intxandAlsoY:inty;//OK:secondlabelis//andAlsoYdifferentfromandY@end基于标签的识别方法是用于表达确切的名称的功能,如下文所述@interfaceFoo:NSObject{}//Themethodnameisg-intg;//Themethodnameisg:-intg:floatx;//Themethodnameisg::-intg:floatx:floaty;//Themethodnameisg:andY:-intg:floatxandY:floaty;//Themethodnameisg:andZ:-intg:floatxandZ:floatz@end很显然,两种Objective-C的方法被区分的标签是一种可以取代成员函数的“指针”,表示选择器,所述如
3.
3.5中间部分
3.
3.5指针指向函数选择器该方法有一个特定的语法,使用括号和标签它不可能用这种语法声明函数指向函数指针的概念与C语言目的相同,它只是为了找出方法的指针在哪里出现差别在c++里面,语法是较难的,但它和C语言又是一致的重点是指针的类型C++classFoo{public:intffloatx{...}};FoobarintFoo::*p_ffloat=Foo::f;//PointertoFoo::fbar.*p_f
1.2345;//callingbar.f
1.2345;在Objective-C中,一个新类型已经被提出如一个“指针的方法”被称为一个选择器它的类型是SEL,使用选择器去计算它在这个方法的精确命名方面的价值(关于品牌的参数)称作这个方法可以使用NSInvocation类去做大部分的时间,执行选择器的实用方法科目(从NSObject遗传而来的)是更便利的,但是有一点点限制最简单的三个是-(id)performSelector:SELaSelector;-(id)performSelector:SELaSelectorwithObject:idanObjectAsParameter;-(id)performSelector:SELaSelectorwithObject:idanObjectAsParameter;withObject:idanotherObjectAsParameter;返回的值是一样的方法没有对象的方法的参数,一般应该使用像NSNumber的外覆类,可以提供floatint等等更通用和更强大的NSInvocationCLASS也能被使用(看文档)根据所说的,没有什么可以阻止一个方法被称为一个对象,即使这个对象没有执行事实上,如果这个信息被接受的的话,这个方法是一个很有效的引出但是,当对象不知道这个方法的时候,有一个能捕捉到的例外被提高;申请也不被中断此外,通过联系对选择器去检查一个对象能引出一个方法是可能的最后,@Selector在编译时间上的值被计算出来没有减慢代码的运行Objective-C@interfaceSlave:NSObject{}-voidreadDocumentation:Document*document;@end//Letussupposeanarrayarray[]of10slaves//andadocumentdocument//Normalmethodcallfori=0;i10;++i[array[i]readDocumentation:document];//JustfortheexampletrytouseperformSelector:insteadfori=0;i10;++i[array[i]performSelector:@selectorreadDocumentation:withObject:document];//ThetypeofaselectorisSEL//Thefollowingversionisnotmoreefficientthanthepreviousone//since@selectorisevaluatedatcompile-timeSELmethodSelector=@selectorreadDocumentation:;fori=0;i10;++i[slaves[i]performSelector:methodSelectorwithObject:document];//foranobjectfoowhichtypeisnotknownid//thetestisnotmandatorybutpreventsanexceptiontoberaised//iftheobjecthasnoreadDocumentation:method.if[foorespondsToSelector:@selectorreadDocumentation:][fooperformSelector:@selectorreadDocumentation:withObject:document];因此,一个选择器能被使用作为一个非常简单的函数参数通用的算法,像分类,可以更容易让这个方法专业化(cf.
11.3onpage55).一个选择器不被严格的说的话,可以称为一个函数的指针;它的真正的基础类型是一个c指针,由运行时间记录作为一个方法标识符当一个类被加载它的方法被自动注册在桌面上,因此@selectors能按照预期的工作例如,这个方法,两个相等的选择器能被处理在地址上而不是在字符串的比较方面真正的解决方法,好像一个C函数,能用一个不同的概念去得到IMP的类型被简要的介绍在55页
11.
3.2节它很少被使用除了最优化例如,实质的称呼被处理有选择器而不是由IMPC语言在选择器上和C++方法指针肯定是相等的最后,你可能记得C语言的本质,和在C++上一样,是一个隐藏存储当前对象每一个方法的参数你也能注意到还有第二个存储的对象cmd-是当前的方法Objective-C@implementationFoo-voidf:idparameter//equivalenttoaCfunctionoftype//voidfidselfSEL_cmdidparameter{idcurrentObject=self;SELcurrentMethod=_cmd;[currentObjectperformSelector:currentMethodwithObject:parameter];//recursivecall[selfperformSelector:_cmdwithObject:parameter];//idem}@end
3.
3.6默认值的参数C语言在函数或者方法的参数上,没有给予一个指定的默认值当一些参数被选择的时候,C语言应该制造足够多必要的函数在构造函数的情况下,C语言应该使用designatedinitializer的概念(在32页
5.
1.7节)
3.
3.7 变长参数C语言允许使用一个 变长参数的方法就像在C里面,语法依赖于使用“…”当表达最后观点的时候这个只有一点用处,就像许多Cocoa方法正在做的那样更多的细节可以查阅在C语言文件里
3.
3.8匿名参数在C++里,在一个原型上给一个参数不命名是可能的,因为这个类型足够去描述一个函数的类型这在c语言上是不可能的
3.
3.9原型修饰符(conststaticvirtual”=0”friendthrow)在C++里,一些修饰符可以被添加到一个函数的原型里,它们在C语言里不存在这是例子Const:一个方法不能放在Const上因此,这个mutable关键词不能存在.Static:造成一个实际的方法和一个默认的方法的不同的是通过在一个原型的前面使用“-”或“+”Virtual C语言的方法是virtual,因此关键词是无用的单纯的Virtual方法用一个正式的原型被实现(22页
4.4章)Friend:在C语言里没有“friend”的概念Throw:在C++里,仅仅能限制一个方法去传输一些例外这在c语言里是不可能的
3.4消息和传输
3.
4.1发送消息为零默认情况下,调用一个方法发送消息为零是合法的消息只是忽略,可以大大简化代码通常由空指针减少数量的测试GCC有一个选项来方便行为的禁用这是一个额外的优化
3.
4.2委派一个消息到一个未知的对象委派通常是用户界面的元素.例如表格是利用一个未知的对象发送消息的能力例如一个对象可以,将一些任务委派给助理//Thisisafunctiontodefineanassistant-voidsetAssistant:idslave{[assistantautorelease];//seethesectionaboutmemorymanagementassistant=[slaveretain];}//themethodperformHardWorkcanusedelegation-voidperformHardWork:idtask{//theassistantisnotknown//wecheckthatitcanhandlethemessageif[assistantrespondsToSelector:@selectorperformHardWork:][assistantperformHardWork:task];else[selffindAnotherAssistant];}
3.
4.3转发处理一个未知的消息在C++中,如果一个方法被调用的对象没有实现它,那么代码不能编译在objective-c中,这点有区别,总能发送一个消息给对象,如果它不能在运行时处理,它将会被忽略(引发一个异常)此外,而不是忽略它,它可以转发一个消息给另一个对象当编译器解析是一个对象的类型,它可以检测出如果一个消息发送,方法调用将失败并且引起警告然而无论如何,这不是一个错误因为这种情况下,另一个是可用的这第二次机会是由调用forwardinvocation方法来完成,它是可以重新定义重定向消息在最后一刻,这显然是NSObject的方法,在默认情况下没有下面是另外一种管理助理对象的方法-voidforwardInvocation:NSInvocation*anInvocation{//ifweareherethatisbecausetheobjectcannothandle//themessageoftheinvocation//thebadselectorcanbeobtainedbysendingselector//totheobjectanInvocationif[anotherObjectrespondsToSelector:[anInvocationselector]][anInvocationinvokeWithTarget:anotherObject];else//donotforgettotrywiththesuperclass[superforwardInvocation:anInvocation];}即使一个信息能在最后被处理,在一个前调用方面仅仅在检查选择器的响应方面,将依然不能有返回值事实上,选择器的响应原理没有被设计去猜测前调用是否将工作使用前面的调用被认为是很糟糕的操作,因为当一个错误出现的时候,它正运行着一些代码事实上,这个原理可以做的非常有用,就像在Cocoa’sNSUndomanager的启用方面它允许一个非常好的语法Undo的管理者可以称呼这些方法,认为这不是他称呼这些的目的
3.
4.4向下转型向下转型在C++上被需要去称呼一个子集上的方法,仅仅当父类指针被知道的时候它让使用dynamic-cast成为可能在C语言上,这个操作不是必要的,因为对于一个客观事件的信息能被输出,如果这个方法不能处理它的话然而,为了避免编译器的警告,这个方法仅仅能计算目标的类型在C语言上没有明确的向下转型的操作,这个传统的C语言的计算方法能被使用//NSMutableStringisasubclassofNSStringstringofcharacters//thatallowsmutatingoperations//theappendString:methodonlyexistsinNSMutableStringNSMutableString*mutableString=...initializingamutablestring...NSString*string=mutableString;//storinginanNSStringpointer//thosedifferentcallsareallvalid[stringappendString:@foo];//compilerwarning[NSMutableString*stringappendString:@foo];//nowarning[idstringappendString:@foo];//nowarning附录B系统使用说明书
1.环境信息tomcat7,Oracle11,JDK7Eclipse
2.在Oracle中新建一用户,将此用户下建立系统所需要的表
3.将LibraryDemo导入Eclipse,务必保证正确部署在tomcat7下(保证tomcat/webapps下有次项目)
4.修改配置文件applicationContext.xml里的dataSource节点,将name和password配置为连接数据库的用户名和密码,url节点中@之后修改为自己数据库的端口信息和实例名称
5.将LibraryDemo项目WebContent下的images文件夹拷贝至tomcat/webapps目录下
6.使用tomcat正确部署并加载项目,tomcat启动后,http://localhost:8080/LibraryDemo/admin_index.jsp为管理员初始登录界面初始用户名为admin密码
1234567.http://localhost:8080/LibraryDemo/index.jsp为读者登录界面登录名为读者学号初始密码默认为学号,初始默认无学生,需管理员新建
8.在项目使用过程中,如果发现数据库中有乱码,请修改.XML文件里配置信息。