基于java的商店销售管理系统的设计与实现论文

基于java的商店销售管理系统的设计与实现论文

ID:16452031

大小:1.99 MB

页数:68页

时间:2018-08-09

上传者:xinshengwencai
基于java的商店销售管理系统的设计与实现论文_第1页
基于java的商店销售管理系统的设计与实现论文_第2页
基于java的商店销售管理系统的设计与实现论文_第3页
基于java的商店销售管理系统的设计与实现论文_第4页
基于java的商店销售管理系统的设计与实现论文_第5页
资源描述:

《基于java的商店销售管理系统的设计与实现论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

职场大变样社区(www.zcdby.com):下载毕业设计成品职场大变样社区(www.zcdby.com):下载毕业设计成品全套资料,全部50元以下毕业设计(论文)任务书第1页 职场大变样社区(www.zcdby.com):下载毕业设计成品毕业设计(论文)题目:基于java的商店销售管理系统的设计与实现毕业设计(论文)要求及原始数据(资料):1.综述国内外网上商店销售管理系统研究现状;2.深入了解网上商店销售系统的相关技术;3.熟练掌握商店销售系统分析和编写前后台代码的能力;4.设计并实现网上商店销售系统应用;5.深入网上商店销售系统的关键技术与编写语言;6.训练检索文献资料和利用文献资料的能力;7.训练撰写技术文档与学位论文的能力。 职场大变样社区(www.zcdby.com):下载毕业设计成品第2页毕业设计(论文)主要内容:1.综述网上商店销售系统在商务中的应用;2.了解网上商店系统的相关技术;3.熟悉网上销售系统的开发环境;4.设计某网上商店销售管理系统的界面;5.深入网上商店销售系统的关键技术与编写语言JAVA的设计流程;6.熟练掌握基于实现成功购买货物流程模块;7.设计与实现针对销售流程的程序。学生应交出的设计文件(论文):1.内容完整、层次清晰、叙述流畅、排版规范的毕业设计论文;2.包括毕业设计论文、源程序等内容在内的毕业设计电子文档及其它相关材料。  职场大变样社区(www.zcdby.com):下载毕业设计成品第3页主要参考文献(资料):[1]李桂生.我国无店铺销售行业的现状及发展前景研究[D].吉林大学,2007,8,18[2]龚石贤,朱克.论网络商店与实体商店销售竞争策略研究[J].现代商业,2014,08(6)[3]李小玲.网络商店与实体商店销售竞争研究[D].首都经济贸易大学,2012,3,09[4]王璟.简谈博物馆商店的经营策略[C].江苏省博物馆学会2010学术年会论文集,2010,14(5)[5]陈鹤鸣,周隆.商店经营链建设的筹划[N].北京市财贸管理干部学院学报,2003,28(3)[6]杨金荣,葛芝宾.基于SQLServer2000分布式数据库的连锁商店管理系统之设计与实现[J].福建电脑,2009,25(3)[7]裘志华.绿色食品商店管理系统的设计与实现[J].办公自动化(学术版),2013,04(12)[8]NANCYLEEPELUSO;MARKPOFFENBERGER.SocialForestryinJava:ReorientingManagementSystems[J].HumanOrganization,1989[9]PELUSONANCYLEEPOFFENBERGERMARK.SocialForestryinJava:ReorientingManagementSystems[J].HumanOrganization,1989[10]WANGSHAOFENG.TheroleofJavaRMIindesigningworkflowmanagementsystem[J].ACMSIGSOFTSoftwareEngineeringNotes.2010 职场大变样社区(www.zcdby.com):下载毕业设计成品基于java的商店销售管理系统的设计与实现摘要随着因特网的普及和相关技术的成熟,基于Internet的企业电子商务越显其强大优势。日益普及的Internet不仅带给人们更多及时的资讯信息,而且也在生活的各个方面带给人们更多的便捷,在一定程度上改变着人类的生活方式。本文论述了一个基于JSP技术和MySQL数据库实现的商店销售管理系统的设计与实现,该系统具有商品展示、会员注册登录、购物车、会员留言、订单处理、后台数据库管理等功能。系统遵循软件工程开发方法,本文从系统调研、需求分析、总体设计、数据流分析、业务流程分析、数据库设计、系统详细设计实现等方面进行详细阐述,全面介绍了商店销售管理系统的开发的全过程,最后,对系统开发进行了总结与展望。本系统采用B/S结构、综合运用了Java、JSP/Servlet、JDBC等技术,本系统针对小型企业设计,可以作为商业企业开展电子商务的原始模型。关键词:销售管理系统;电子商务;MySQL数据库II 职场大变样社区(www.zcdby.com):下载毕业设计成品BasedonJavashopsalesmanagementsystemdesignandimplementationAbstractWiththepopularityoftheInternetandrelatedtechnologiesmature,theenterpriseelectroniccommercebasedonInternetmoreshowitsstrongadvantage.ThegrowingpopularityofInternetnotonlybringpeoplemoretimelynewsandinformation,butalsoinallaspectsoflifebringpeoplemoreconvenient,toacertainextent,changingthewaypeoplelive.ThispaperdiscussestheonebasedonJSPtechnologyandMySQLdatabaseimplementationofstoresalesmanagementsystem,thedesignandimplementationofthesystemhavecommodityexhibition,memberregistrationlogin,shoppingcart,leaveamessage,orderprocessing,backgrounddatabasemanagement,andotherfunctions.Systemfollowsthemethodofsoftwareengineeringdevelopment,Thispaperfromthesystemresearch,requirementsanalysis,design,dataflowanalysis,businessprocessanalysis,databasedesignterms,thesystemdetaileddesignelaboraterealization,acomprehensiveintroductiontoallthestoressalesmanagementsystemdevelopmentprocess,andfinally,asummaryofthesystemdevelopmentandprospectThesystemusesB/Sstructure,theintegrateduseofJava,JSP/Servlet,JDBCandothertechnologies,thesystemdesignedforsmallbusinesses,commercialenterprisestodevelope-commerceastheoriginalmodel.Keywords:Salesmanagementsystem;electroniccommerce;MySQLDatabaseII 职场大变样社区(www.zcdby.com):下载毕业设计成品目录1绪论11.1课题背景11.2研究目标11.3论文各部分内容简介22系统设计32.1开发平台描述32.1.1硬件平台32.1.2软件平台32.2相关技术介绍42.2.1BS模式42.2.2JavaServlet技术42.2.3MySQL技术52.3需求分析52.3.1功能需求62.3.2性能需求62.4总体设计62.4.1系统功能描述72.4.2系统功能模块图82.4.3数据字典142.5数据库设计182.5.1概念结构设计182.5.2系统E-R图182.5.3实体属性图192.5.4数据库分析和物理结构设计203系统实现253.1发货处理模块253.2界面显示模块273.2.1界面设计原则27 职场大变样社区(www.zcdby.com):下载毕业设计成品3.2.2数据输入界面设计273.2.3界面显示284系统测试414.1系统测试目的与意义414.2测试过程414.2.1主页面的登录模块测试414.3其他错误42结论43参考文献44致谢45外文原文46中文翻译54 职场大变样社区(www.zcdby.com):下载毕业设计成品1绪论1.1课题背景随着社会高科技,商品经济化突飞猛进的发展,计算机的应用已经普及到经济和社会生活的各个领域。为了适应现代社会人们高度强烈的时间观念,电子商务网站为中小型企业、公司等的销售管理带来了极大的方便。电子商务网站能够为用户提供可靠的信息储存和快捷的信息处理手段。作为计算机应用的一部分,使用计算机对企业、公司的产品销售信息进行管理,具有手工管理所无法比拟的优点。因此,开发这样一套软件成为很有必要的事情,它能够具体化、合理化的管理单位的销售信息情况,用结构化的思维方式去了解计算机的工作原理。计算机软硬件技术日新月异、突飞猛进,引领技术潮流,带来了巨大的社会改变,计算机已成为现代社会人们工作、生活、学习甚至娱乐不可或缺的工具。电子商务也随之日渐完善,其中网络购物也变成电子商务中重要的一部分。现在有很多网上购物形式的网站,著名的淘宝商城、京东商城、当当网就是其中的代表。这些网站给本系统的实现提供了很好的参考。目前,电子商务中的网上购物已是日渐成熟的技术。电子商务网站中所涉及到网络技术及数据库技术也是日渐成熟,一套好的电子商务软件和公司网站相结合将会给公司带来新的利润增长点和更多的客户群。本系统的设计作为计算机应用的一部分,使用计算机对企业、公司的产品销售信息进行管理,具有手工管理所无法比拟的优点。例如:检索迅速、效率高、存储量大、安全性好、成本低廉等。这些优点能够极大的提高一个企业、公司销售管理的效率。本系统开发了基于JSP技术的电子商务网站,其开发主要包括后台数据库的建立和维护以及前台应用程序的开发两方面。前者要求建立起数据一致性和完整性、安全性的平台,而对于后者则要求应用程序功能完备、易操作易使用。项目开发的目的是可以满足购物者和管理员双方面的需求,也是特别为小型企业量身定做的一套电子商务管理系统,以期达到适合于小型企业运作及业务管理的目标。1.2研究目标60 职场大变样社区(www.zcdby.com):下载毕业设计成品本课题的研究目标是设计并实现一个B/S体系结构的B2C式电子商务交易网站。本系统的主要目的是实现商店产品的在线销售,期望达到让用户足不出户就能够在网上购买商品,形成顾客和商店双赢的局面,实现商店销售业绩的大幅增长。同时也是特别为中小企业量身定做的一套电子商务管理系统,以期达到适合中小型企业运作及业务管理的目标。而且这样也锻炼自己的软件开发能力,为日后走上社会参加工作奠定基础。1.3论文各部分内容简介本文的组织结构如下:1.绪论:介绍了课题的研究背景、课题研究目标。2.系统设计:分5个小节介绍了系统开发工具、相关技术、需求分析、总体设计及数据库设计。(1)开发工具:介绍了商店网站的开发所需工具。(2)相关技术介绍:介绍了商店销售管理系统的开发所使用的编程技术及数据库。(3)需求分析:在深入了解电子商务网站的运行和设计模式、收集资料基础上,对商店销售的需求进行调研,确定出系统具备的功能和性能需求。(4)总体设计:对系统具体功能进行分解、描述,并完成系统功能模块图。(5)数据库设计:根据需求分析和功能设计,确定信息系统的数据结构、数据操作。建立E-R图,进行数据库设计。3.系统详细设计实现:介绍了系统各个主要模块模块的详细设计实现方法。包括界面模块、流程、关键代码等。4.结论:对整个论文及设计过程进行总结,说明系统设计过程的心得以及设计中存在的不足,后期还有待完善的地方等。60 职场大变样社区(www.zcdby.com):下载毕业设计成品2系统设计2.1开发平台描述2.1.1硬件平台硬件设备设计是依据所选课题涉及到的设计需求,明确其所要达到的效果,及其所要实现的功能,确定改销售系统物理设备方案,所设计的系统需要的硬件设备方案不仅需要满足改销售系统所要实现的功能需求,而且还要达到可靠性,安全性,高效率的性能需求,这样才能达到高性价比。根据需求分析,本系统理想的环境是配置较高最好,实际操作中硬件平台如下:硬件环境(访问者):建议用户在允许的情况下采用较高配置硬件资源。硬件环境(开发者):Intel3.2G处理器,4G内存,500G磁盘空间。2.1.2软件平台信息系统的部署、开发、研究和运行都需要在软件平台下的集成软件环境中实现,设计需要选择功能齐全、方便、快捷、高效、可以跨平台的软件平台,这对于后面的销售信息系统的开发流程至关重要,然后再结合具体实际开发中的需要,充分考虑软件平台的兼容性,版本和适用范围,并熟练所要用到的各软件的使用,本系统的软件平台选择如下:本系统是在windows平台下进行开发的,目前支持的操作系统有windows7/8/10以及windowsxp,适用于各个版本的Windows操作系统,建议使用64位的Windows8操作系统。开发所需要的环境准备,jdk1.8版本.ApacheTomcat8.0然后再搭配eclipse或者myeclipse,在本机上配好环境之后就可以进去myeclipse进行项目的开发以及代码的编写,jdk中封装了许多java的方法,很方便开发过程的使用,省去了开发工程中的繁琐的代码编写。开发软件是协助人们处理开发和维护软件的工具和环境软件,包括代码编写,编辑程序,数据库系统,集成开发环境等,本系统的开发软件如下:(1)数据库管理系统(DBMS60 职场大变样社区(www.zcdby.com):下载毕业设计成品):为了对数据库进行集中管理,方便数据的增删改查,可以更好地看到数据库中的数据,同时可以并发的处理多个客户机发来的数据处理请求,我们选用MySQL数据库管理系统。(2)为了使项目能够更好达到所要实现的功能需求,我选择了strut2和Hibernate框架对其进行封装和开发,使项目看起来更加容易理解。(3)动态网页技术:使用JSP(JavaServerPages)来建立系统。Web服务器是运行网站必须的软件,系统开发完成后,必须发布到Web服务器上进行部署,方可供用户访问。本系统使用免费的ApacheTomcat6.0作为Web服务器。2.2相关技术介绍2.2.1BS模式BS(Browser/Server,浏览器/服务器)模式又称B/S结构。B/S模式是指需要在TCP/IP的支持下,以HTTP为传输协议,客户端提供浏览器进行访问web服务器,以及与web服务器相关联的mysql后台的数据库。它由四部分组成包括web服务器、浏览器、数据库服务器和应用服务器组成。客户端的浏览器这边发出请求通过URL访问Web服务器,然后web服务器收到请求后,对请求作出一定的处理,Web服务器并请求数据库服务器,将web服务器得到的请求结果以html的形式发送到浏览器客户端。B/S模式是随着Internet技术的发展和不断兴起,对C/S模式不断地延伸和扩展。在这种结构下,用户工作界面是通过IE浏览器来实现的。相较于C/S模式的系统升级维护复杂来说,B/S模式最大的优点是运行简单,维护起来方便界面效果清晰,不仅可以跨平台使用,代码的移植性比较高,可以不同的机器,不同的时间登录并进行访问和操作共同的数据。另外,B/S还便于面向广大未知用户使用,因为只要电脑安装了IE,经过一定的设置,就都可以使用,如建立企业网站发布信息。2.2.2JavaServlet技术Servlet通过创建一个框架来扩展服务器的能力,以提供在Web上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给Servlet,并让Servlet建立起服务器返回给客户机的响应。当启动Web服务器或客户机第一次请求服务时,可以自动装入Servlet。装入后,Servlet继续运行直到其它客户机发出请求。Servlet的功能涉及范围很广。60 职场大变样社区(www.zcdby.com):下载毕业设计成品JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。JavaServlet是JSP的技术基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成。JSP具备平台无关性,可靠性和Java技术的简单易用,完全的面向对象,JSP技术相当于在java语言中嵌入HTML语言,使得页面不单单是静态的html页面,实现了动态网页技术。2.2.3MySQL技术MySQL是一个小型关系型数据库管理系统,适用于小型企业级系统的开发和使用,可以借助NavicatforMySQL对数据库进行可视化的处理,方便对数据库的存储的表格进行管理和查看,方便了mysql的使用,MySQL数据库的开发者为瑞典MySQLAB公司。于2008年1月16号被SUN公司收购。进而在2009年,SUN又被Oracle收购,就目前而言,由于MySQL这款工具成本低,速度快,方便使用,体积小,容纳数据小,高效快捷的缘故被广泛使用于中小型企业网站系统的开发中,为了方便数据库脚本的导入,同时开放源码的缘故,许多中小型网站为了节省费用,增加收益而选择了MySQL作为网站数据库。2.3需求分析软件需求分析是软件生命周期中的关键步骤,通过软件需求分析后,把软件功能和性能总体概念描述为具体的软件需求规格说明书,进而建立软件开发的基础。软件需求分析同时也是一个不断认识和逐步细化的过程,通过软件需求分析,准确地回答了“系统必须做什么”。在本次系统分析过程中采用结构化分析方法,结构化分析方法是面向数据流进行需求分析的方法,其核心思想是分解简化问题,将物理与逻辑表示分开,对系统进行数据与逻辑的抽象,其描述工具是数据流图(DFD)和数据字典(DD)。数据流图是从数据传递和加工的角度,以图形的方式来描述数据流从输入到输出的传输变换过程,而数据字典是对数据流图中的各个元素作完整定义和说明,是数据流图的补充工具。2.3.1功能需求60 职场大变样社区(www.zcdby.com):下载毕业设计成品1、用户注册、登录2、修改个人资料3、浏览商品详情4、浏览商品详情5、购买商品、购物车功能6、生成订单7、客户留言8、管理员登陆9、订单处理(发货、删除、冻结)功能10、商品管理(添加、修改删除)11、公告管理(发布、删除)12、管理员的管理13、会员管理2.3.2性能需求1、设计要求规范项目开发规范统一,模块划分,代码编写均遵照命名规范文档;程序安全并要有良好的可扩展性;用户界面简洁明了、操作简单实用。2、精度及灵活性要求该管理系统要能在较高精度下完成发出的命令,并且在操作员发出错误的指令时给予警告或提示,而非陷入不响应状态。3、时间特性要求响应时间:所有查询操作均在2s内完成;更新处理时间:所有更新操作均在2s内完成。2.4总体设计60 职场大变样社区(www.zcdby.com):下载毕业设计成品系统的总体设计不仅要求对系统的整体功能实现有一个总体的框架,而且要对信息系统的后继需求的变更,功能模块的修改有一个大致的预期,需要将系统分析的逻辑模型应用于相对应的物理结构,物理结构的实现要求能够完成既定的需求文档所需要实现的功能模块,除此之外,编写的详细代码应该具有易读,可移植,稳定性高等优点,而且对于代码的注释要规范,方便对于代码整体的理解和修改,总体设计任务的进行需要在确定需求文档的基础上,编写代码之前,通过整体的设计规划对后继的开发做一个整体的规划和功能模块的划分,建立一个大致的系统实体模型方便为后面的详细设计奠定坚实的基础。2.4.1系统功能描述在软件的总体设计中,完成了数据和系统构建,并通过层次图或结构图来描绘软件结构系统功能模块在设计时应该遵循模块独立原理,也就是说,软件应该有一组完成相对独立的子功能模块组成,这些功能模块之间的接口关系彼此应该尽量简单。系统的模块功能主要是基于B2C电子商务的实现,围绕这个目标,确定本系统应该实现以下功能:在前台模块中实现用户注册、用户登录、用户选购商品、用户修改购物车信息、生成订单、修改用户个人资料、查看商品购买记录等功能。在后台管理模块中实现的功能包括管理员登录、会员管理、订单管理、商品管理、留言管理、公告管理、管理员管理,各功能中又包含了一定的实现的子资源功能模块。前台,系统向用户提供了网站商品的具体详细信息并对商品进行了一定的分类。用户可以根据商品信息和网站提供的相关功能,对其做相应的浏览商品和购物,如注册、加入购物车、修改购物车信息、提交订单,购买的商品会以订单的形式提交给系统。后台,管理员根据用户的订单信息,执行相应的服务,如根据订单信息给用户发货,订单状态可以标示订单是否被处理,管理员根据订单状态决定哪些需要处理。此外,系统管理员模块还能够完成添加、删除或修改商品信息。添加和删除公告,查看用户留言等功能。2.4.2系统功能模块图60 职场大变样社区(www.zcdby.com):下载毕业设计成品1.前台管理包括用户登录、用户注册、个人信息管理、找回密码、购物车、查询商品以及显示产品信息,其中个人信息管理包括查询个人订单、修改个人信息和修改密码,购物车包括添加购物项、删除购物项、修改购物项数量以及提交订单,系统前台管理结构图如图2-1所示。用户登录查询个人订单添加购物项删除购物项修改购物项数量提交订单修改密码修改个人信息用户注册个人信息管理找回密码购物车查询商品显示产品信息前台管理2-1系统前台管理结构图2.后台管理包括用户管理、订单管理、公告管理、留言管理、产品管理、个人信息修改以及Admin管理。系统后台管理结构图如图2-2所示。60 职场大变样社区(www.zcdby.com):下载毕业设计成品查询用户信息用户管理删除用户查看订单订单管理进行发货添加公告冻结订单公告管理查看公告删除公告后台管理查看留言留言管理删除留言添加大类添加小类产品管理修改产品信息添加产品个人信息修改查询产品信息查看管理员信息修改管理员信息Admin管理图2-2系统后台管理结构图2.4.3业务流程图1、系统整体业务流程图60 职场大变样社区(www.zcdby.com):下载毕业设计成品系统可以分为游客(未注册用户)、已注册用户两个角色,游客可以浏览网站,但是只有注册用户才可以登录购买商品,系统整体业务流程图如图2-3所示。看购买记录游客注册用户浏览商品注册查看商品加入购物车提交订单登录更改数量查看订单修改资料找回密码图2-3整体业务流程图2、购物车购物车的整体处理流程如图2-4所示。60 职场大变样社区(www.zcdby.com):下载毕业设计成品开始商品信息浏览将商品放入购物车查看购物车继续购物修改、删除购物车中的购物项提交订单结束图2-4购物车处理流程3、发货处理60 职场大变样社区(www.zcdby.com):下载毕业设计成品发货处理的整体处理流程如图2-5所示。开始浏览某一未处理订单逐条查询出订单对应的订单项查看该订单项中相应商品的数量商品的库存满足NN发货成功发货不成功结束图2-5发货处理流程图2.4.4数据流分析60 职场大变样社区(www.zcdby.com):下载毕业设计成品1、顶层数据流图小型电子商务网站订单信息、留言信息会员、商品、订单、公告会员个人信息留言及管理员个人信息会员管理员商品信息、公告信息会员、订单、公告、留言留言信息及会员个人信息商品处理信息及管理员个人信息图2-6DFD顶层图如图2-6所示是DFD顶层图,它表现出了我们要开发的系统所需要的外部参与人员和流入流出的数据流的种类。由图2-5可以看出,本系统主要接收的数据可有注册的个人注册信息以及订单信息;系统管理员的个人信息以及会员、订单、商品处理信息等等。2、整体数据流图图2-7整体数据流图如图2-7所示是整体DFD60 职场大变样社区(www.zcdby.com):下载毕业设计成品,是对顶层数据流图的进一步细化。它更加详细地表现出了我们要开发的系统所需要外部参与人员的流入流出的数据流种类。3、订购数据流图图2-8订购处理流程的详细DFD图如图2-8所示详细地表示出订购处理流程的数据输入输出流。用户通过查看商品信息后,可以把相中的商品加入相应的购物车,并可以对购物车进行修改,包括数量的修改和购物项的删除,确定购买商品后可以进行结算,到达订单提交模块,用户提交完订单信息。2.4.3数据字典数据库的逻辑结构设计是把上面的设计用逻辑表格的形式加以表示,并对数据的类型进行定义,在整个过程中必须严格定义每一个具体的数据,形成数据字典。1、数据字典用户信息表主要记录对于网站前台用户的信息,如表2-1所示。表2-1用户信息数据流数据存储名用户信息说明对用户的基本信息,如用户编号、用户账号、用户密码等信息进行记录数据描述用户ID+用户账号+用户密码+真实姓名+邮箱+性别+出生日期+地址+邮编+固定电话+手机号码+安全问题+安全问题答案+头像+积分管理员信息表主要记录对于系统后台管理员的信息,如表2-2所示。表2-2管理员信息数据流60 职场大变样社区(www.zcdby.com):下载毕业设计成品数据存储名管理员信息说明对管理员的基本信息,如管理员编号、管理员姓名、登录账号、登录密码等信息进行记录数据描述管理员编号+管理员级别编号+管理员姓名+登录账号+登录密码商品信息表主要记录对于系统涉及商品的信息,如表2-3所示。表2-3商品信息数据流数据存储名商品信息说明对商品的基本信息,如商品编号、所属大类编号、所属小类编号、商品名称、编码、介绍、产地、品牌、原价、现价等信息进行记录数据描述商品编号+所属大类编号+所属小类编号+商品名称+编码+介绍+产地+品牌+原价+现价订单信息表主要记录对于用户提交的订单的信息,如表2-4所示。表2-4订单信息数据流数据存储名订单信息说明对商品的基本信息,如订单编号、用户名称、收货人姓名、地址、邮编、邮箱、下单日期、状态等信息进行记录数据描述订单编号+用户名称+收货人姓名+地址+邮编+邮箱+下单日期+状态订单项信息表主要记录对于订单中详细购买商品的信息,如表2-5所示。表2-5订单项信息数据流数据存储名:订单项信息说明:对订单项的基本信息,如订单项编号、订单编号、商品ID、商品名称、价格、购买数量等信息进行记录数据描述:订单项编号+订单编号+商品ID+商品名称+价格+购买数量公告信息表主要记录对于公告的详细信息,如表2-6所示。60 职场大变样社区(www.zcdby.com):下载毕业设计成品表2-6公告信息数据流数据存储名:公告信息说明:对公告的基本信息,如公告编号、公告标题、公告内容、发布时间等信息进行记录数据描述:公告编号+公告标题+公告内容+发布时间留言信息表主要记录对于用户留言的详细信息,如表2-7所示。表2-7留言信息数据流数据存储名:留言信息说明:对留言的基本信息(留言编号+留言标题+留言内容+留言时间+留言头像)进行记录数据描述:留言编号+留言标题+留言内容+留言时间+留言头像2、数据流登录数据流,如表2-8所示。表2-8登录数据流数据流名称组成名称登录数据流简述用户或管理员登录是输入的个人名称和密码来源用户或管理员登录是输入的个人名称和密码去向前台网站或后台管理系统组成用户或管理员账号+密码商品信息数据流,如表2-9所示。表2-9商品信息数据流数据流名称组成名称商品信息数据流简述用户查询时商品的基本信息来源用户查询时的输入信息去向商品查询模块组成商品类别+商品名称/商品品牌/编码购物车数据流,如表2-10所示。表2-10购物车数据流60 职场大变样社区(www.zcdby.com):下载毕业设计成品数据流名称组成名称购物车信息流简述用户将商品添加至购物车来源商品的信息+用户信息去向购物车模块组成订单项编号+商品编号+商品名称+商品价格+购买数量结算信息数据流,如表2-11所示。表2-11结算信息数据流数据流名称组成名称结算信息流简述用户提交订单需要填写的信息来源订单项信息+用户信息去向填写订单模块组成订单编号+用户账号+收货人+收货地址+…信息修改数据流,如表2-12所示。表2-12信息修改数据流数据流名称组成名称信息修改流简述用户或管理员输入新个人信息来源用户或管理员输入的信息去向操作成功或操作失败组成用户或管理员编号+旧密码+新密码+确认密码订单处理数据流,如表2-13所示。表2-13订单处理数据流数据流名称组成名称订单处理流简述对订单进行发货处理来源订单项信息+订单信息+商品信息去向订单发货处理模块组成订单状态和商品数量修改操作成功或失败2.5数据库设计60 职场大变样社区(www.zcdby.com):下载毕业设计成品2.5.1概念结构设计概念结构设计是将需求分析文档中涉及到的用户需求化抽象为概念模型的过程,将信息系统中所涉及到的实体一一列出来,并准确分析各实体之间的关系,然后在需求分析的基础上,设计出总体的概念结构模型,这样就可以准确查看各个实体所要实现的各功能,已经各实体之间的关系类型,通过分析得到的概念设计模型,有助于各模块功能的书写和设计,将概念设计模型应用于实际的物理应用,方便查看个实体的功能是否一一得到实现,数据库里个实体之间是否可以对应起来,它是整个数据库的关键。概念结构的主要特点是能真实、充分、准确地反映现实世界,将不容易抽象的东西转化为易于理解和更改的模型,可以向关系、网状、层次等各种数据模型转换。描述概念模型的工具是E-R模型。2.5.2系统E-R图本系统的E-R图表现了系统中各个实体之间的联系,具体的如图2-9所示。图2-9系统E-R图2.5.3实体属性图60 职场大变样社区(www.zcdby.com):下载毕业设计成品实体所具有的某一特性成为属性。一个实体可以有若干个属性刻画。如图2-10所示为大类别、小类别、商品的属性.所属大类别编号类别编号类别名称小类别图2-10实体属性图1如图2-11所示表示了留言的属性留言标题留言作者留言者头像留言编号留言留言时间留言内容图2-11实体属性图2如图2-12所示为会员、订单、订单项的属性。60 职场大变样社区(www.zcdby.com):下载毕业设计成品图2-12实体属性图32.5.4数据库分析和物理结构设计数据库是信息系统的基础和核心,数据库设计的质量将直接关系到信息系统开发的成败和优劣。制作数据库首先要确定实体的属性和实体间的关系,根据关系做出数据表。(1)tb_admintype表tb_admintype表也叫管理员类别表,用于存放管理员类别信息,如表2-14所示。表2-14tb_admintype表字段名类型可否为空含义adminTypeIdint(11)N主键adminTypeNamevarchar(50)N管理员姓名(2)如表2-15所示为管理员信息表,用于存放管理员信息的数据表。表2-15用于存放管理员信息数据表tb_admin(N表示非空)60 职场大变样社区(www.zcdby.com):下载毕业设计成品字段名类型可否为空含义IDint(4)N主键AdminTypeint(11)N管理员类别,外键AdminNamevarchar(50)N管理员真实姓名LoginNamevarchar(12)N登录账号LoginPwdvarchar(12)N登录密码(3)如表2-16所示为用户信息表,用于存放用户信息的数据表。表2-16用于存放用户信息数据表tb_user(N表示非空)字段名类型可否为空含义Idint(11)N主键、自增Namevarchar(30)N用户登录名Passwordvarchar(16)N登录密码Emailvarchar(50)N邮箱trueNamevarchar(40)N真实姓名Sexvarchar(30)性别Birthdayvarchar(20)生日Addressvarchar(100)住址Postcodevarchar(10)邮编Phonevarchar(15)固话Mphonevarchar(15)手机Questionvarchar(30)N安全问题Answervarchar(30)N安全问题答案imgvarchar(100)头像scoreint(11)积分(4)如表2-17所示为大类别信息表,用于存放大类别信息的数据表。表2-17用于存放大类别信息数据表tb_supertype(N表示非空)字段名类型可否为空含义superTypeIdint(11)N主键typeNamevarchar(50)N唯一类名称(5)如表2-18所示为小类别信息表,用于存放小类别信息的数据表。表2-18用于存放小类别数据表tb_subtype(N表示非空)字段名类型可否为空含义subTypeIdint(11)N主键superTypeIdint(11)N外键subTypeNamevarchar(50)N小类名称(6)如表2-19所示为商品信息表,用于存放商品信息的数据表。60 职场大变样社区(www.zcdby.com):下载毕业设计成品表2-19用于存放商品信息数据表tb_goods(N表示非空)字段名类型可否为空含义BookIdint(11)N主键superTypeIdint(11)N外键subTypeIdint(11)N外键goodsNamevarchar(200)商品名称Codevarchar(20)编码号introducetext介绍pricefloat原价nowPricefloat现价picturevarchar(200)图片produceDatevarchar(20)生产日期publishervarchar(40)产地authorvarchar(20)品牌inTimetimestamp上传时间Newgoodsint(11)是否新品Salegoodsint(11)是否热卖商品Hostgoodsint(11)是否特价商品Specialgoodsint(11)是否特种商品goodsNumint(11)数量(7)如表2-20所示为订单信息表,用于存放订单信息的数据表。表2-20用于存放订单信息数据表tb_order(N表示非空)字段名类型可否为空含义orderIdint(11)N主键、自增namevarchar(20)购买账号recvNamevarchar(20)收货人名称addressvarchar(20)收货地址postcodevarchar(10)邮编emailvarchar(20)邮箱orderDatetimestamp订单日期flagint(11)N状态0-未发货1-已发货2-已冻结(8)如表2-21所示为订单项信息表,用于存放订单项信息的数据表。60 职场大变样社区(www.zcdby.com):下载毕业设计成品表2-21用于存放订单项信息数据表tb_orderitem(N表示非空)字段名类型可否为空含义orderItemIdint(11)N主键、自增orderIdint(11)N外键goodsIdint(11)N外键goodsNamevarchar(50)商品名称pricefloat价钱goodsNumint(11)购买数量(9)如表2-22所示为留言信息表,用于存放留言信息的数据表。表2-22用于存放留言信息数据表tb_note(N表示非空)字段名类型可否为空含义idint(11)N主键、自增titlevarchar(20)N标题authorvarchar(20)N品牌contentvarchar(50)N内容ly_timetimestamp留言时间(10)如表2-23所示为公告信息表,用于存放公告信息的数据表。表2-23用于存放公告信息数据表tb_inform(N表示非空)字段名类型可否为空含义informIdint(11)N主键、自增informTitlevarchar(30)公告标题informContentvarchar(30)公告内容informTimetimestamp公告发布时间数据库的用户角色权限划分在明确了不同角色的操作权限,有利保障数据库信息的操作。角色设计将整个使用本系统分为多个不同角色,采用比较人性化的系统权限分配方式,它可以由系统管理员进行权限的分配。一般来说有会员管理员、商品管理员、订单管理员以及系统管理员等等,如表2-24所示:表2-24系统角色权限表60 职场大变样社区(www.zcdby.com):下载毕业设计成品权限描述会员进行注册、登录、网上购物、留言,查看和修改个人信息管理。会员管理员进行会员信息的删除、查看以及个人密码的修改商品管理员添加、查看公告,查看会员留言,添加商品大类别、小类别,增加、删除商品信息以及个人密码的修改订单管理员添加、查看公告,查看会员留言,对订单进行发货、冻结处理,删除订单以及个人密码的修改系统管理员删除、修改管理员信息60 职场大变样社区(www.zcdby.com):下载毕业设计成品3系统实现以下给出系统模块中比较复杂的程序设计说明,其余的说明在源代码中有注释。3.1发货处理模块1、程序描述该模块用于对订单进行发货处理。2、功能发货处理模块的功能设计如表3-1所示。表3-1发货处理模块的功能表程序名称发货处理相关数据库表订单信息表、订单项信息表、商品信息表输入订单信息状态,商品数量、订单项信息输出新的订单状态和商品数量功能说明读取订单状态读取对应订单项验证订单项对应商品是否满足发货要求3、流程图如图3-1所示为发货处理模块程序流程60 职场大变样社区(www.zcdby.com):下载毕业设计成品图3-1订单发货流程图4、核心代码片段//获得要处理的订单号StringorderId_str=request.getParameter("orderId");//根据订单号获得订单信息Orderorder=model.getOneOrder(orderId);//获得订单号对应的订单项ListListorderItemList=(List)order.getOrderItem();//逐条读取每条订单项for(inti=0;i账号:密码:记住密码${loginMessage}60 职场大变样社区(www.zcdby.com):下载毕业设计成品注册忘记密码?点击这里找回密码.后台主界面提供了一个给管理员进入进行各项操作的一个平台,不同权限的管理员对应不同的操作。如图3-3所示。图3-3后台查看商品界面后台商品列表显示界面上,使用foreach循环实现将所有商品全部显示到界面上。代码如下:${goods.goodsId}${goods.goodsName}${goods.introduce}${goods.price}${goods.nowPrice}……详情60 职场大变样社区(www.zcdby.com):下载毕业设计成品管理员可以查看系统中所有的注册用户,界面上显示了用户名、手机等基本资料,如图3-4所示。图3-4注册用户管理界面注册用户列表显示代码如下:${user.id}${user.name}${user.sex}${user.mphone}${user.address}${user.score}详情60 职场大变样社区(www.zcdby.com):下载毕业设计成品管理员可以查看会员用户购买商品的订单详情,具体包括用户名、收货人姓名、地址、邮编、Email等基本信息,管理员在发货完成后,可以在界面上单击发货完成,用户可以在查看订单时实时查询订单的状态,如图3-5所示。图3-5订单列表界面订单列表显示界面实现的代码如下:${order.orderId}${order.user.name}${order.recvName}${order.user.address}${order.user.postcode}${order.user.email}${order.orderDate}${order.flag}详情(2)前台处理界面60 职场大变样社区(www.zcdby.com):下载毕业设计成品在前台首页可以浏览商品相关信息,在登陆界面上输入正确的账号、密码之后,可以进行在线购买。如图3-6所示。图3-6系统前台主界面单击商品图片,即可打开商品详细页面,如图3-7所示。图3-7商品详细页面图该页面上,接收商品ID参数,从数据库商品表(tb_goods)中查询该商品的详细信息,封装为一个Goods对象返回到前台页面进行显示,关键代码如下:GoodsGoods=newGoods();PreparedStatementpstmt=null;ResultSetrs=null;60 职场大变样社区(www.zcdby.com):下载毕业设计成品DbUtildbUtil=null;Stringsql="select*fromtb_goodswherebookId=?";try{dbUtil=newDbUtil();pstmt=dbUtil.getCon().prepareStatement(sql);pstmt.setInt(1,GoodsId);rs=pstmt.executeQuery();if(rs.next()){Goods.setGoodsId(rs.getInt("bookId"));……}returnGoods;}在商品详情界面下方提供了该商品的购买记录,供其他买家参考,如图3-8所示。图3-8购买商品记录界面该功能设计的核心代码如下:DbUtildbUtil=null;Stringsql="selectB.name,A.goodsNum,B.orderDatefromtb_orderitemA,tb_orderBwhereA.orderId=B.orderIdandA.bookId="+GoodsId+"";60 职场大变样社区(www.zcdby.com):下载毕业设计成品try{dbUtil=newDbUtil();pstmt=dbUtil.getCon().prepareStatement(sql);rs=pstmt.executeQuery();while(rs.next()){BuyRecordbrc=newBuyRecord();brc.setName(rs.getString("name"));brc.setGoodsNum(rs.getInt("goodsNum"));brc.setOrderDate(rs.getString("orderDate"));searchList.add(brc);}}catch(SQLExceptione){}购物车界面提供了一个给会员购买多个商品的一个接口,单击OrderNow按钮,即可将商品添加入购物车。如图3-9所示。图3-9购物车界面购物车实现的代码如下所示:<%Collectionci=(Collection)request.getSession().getAttribute("ci");Useruser=(User)request.getSession().getAttribute("user");if(user==null){out.println("请先登录!!");}else{60 职场大变样社区(www.zcdby.com):下载毕业设计成品if(ci==null||ci.size()<=0){out.print("购物车中没有商品!!");}else{Iteratorit=ci.iterator();while(it.hasNext()){CartItemcartItem=it.next();%>"method="post"name="cartForm">……显示购物车明细<继续购物结算>

订单提交界面提供了一个给会员进行订单提交的一个接口。如图3-10所示。图3-10订单提交界面提交订单实现对应的关键代码如下:Useruser=(User)request.getSession().getAttribute("user");//得到session中的userOrderorder=newOrder();//得到用户提交过来的详细的订单信息60 职场大变样社区(www.zcdby.com):下载毕业设计成品StringrecvName=request.getParameter("recvName");//收货人姓名......order.setRecvName(recvName);Collectionci=(Collection)request.getSession().getAttribute("ci");//得到session中的orderitemListitem=newArrayList();//存放订单项的ListIteratorit=ci.iterator();while(it.hasNext()){CartItemcartItem=(CartItem)it.next();OrderItemorder_Item=newOrderItem();order_Item.setGoodsId(cartItem.getGoods().getGoodsId());……item.add(order_Item);}order.setOrderItem(item);Modelmodel=newModel();intorderId=model.addOrder(order);order.setOrderId(orderId);request.getSession().setAttribute("order",order);Cartcart=newCart();Collectioncartitem=cart.getItems();request.getSession().setAttribute("ci",cartitem);response.sendRedirect("orderSuccess.jsp");订单提交成功后,系统向订单表中插入一条信息,同时在界面上显示订单的流水号以及订单的基本资料,如图3-11所示。60 职场大变样社区(www.zcdby.com):下载毕业设计成品图3-11订单提交成功界面订单提交成功后,单击查看订单链接,可以查看当前登录用户的所有订单信息,界面上显示了订单的基本状态,便于用户及时了解订单是否发货,如图3-12所示。图3-12查看订单界面查看订单关键代码如下:Stringname=(String)request.getSession().getAttribute("name");ModelOrdermodel=newModelOrder();Listlist=model.selectOr(name);request.getSession().setAttribute("list",list);60 职场大变样社区(www.zcdby.com):下载毕业设计成品response.sendRedirect("selfOrder.jsp");游客只有注册为本站会员,方可进行网上购物。注册时,需要填写用户名、密码、地址等基本资料,注册界面如图3-13所示。图3-13用户注册界面用户注册关键代码如下://获取客户端发送过来的信息Stringname=request.getParameter("name");Stringpassword=request.getParameter("password");Stringemail=request.getParameter("email");StringtrueName=request.getParameter("trueName");……Useruser=newUser();user.setName(name);user.setPassword(password);user.setEmail(email);user.setTrueName(trueName);Modelmodel=newModel();……if(model.addUser(user)){//注册成功request.getSession().setAttribute("user",user);response.sendRedirect("index.jsp");60 职场大变样社区(www.zcdby.com):下载毕业设计成品}else{//注册失败response.sendRedirect("errRegister.jsp");}当用户忘记登录密码时,可以单击找回密码链接进行密码重置。首先需要输入用户名,其次,输入注册时设置的安全提示问题的密码,若回答正确则可以进入密码重置界面,界面如图3-14所示。图3-14找回密码界面用户登录后可以给网站管理员留言,其界面如图3-15所示。图3-15用户留言界面60 职场大变样社区(www.zcdby.com):下载毕业设计成品当用户登录后,可以修改个人登录密码,界面如图3-16所示。图3-16修改密码界面当用户登录后,可以修改个人资料,界面如图3-17所示。图3-16修改资料界面60 职场大变样社区(www.zcdby.com):下载毕业设计成品4系统测试4.1系统测试目的与意义系统测试是在一个信息系统开发的过程中要占据三分之一的时间,其之所以占据这么长的的时间,就是为了保证系统的质量可靠性和代码的容错率,减少最后客户测试时带来的错误,提前对整个系统进行一个全面的审查,保证了系统的稳定性,尽可能的对系统的抗压进行测试,防止系统突发的意外和崩溃。系统测试的任务是尽可能彻底的检查出程序中的错误,解决程序中的小bug,增加系统的抗压性,查看其功能是否已经达到客户的需求,提高软件系统的稳定性,其目的是检验系统“做得怎样””是否已经实现全部需求文档的功能”。这阶段又可以细分为三个步骤:首先是模块测试,测试每个模块的功能是否已经全部实现,程序是否正常运行,其次是组装测试,将各模块整合到一起看是否项目能够流畅的跑起来,各个模块之间的衔接是否已经到位.确认测试,测试整个系统的功能和性能是否全部实现了用户的真实需求,确认测试是最关键的一个环节,这个环节关系到后继项目能否交付给用户,意义重大,整个系统测试过程中都需要相对应的测试报告,每一块测试都需要相应的人员负责,在测试的整个过程发现的错误和bug,要及时进行改正和完善,在进行修复后再进行新一轮的测试看看是否满足需求规格的定义。4.2测试过程在测试之初,系统中的数据是初始化时随便输入进行校验的,为了确定是否实现了开发设计的功能模块,没有实用性价值,在测试过程中还需要针对性的进行输入数据,以便准确可靠地对各模块进行测试,不仅要选择有意义的数据进行测试而且还要学会逆向思维选择无意义的数据进行测试,这样才能准确可靠地反映系统实际的功能实现情况。这样周而复始不断发现问题,不断输入新的数据进行测试,经过反复的测试、调试,把问题一个个的解决,找出与客户需求不符合的需求,最终系统可以正常运行。4.2.1主页面的登录模块测试测试流程:1.打开系统首页,输入错误的登录信息2.登录60 职场大变样社区(www.zcdby.com):下载毕业设计成品3.输入正确的登录信息4.登录5.测试结果表4-1登录模块测试表模块名称测试用例预期结果实际结果是否通过登录模块用户名:null密码:null弹出错误提示,请输入用户名登陆失败,提示请输入用户名通过登录模块用户名:m1密码:null弹出错误提示,请输入密码失败,提示输入密码通过登录模块用户名:m1密码:1弹出错误提示,用户名或者密码错误登陆失败,提示用户名或者密码错误通过4.3其他错误在程序设计实现的过程中不可避免的会产生各种难以预料的错误,如书写错误、传值类型不一致、参数传递问题等等。这些都需要通过细心的检测与不断的调试才能够排除。比如在servlet路径配置时因粗心错误导致运行导致所报错误,如图4-1所示:图4-1由于servlet路径配置错误,运行时的提示解决方法:404错误一般都是访问的页面找不到导致的,只要检查一下自己页面跳转的路径就可以了。60 职场大变样社区(www.zcdby.com):下载毕业设计成品结论通过几个月以来资料的收集和系统设计,基于java技术的商店销售管理系统的设计与实现终于完成了。在设计整个系统的过程中,我感受最深的是需求分析,整个系统的设计和对用户体验的考虑。只用用户感觉用的习惯,电子商务网站才能受客户欢迎。以下是我对系统做的一些总结:1.系统功能基本达到设计的要求。系统各模块均按设计要求编写,并已实现。2.系统界面简洁,操作简单。本着对用户体验的重视,系统在操作性和实用性上相对简约。3.系统结构和功能易于扩充。基于java的电子商务网站本身就易于维护和扩展,加上本系统数据库的可扩充性,本系统对于新的需求将易于做出变化和适应。4.系统不足的地方在于安全性方面。网上交易的不安全性大家是有目共睹的。对于不安全的环境,系统采取的技术和措施略显不足。5.低成本既是本系统的优点也是缺点之一。借着开源项目的恩惠,本系统开发成本相对较低,但对于界面实现和逻辑实现层面的不完全独立,是本系统不成熟的一个方面。数据的冗余和加载慢亦是缺陷。总的来说,本系统最终实现了预期的主要功能。由于本人水平有限,对于设计和编程的经验不足,系统还存在着或多或少的缺陷,希望在将来可以补足。60 职场大变样社区(www.zcdby.com):下载毕业设计成品参考文献[1]李桂生.我国无店铺销售行业的现状及发展前景研究[D].吉林大学,2007,8,18[2]龚石贤,朱克.论网络商店与实体商店销售竞争策略研究[J].现代商业,2014,08(6)[3李小玲.网络商店与实体商店销售竞争研究[D].首都经济贸易大学,2012,3,09[4]王璟.简谈博物馆商店的经营策略[C].江苏省博物馆学会2010学术年会论文集,2010,14(5)[5]陈鹤鸣,周隆.商店经营链建设的筹划[N].北京市财贸管理干部学院学报,2003,28(3)[6]杨金荣,葛芝宾.基于SQLServer2000分布式数据库的连锁商店管理系统之设计与实现[J].福建电脑,2009,25(3)[7]裘志华.绿色食品商店管理系统的设计与实现[J].办公自动化(学术版),2013,04(12)[8]NANCYLEEPELUSO;MARKPOFFENBERGER.SocialForestryinJava:ReorientingManagementSystems[J].HumanOrganization,1989[9]PELUSONANCYLEEPOFFENBERGERMARK.SocialForestryinJava:ReorientingManagementSystems[J].HumanOrganization,1989[10]WANGSHAOFENG.TheroleofJavaRMIindesigningworkflowmanagementsystem[J].ACMSIGSOFTSoftwareEngineeringNotes.201060 职场大变样社区(www.zcdby.com):下载毕业设计成品致谢经过三个月的努力,毕业设计终于完成了,四年大学生活也即将结束了。这次毕业设计是对我大学4年所学知识的一个回顾和总结,并在此基础上进行了综合应用和拓展,从中我深深的体会到能够把一个系统做的很完善是一件很困难的事情,它不仅仅体现在实现其主要的功能,更主要体现在你的设计思路和开发过程。在这里首先感谢我的指导老师王亚娟和张辉老师,感谢他们在毕业设计期间给予的指导。从他们的身上我学习到了很多东西,老师给我的不仅仅是知识上的帮助,他们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。在他们工作非常繁忙的情况下,仍很认真的帮我修改论文,提出建议,我为老师的负责而感动,也衷心的感谢他们。同时也感谢四年来指导和帮助我的老师们,是你们让我了解了软件这个行业,掌握了计算机领域的一些基本知识。也感谢四年来陪我一起走过的同学们,谢谢你们在四年中对我的宽容和帮助。你们让我学会了如何融入一个团队,如何互相学习,互相鼓励,和你们在一起的日子,将是我人生中最珍贵的回忆。感谢太原理工大学软件学院给我提供的学习和锻炼的机会,通过这次毕业设计自己的亲力实践,我对自己所学的知识又有了更加深入的了解,自己也学到了不少新的东西,自己的动手实践能力得到了很大的提升。感谢我的父母,在我求学的路上,是你们一直在默默的支持着我。你们无私的爱让我永远不会感到无助,让我更勇敢的前行。再次衷心的感谢和我一起走过的人,感谢曾经帮助过我的人。我一定会努力的工作和生活来回报你们,愿我们的未来更美好!60 职场大变样社区(www.zcdby.com):下载毕业设计成品外文原文One:AjaxforJavadevelopers:JavaobjectserializationforAjaxIfyou'redoingJava™WebdevelopmentusingAsynchronousJavaScriptandXML(Ajax),thendeliveringdatafromtheservertotheclientisprobablyyourtopconcern.InthissecondarticleintheAjaxforJavadevelopersseries,PhilipMcCarthywalksyouthroughfiveapproachestoJavaobjectserializationandgivesyoualltheinformationyouneedtochoosethedataformatandtechnologybestsuitedtoyourapplication.Inthefirstarticleinthisseries,IintroducedyoutothebuildingblocksofAjax:(1)HowtouseaJavaScriptXMLHttpRequestobjecttosendanasynchronousrequesttoaserverfromaWebpage(2)HowtohandleandrespondtothatrequestwithaJavaservletreturninganXMLdocumenttotheclient(3)HowtousethatresponsedocumentontheclienttoupdateyourpageviewThistime,I'llcontinuediscussingthedevelopmentfundamentalsofAjax,butI'mfocusingonwhatmattersmostformanyJavaWebdevelopers:producingdatafortheclient.MostJavadevelopershaveappliedtheModel-View-Controller(MVC)patterntotheirWebapplications.InatraditionalWebapplication,theviewcomponentiscomposedofJSPs,orperhapsanotherpresentationtechnologysuchasVelocitytemplates.ThesepresentationcomponentsupdatetheuserinterfacebydynamicallyproducingawholenewpageofHTMLtoreplacewhattheuserwaspreviouslylookingat.InthecaseofaJavaWebapplicationwithanAjaxUI,however,theJavaScriptclientcodehasultimateresponsibilityforupdatingwhattheusersees,basedondatareceivedinresponsetoanXMLHttpRequest.Fromtheperspectiveoftheserver,theviewbecomesthedatarepresentationitsendsinresponsetoclientrequests.ProducingXMLfromJavaclassesThereareplentyofreasonstodeliverAjaxresponsesasXML:everyAjax-capablebrowserhasmethodsfornavigatingXMLdocuments,andtherearemanyserver-sidetechnologiesforworkingwithXMLdata.It'seasytodefinethecontractbetweenyourAjax60 职场大变样社区(www.zcdby.com):下载毕业设计成品clientandserverbyproducingaschematodescribethetypesofdocumentsthatwillbeexchanged,andifyoutakeaservice-orientedapproachtoyourserver-sidearchitecture,usingXMLallowsnon-Ajaxclientstoconsumeyourdatafeedsaswell.I'llconsiderthreeofthewaysyoucanproduceXMLdatafromyourJavaobjectsanddiscusstheprosandconsofeach.Roll-your-ownserializationFirstofall,youcouldgenerateXMLprogramaticallyfromyourobjectgraph.ThisapproachcanbeassimpleasimplementingatoXml()methodineachofyourJavaBeanclasses.YouwouldthenpickasuitableXMLAPIandhaveeachbeanemitelementstorepresentitsstateandrecursivelycalldowntheobjectgraphtoitsmembers.Clearly,thisapproachdoesn'tscalewelltoalargenumberofclassesbecauseeachoneneedstohaveitsownXML-generatingcodespeciallywritten.Ontheupside,it'sasimpleapproachtoimplement,there'snooverheadintermsofextraconfigurationoramore-complexbuildprocess,andanygraphcomposedofyourJavaBeanscanbeturnedintoanXMLdocumentwithacoupleofcalls.XMLbindingframeworksInrecentyears,severalJavaAPIshavebeendevelopedtosimplifytheprocessofbindingXMLdocumentstoJavaobjectgraphrepresentations.MostprovidebothXMLmarshalingandunmarshaling;thatis,theyperformtwo-wayconversionsbetweenJavaobjectgraphsandXML.TheseframeworksencapsulatealltheworkofhandlingXML,meaningthatapplicationcodeonlyhastodealwithplainJavaobjects.Theytendtoprovideusefulancillaryfunctionsaswell,suchasdocumentvalidation.Broadly,theseframeworkstaketwodifferentapproaches:codegenerationandobject-to-XMLmapping.I'llexplainboth.Thecode-generationapproachBindingframeworksthatemploycodegenerationincludeXMLBeans,JAXB,Zeus,andJBind.Castorcanalsoemploythistechnique.ThestartingpointforanyoftheseframeworksisanXMLschemathatdescribesthedatatypesofyourdocuments.Usingtoolsprovidedbytheframework,youthengenerateJavaclassesthatrepresenttheseschema-definedtypes.Finally,youwriteyourapplicationusingthesegeneratedclassestorepresentyourmodeldataandserializethemtoXMLthroughsomeconvenientmechanismprovidedbytheframework.60 职场大变样社区(www.zcdby.com):下载毕业设计成品ThecodegenerationapproachisagoodoneifyourapplicationemploysalargeXMLgrammar.ThescalingproblemofwritingcustomXML-serializationmethodsacrosstensofclassesvanishes.Ontheotherhand,younolongergettodefineyourownJavaBeans.Theframework-generatedJavaclassestypicallyfollowtheXML'sstructuresveryclosely,whichcanresultinthembeingratherunwieldytocodeagainst.Also,thegeneratedclassesbecomedumbdatacontainersbecauseyoucan'tgenerallyaddbehaviortothem.Broadlyspeaking,youneedtomakecompromisesinyourapplicationcodetoplaynicelywiththeschema-generatedtypes.Anotherpitfallisthatachangeintheschemacauseschangestothegeneratedclasses,whichinturnhasaknock-oneffecttoanycodeyou'vewrittenaroundthem.XMLbindingframeworksofthistypearemostusefulindataunmarshaling(i.e.,consumingXMLdocumentsandconvertingthemintoJavaobjects).Unlessyouhaveahugedatamodelandwouldbenefitfromhavingclassesgeneratedforyou,code-generation-basedframeworksareprobablyoverkillforanAjaxapplication.ThemappingapproachFrameworksthatemploymappingincludeCastorandApacheCommonsBetwixt.Mappingisgenerallyamoreflexibleandlightweightsolutionthancodegeneration.First,youcodeyourJavaBeansasyouusuallywould,includinganybehaviorandwhateverconveniencemethodsyoulike.Then,atruntime,youcallontheframework'sintrospection-basedmarshaler,anditproducesanXMLdocumentbasedonthetypes,names,andvaluesofyourobjects'members.Bydefiningmappingfilesforyourclasses,youcanoverridethedefaultbindingstrategyandadvisethemarshalerhowyou'dlikeyourclassestoberepresentedinXML.Thisapproachisagoodcompromisebetweenscalabilityandflexibility.YougettowriteyourJavaclassesthewayyoulikethem,andthemarshalersavesyoufromdealingwithXML.However,althoughthemappingdefinitionfilesaresimpletowriteandscalereasonablywell,themappingrulescanonlychangethestandardbindingbehaviorsomuch,andsomedegreeofcouplingbetweenthestructureofyourobjectsandtheirXMLrepresentationwillalwaysremain.Ultimately,youmayhavetocompromiseeitheryourJavarepresentationsoryourXMLformatforthemappingapproachtowork.Databindingsummary60 职场大变样社区(www.zcdby.com):下载毕业设计成品DennisSosnoskihaswrittenindepthonthesubjectofXMLdatabindingAPIsofboththecode-generationandcode-mappingflavors.I'drecommendhisexcellentarticlesonCastorandonthecode-generationframeworksifyouwanttoinvestigatethisareafurtherOnthewhole,thecode-generationapproachtradesofftoomuchflexibilityandconveniencetobeusefulforthetypicalAjaxapplication.Ontheotherhand,themapping-basedframeworksmayserveyouwell,aslongasyoucantailortheirmappingstrategiesenoughtoproducetheXMLyouwantfromyourobjects.AlloftheXMLbindingAPIsshareamajordrawbackwiththemanualserializationtechnique:thecouplingofmodelandview.BeinglimitedtoasingleXMLrepresentationofeachobjecttypemeansitislikelythattherewillalwaysbesomeredundantdatatravelingacrossthenetwork.Amoreseriousproblemisthattheclientcodecannotobtainaspecializedviewwhenthesituationdemandsitandmayhaveanawkwardtimetryingtodealwiththecompromisedone-size-fits-allviewofagivenobjectgraph.IntraditionalWebapplicationdevelopment,pagetemplatingsystemsareusedtocleanlyseparateviewgenerationfromcontrollerlogicandmodeldata.It'sanapproachthatcanhelpinanAjaxscenarioaswell.Two:MultipleThreadsObjectsprovideawaytodivideaprogramintoindependentsections.Often,youalsoneedtoturnaprogramintoseparate,independentlyrunningsubtasks.Eachoftheseindependentsubtasksiscalledathread,andyouprogramasifeachthreadrunsbyitselfandhastheCPUtoitself.SomeunderlyingmechanismisactuallydividinguptheCPUtimeforyou,butingeneral,youdon’thavetothinkaboutit,whichmakesprogrammingwithmultiplethreadsamucheasiertask.Aprocessisaself-containedrunningprogramwithitsownaddressspace.Amultitaskingoperatingsystemiscapableofrunningmorethanoneprocess(program)atatime,whilemakingitlooklikeeachoneischuggingalongonitsown,byperiodicallyprovidingCPUcyclestoeachprocess.Athreadisasinglesequentialflowofcontrolwithinaprocess.Asingleprocesscanthushavemultipleconcurrentlyexecutingthreads.Therearemanypossibleusesformultithreading,butingeneral,you’llhavesomepartofyourprogramtiedtoaparticulareventorresource,andyoudon’twanttohanguptherestofyourprogrambecauseofthat.Soyoucreateathreadassociatedwiththateventorresource60 职场大变样社区(www.zcdby.com):下载毕业设计成品andletitrunindependentlyofthemainprogram.Agoodexampleisa“quit”button—youdon’twanttobeforcedtopollthequitbuttonineverypieceofcodeyouwriteinyourprogramandyetyouwantthequitbuttontoberesponsive,asifyouwerecheckingitregularly.Infact,oneofthemostimmediatelycompellingreasonsformultithreadingistoproducearesponsiveuserinterface.InheritingfromThreadThesimplestwaytocreateathreadistoinheritfromclassThread,whichhasallthewiringnecessarytocreateandrunthreads.ThemostimportantmethodforThreadisrun(),whichyoumustoverridetomakethethreaddoyourbidding.Thus,run()isthecodethatwillbeexecuted“simultaneously”withtheotherthreadsinaprogram.Thefollowingexamplecreatesanynumberofthreadsthatitkeepstrackofbyassigningeachthreadauniquenumber,generatedwithastaticvariable.TheThread’srun()methodisoverriddentocountdowneachtimeitpassesthroughitsloopandtofinishwhenthecountiszero(atthepointwhenrun()returns,thethreadisterminated).//:c14:SimpleThread.java//VerysimpleThreadingexample.publicclassSimpleThreadextendsThread{privateintcountDown=5;privatestaticintthreadCount=0;privateintthreadNumber=++threadCount;publicSimpleThread(){System.out.println("Making"+threadNumber);}publicvoidrun(){while(true){System.out.println("Thread"+threadNumber+"("+countDown+")");if(--countDown==0)return;}}publicstaticvoidmain(String[]args){60 职场大变样社区(www.zcdby.com):下载毕业设计成品for(inti=0;i<5;i++)newSimpleThread().start();System.out.println("AllThreadsStarted");}}Arun()methodvirtuallyalwayshassomekindofloopthatcontinuesuntilthethreadisnolongernecessary,soyoumustestablishtheconditiononwhichtobreakoutofthisloop(or,inthecaseabove,simplyreturnfromrun()).Often,run()iscastintheformofaninfiniteloop,whichmeansthat,barringsomeexternalfactorthatcausesrun()toterminate,itwillcontinueforever.Inmain()youcanseeanumberofthreadsbeingcreatedandrun.Thestart()methodintheThreadclassperformsspecialinitializationforthethreadandthencallsrun().Sothestepsare:theconstructoriscalledtobuildtheobject,thenstart()configuresthethreadandcallsrun().Ifyoudon’tcallstart()(whichyoucandointheconstructor,ifthat’sappropriate)thethreadwillneverbestarted.SharinglimitedresourcesYoucanthinkofasingle-threadedprogramasonelonelyentitymovingaroundthroughyourproblemspaceanddoingonethingatatime.Becausethere’sonlyoneentity,youneverhavetothinkabouttheproblemoftwoentitiestryingtousethesameresourceatthesametime,liketwopeopletryingtoparkinthesamespace,walkthroughadooratthesametime,oreventalkatthesametime.Withmultithreading,thingsaren’tlonelyanymore,butyounowhavethepossibilityoftwoormorethreadstryingtousethesamelimitedresourceatonce.Collidingoveraresourcemustbepreventedorelseyou’llhavetwothreadstryingtoaccessthesamebankaccountatthesametime,printtothesameprinter,oradjustthesamevalve,etc.ImproperlyaccessingresourcesConsideravariationonthecountersthathavebeenusedsofarinthischapter.Inthefollowingexample,eachthreadcontainstwocountersthatareincrementedanddisplayedinsiderun().Inaddition,there’sanotherthreadofclassWatcherthatiswatchingthecounterstoseeifthey’realwaysequivalent.Thisseemslikeaneedlessactivity,sincelooking60 职场大变样社区(www.zcdby.com):下载毕业设计成品atthecodeitappearsobviousthatthecounterswillalwaysbethesame.Butthat’swherethesurprisecomesin.HowJavasharesresourcesJavahasbuilt-insupporttopreventcollisionsoveronekindofresource:thememoryinanobject.Sinceyoutypicallymakethedataelementsofaclassprivateandaccessthatmemoryonlythroughmethods,youcanpreventcollisionsbymakingaparticularmethodsynchronized.Onlyonethreadatatimecancallasynchronizedmethodforaparticularobject(althoughthatthreadcancallmorethanoneoftheobject’ssynchronizedmethods).Herearesimplesynchronizedmethods:synchronizedvoidf(){/*...*/}synchronizedvoidg(){/*...*/}Eachobjectcontainsasinglelock(alsocalledamonitor)thatisautomaticallypartoftheobject(youdon’thavetowriteanyspecialcode).Whenyoucallanysynchronizedmethod,thatobjectislockedandnoothersynchronizedmethodofthatobjectcanbecalleduntilthefirstonefinishesandreleasesthelock.Intheexampleabove,iff()iscalledforanobject,g()cannotbecalledforthesameobjectuntilf()iscompletedandreleasesthelock.Thus,there’sasinglelockthat’ssharedbyallthesynchronizedmethodsofaparticularobject,andthislockpreventscommonmemoryfrombeingwrittenbymorethanonemethodatatime(i.e.,morethanonethreadatatime).There’salsoasinglelockperclass(aspartoftheClassobjectfortheclass),sothatsynchronizedstaticmethodscanlockeachotheroutfromsimultaneousaccessofstaticdataonaclass-widebasis.Notethatifyouwanttoguardsomeotherresourcefromsimultaneousaccessbymultiplethreads,youcandosobyforcingaccesstothatresourcethroughsynchronizedmethods.BlockingAthreadcanbeinanyoneoffourstates:New:Thethreadobjecthasbeencreatedbutithasn’tbeenstartedyetsoitcannotrun.Runnable:Thismeansthatathreadcanberunwhenthetime-slicingmechanismhasCPUcyclesavailableforthethread.Thus,thethreadmightormightnotberunning,butthere’snothingtopreventitfrombeingruniftheschedulercanarrangeit;it’snotdeador60 职场大变样社区(www.zcdby.com):下载毕业设计成品blocked.Dead:Thenormalwayforathreadtodieisbyreturningfromitsrun()method.Youcanalsocallstop(),butthisthrowsanexceptionthat’sasubclassofError(whichmeansyouaren’tforcedtoputthecallinatryblock).Rememberthatthrowinganexceptionshouldbeaspecialeventandnotpartofnormalprogramexecution;thustheuseofstop()isdeprecatedinJava2.There’salsoadestroy()method(whichhasneverbeenimplemented)thatyoushouldnevercallifyoucanavoiditsinceit’sdrasticanddoesn’treleaseobjectlocks.Blocked:Thethreadcouldberunbutthere’ssomethingthatpreventsit.WhileathreadisintheblockedstatetheschedulerwillsimplyskipoveritandnotgiveitanyCPUtime.Untilathreadreenterstherunnablestateitwon’tperformanyoperations.BecomingblockedTheblockedstateisthemostinterestingone,andisworthfurtherexamination.Athreadcanbecomeblockedforfivereasons:You’veputthethreadtosleepbycallingsleep(milliseconds),inwhichcaseitwillnotberunforthespecifiedtime.You’vesuspendedtheexecutionofthethreadwithsuspend().Itwillnotbecomerunnableagainuntilthethreadgetstheresume()message(thesearedeprecatedinJava2,andwillbeexaminedfurther).You’vesuspendedtheexecutionofthethreadwithwait().Itwillnotbecomerunnableagainuntilthethreadgetsthenotify()ornotifyAll()message.(Yes,thislooksjustlikenumber2,butthere’sadistinctdifferencethatwillberevealed.)ThethreadiswaitingforsomeI/Otocomplete.Thethreadistryingtocallasynchronizedmethodonanotherobject,andthatobject’slockisnotavailable.Youcanalsocallyield()(amethodoftheThreadclass)tovoluntarilygiveuptheCPUsothatotherthreadscanrun.However,thesamethinghappensiftheschedulerdecidesthatyourthreadhashadenoughtimeandjumpstoanotherthread.Thatis,nothingpreventstheschedulerfrommovingyourthreadandgivingtimetosomeotherthread.Whenathreadisblocked,there’ssomereasonthatitcannotcontinuerunning.60 职场大变样社区(www.zcdby.com):下载毕业设计成品中文翻译一、面向Java开发人员的Ajax:Ajax的Java对象序列化如果您正在使用异步JavaScript和XML(Ajax)进行Java™Web开发,那么您最关心的问题可能就是把数据从服务器传递给客户机。在面向Java开发人员的Ajax系列的第二篇文章中,PhilipMcCarthy介绍了Java对象序列化的五种方式,并提供了选择最适合应用程序的数据格式和技术所需要的全部信息。下面介绍Ajax的构造块:(1)如何用JavaScriptXMLHttpRequest对象从Web页面向服务器发送异步请求。(2)如何用Javaservlet处理和响应请求(向客户机返回XML文档)。(3)如何在客户端用响应文档更新页面视图。这一次,我将讨论Ajax开发的基础知识,但是将侧重于许多JavaWeb开发人员最关心的问题:为客户机生成数据。多数Java开发人员已经把模型-视图-控制器(MVC)模式应用在他们的Web应用程序上。在传统的Web应用程序中,视图组件由JSP或者其他表示技术(例如Velocity模板)构成。这些表示组件动态地生成全新的HTML页面,替代用户以前正在查看的页面,从而更新用户界面。但是,在JavaWeb应用程序使用AjaxUI的情况下,基于从XMLHttpRequest的响应接收到的数据,JavaScript客户端代码对于更新用户看到的内容负有最终责任。从服务器的角度来看,视图成为它响应客户机请求而发送的数据表示。1.从Java类产生XML把Ajax响应作为XML来传递有许多原因:每个支持Ajax的浏览器都有导航XML文档的方法,也有许多服务器端技术可以处理XML数据。通过制定一个方案,描述要交换的文档类型,在Ajax客户端和服务器端之间很容易定义合约,而且如果服务器端架构采用面向服务的方式,那么使用XML也可以允许非Ajax客户机使用您提供的数据。2.自行进行序列化首先,可以从对象图以编程的方式生成XML。这种方式可以简单到只是在每个JavaBean类中实现toXml()方法即可。然后就可以选择合适的XMLAPI,让每个bean提供表示自己状态的元素,并递归地对自己的成员调用对象图。显然,这种方式无法扩展到大量的类,因为每个类都需要专门编写自己的XML生成代码。从好的方面来看,这是一个实现起来简单的方式,没有额外的配置支出或者更复杂的构建过程支出,任何60 职场大变样社区(www.zcdby.com):下载毕业设计成品JavaBean图都可以只用几个调用就变成XML文档。3.XML绑定框架近些年来,已经开发了多个JavaAPI来简化XML文档到Java对象图的绑定过程。多数都提供了XML编排和拆解;也就是说,它们可以在Java对象图和XML之间执行双向会话。这些框架封装了XML处理的全部工作,这意味着应用程序代码只需要处理普通的Java类。它们还希望提供有用的辅助功能,例如文档验证。笼统来说,这些框架采用了两种不同的方式:代码生成和对象到XML映射。我将分别解释这两种方式。4.代码生成方式使用代码生成的框架包括XMLBeans、JAXB、Zeus和JBind。Castor也能使用这项技术。这类框架的起点是描述文档数据类型的XML方案。使用框架提供的工具,就可以生成代表这些方案定义类型的Java类。最后,用这些生成的类编写应用程序,表示自己的模型数据,并通过框架提供的一些辅助机制把数据序列化成XML。如果应用程序要使用大型XML语法,那么代码生成方式是个很好的方法。在数十个类上编写定制XML序列化代码的可伸缩性问题由此消除。另一方面,也不再需要定义自己的JavaBean。框架生成的Java类通常非常符合XML的结构,所以对它们进行编码很难。而且,生成的类变成哑数据容器,因为一般不能向它们添加行为。一般来说,在应用程序代码中要做些妥协,才能很好地处理方案生成的类型。另一个缺陷是如果修改方案,会造成生成的类也要修改,所以也就会对围绕它们编写的代码带来相应的影响。这种类型的XML绑定框架在数据拆解时最有用(例如,使用XML文档并把它们转化成Java对象)。除非拥有大型数据模型而且有可能从生成的类中获益,否则基于代码生成的框架对于Ajax应用程序来说可能有很大的杀伤力。5.映射方式采用映射方式的框架包括Castor和ApacheCommonsBetwixt。映射通常是比代码生成更灵活和更轻量的解决方案。首先,可以像通常一样编写JavaBean,包括任何行为以及任何自己喜欢的方便的方法。然后,在运行时,调用框架中基于内省的编排器,并根据对象成员的类型、名称和值生成XML文档。通过定义类的映射文件,可以覆盖默认的绑定策略,并就类在XML中的表示方式对编排器提出建议。这种方法是在可伸缩性与灵活性之间的良好折中。可以按照自己喜欢的方式编写Java类,编排器负责处理XML。虽然映射定义文件编写起来简单,可伸缩性也足够好,但是映射规则最多只能改变标准的绑定行为,而且在对象结构和它们的XML表示之间总要残留一些耦合。最终,可能不得不在Java表示或XML60 职场大变样社区(www.zcdby.com):下载毕业设计成品格式之间任选一个做些折中,才能让映射方法起作用。6.数据绑定总结DennisSosnoski就XML数据绑定API的主题,在代码生成和代码映射两个方面写了深入的文章。如果想进一步研究这个领域,我推荐他在Castor和代码生成框架方面的精彩文章。总之,代码生成方式损失了过多的灵活性和方便性,对于典型的Ajax应用程序用处不大。另一方面,基于映射的框架可能工作得很好,但是要恰到好处地调整它们的映射策略,以便从对象生成需要的XML。所有的XML绑定API都具有手工序列化技术的一个主要不足:模型和视图的耦合。被限制为一个类型一个XML表示,就意味着在网络上总要有冗余数据传输。更严重的问题是,在情况要求客户端代码使用专门视图时,客户端代码却无法得到它,所以可能要费力地处理给定对象图的一成不变的视图。在传统的Web应用程序开发中,采用页面模板系统把视图生成与控制器逻辑和模型数据干净地分离。这种方法在Ajax场景中也会有帮助。二、多线程利用对象,可将一个程序分割成相互独立的区域。我们通常也需要将一个程序转换成多个独立运行的子任务。像这样的每个子任务都叫作一个“线程”(Thread)。编写程序时,可将每个线程都想象成独立运行,而且都有自己的专用CPU。一些基础机制实际会为我们自动分割CPU的时间。我们通常不必关心这些细节问题,所以多线程的代码编写是相当简便的。这时理解一些定义对以后的学习狠有帮助。“进程”是指一种“自包容”的运行程序,有自己的地址空间。“多任务”操作系统能同时运行多个进程(程序)——但实际是由于CPU分时机制的作用,使每个进程都能循环获得自己的CPU时间片。但由于轮换速度非常快,使得所有程序好象是在“同时”运行一样。“线程”是进程内部单一的一个顺序控制流。因此,一个进程可能容纳了多个同时执行的线程。多线程的应用范围很广。但在一般情况下,程序的一些部分同特定的事件或资源联系在一起,同时又不想为它而暂停程序其他部分的执行。这样一来,就可考虑创建一个线程,令其与那个事件或资源关联到一起,并让它独立于主程序运行。一个很好的例子便是“Quit”或“退出”按钮——我们并不希望在程序的每一部分代码中都轮询这个按钮,同时又希望该按钮能及时地作出响应(使程序看起来似乎经常都在轮询它)。事实上,多线程最主要的一个用途就是构建一个“反应灵敏”的用户界面。60 职场大变样社区(www.zcdby.com):下载毕业设计成品1.从线程继承为创建一个线程,最简单的方法就是从Thread类继承。这个类包含了创建和运行线程所需的一切东西。Thread最重要的方法是run()。但为了使用run(),必须对其进行过载或者覆盖,使其能充分按自己的吩咐行事。因此,run()属于那些会与程序中的其他线程“并发”或“同时”执行的代码。下面这个例子可创建任意数量的线程,并通过为每个线程分配一个独一无二的编号(由一个静态变量产生),从而对不同的线程进行跟踪。Thread的run()方法在这里得到了覆盖,每通过一次循环,计数就减1——计数为0时则完成循环(此时一旦返回run(),线程就中止运行)。//:SimpleThread.java//VerysimpleThreadingexamplepublicclassSimpleThreadextendsThread{privateintcountDown=5;privateintthreadNumber;privatestaticintthreadCount=0;publicSimpleThread(){threadNumber=++threadCount;System.out.println("Making"+threadNumber);}publicvoidrun(){while(true){System.out.println("Thread"+threadNumber+"("+countDown+")");if(--countDown==0)return;}}publicstaticvoidmain(String[]args){for(inti=0;i<5;i++)newSimpleThread().start();System.out.println("AllThreadsStarted");}60 职场大变样社区(www.zcdby.com):下载毕业设计成品}run()方法几乎肯定含有某种形式的循环——它们会一直持续到线程不再需要为止。因此,我们必须规定特定的条件,以便中断并退出这个循环(或者在上述的例子中,简单地从run()返回即可)。run()通常采用一种无限循环的形式。也就是说,通过阻止外部发出对线程的stop()或者destroy()调用,它会永远运行下去(直到程序完成)。在main()中,可看到创建并运行了大量线程。Thread包含了一个特殊的方法,叫作start(),它的作用是对线程进行特殊的初始化,然后调用run()。所以整个步骤包括:调用构建器来构建对象,然后用start()配置线程,再调用run()。如果不调用start()——如果适当的话,可在构建器那样做——线程便永远不会启动。2.共享有限的资源可将单线程程序想象成一种孤立的实体,它能遍历我们的问题空间,而且一次只能做一件事情。由于只有一个实体,所以永远不必担心会有两个实体同时试图使用相同的资源,就象两个人同时都想停到一个车位,同时都想通过一扇门,甚至同时发话。进入多线程环境后,它们则再也不是孤立的。可能会有两个甚至更多的线程试图同时同一个有限的资源。必须对这种潜在资源冲突进行预防,否则就可能发生两个线程同时访问一个银行帐号,打印到同一台计算机,以及对同一个值进行调整等等。3.资源访问的错误方法现在考虑换成另一种方式来使用本章频繁见到的计数器。在下面的例子中,每个线程都包含了两个计数器,它们在run()里增值以及显示。除此以外,我们使用了Watcher类的另一个线程。它的作用是监视计数器,检查它们是否保持相等。这表面是一项无意义的行动,因为如果查看代码,就会发现计数器肯定是相同的。但实际情况却不一定如此。4.Java如何共享资源对一种特殊的资源——对象中的内存——Java提供了内建的机制来防止它们的冲突。由于我们通常将数据元素设为从属于private(私有)类,然后只通过方法访问那些内存,所以只需将一个特定的方法设为synchronized(同步的),便可有效地防止冲突。在任何时刻,只可有一个线程调用特定对象的一个synchronized方法(尽管那个线程可以调用多个对象的同步方法)。下面列出简单的synchronized方法:synchronizedvoidf(){/*...*/}synchronizedvoidg(){/*...*/}每个对象都包含了一把锁(也叫作“监视器”60 职场大变样社区(www.zcdby.com):下载毕业设计成品),它自动成为对象的一部分(不必为此写任何特殊的代码)。调用任何synchronized方法时,对象就会被锁定,不可再调用那个对象的其他任何synchronized方法,除非第一个方法完成了自己的工作,并解除锁定。在上面的例子中,如果为一个对象调用f(),便不能再为同样的对象调用g(),除非f()完成并解除锁定。因此,一个特定对象的所有synchronized方法都共享着一把锁,而且这把锁能防止多个方法对通用内存同时进行写操作(比如同时有多个线程)。每个类也有自己的一把锁(作为类的Class对象的一部分),所以synchronizedstatic方法可在一个类的范围内被相互间锁定起来,防止与static数据的接触。注意如果想保护其他某些资源不被多个线程同时访问,可以强制通过synchronized方访问那些资源。5.堵塞一个线程可以有四种状态:(1)新(New):线程对象已经创建,但尚未启动,所以不可运行。(2)可运行(Runnable):意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行。因此,线程可能在、也可能不在运行当中,但一旦条件许可,没有什么能阻止它的运行——它既没有“死”掉,也未被“堵塞”。(3)死(Dead):从自己的run()方法中返回后,一个线程便已“死”掉。亦可调用stop()令其死掉,但会产生一个违例——属于Error的一个子类(也就是说,我们通常不捕获它)。记住一个违例的“掷”出应当是一个特殊事件,而不是正常程序运行的一部分。所以不建议你使用stop()(在Java1.2则是坚决反对)。另外还有一个destroy()方法(它永远不会实现),应该尽可能地避免调用它,因为它非常武断,根本不会解除对象的锁定。(4)堵塞(Blocked):线程可以运行,但有某种东西阻碍了它。若线程处于堵塞状态,调度机制可以简单地跳过它,不给它分配任何CPU时间。除非线程再次进入“可运行”状态,否则不会采取任何操作。6.为何会堵塞堵塞状态是前述四种状态中最有趣的,值得我们作进一步的探讨。线程被堵塞可能是由下述五方面的原因造成的:(1)调用sleep(毫秒数),使线程进入“睡眠”状态。在规定的时间内,这个线程是不会运行的。(2)用suspend()暂停了线程的执行。除非线程收到resume()消息,否则不会返回60 职场大变样社区(www.zcdby.com):下载毕业设计成品“可运行”状态。(3)用wait()暂停了线程的执行。除非线程收到nofify()或者notifyAll()消息,否则不会变成“可运行”(是的,这看起来同原因2非常相象,但有一个明显的区别是我们马上要揭示的)。(4)线程正在等候一些IO(输入输出)操作完成。(5)线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。亦可调用yield()(Thread类的一个方法)自动放弃CPU,以便其他线程能够运行。然而,假如调度机制觉得我们的线程已拥有足够的时间,并跳转到另一个线程,就会发生同样的事情。也就是说,没有什么能防止调度机制重新启动我们的线程。线程被堵塞后,便有一些原因造成它不能继续运行。60

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
关闭