随着互联网的发展,以及人们消费观念和生活方式的改变,这种新型的商业模式逐渐融入了人们的生活中。本毕业设计的内容是设计并且实现一个基于web技术的在线交易系统。基本实现了网上交易系统应有的主要功能模块,包括:管理员的登录,管理和维护;用户注册、登录、注销,个人信息的查询、修改;商品管理,购物车管理,订单管理。该系统界面简单、操作方便,容易维护。
__大学
毕业设计(论文)
题目:基于Java技术的网上交易系统的开发
学院:
专业:
班级:
学号:___
学生姓名:__
指导老师:__
2009年6月9日
摘要
随着信息高速公路的建立,Internet的普及,网络技术的迅猛发展,人类社会已经进入了一个信息化社会。
电子商务指利用简单、快捷、低成本的电子通讯方式,买卖双方通过网络进行各种商贸活动的一种商业交易模式。随着互联网的发展,以及人们消费观念和生活方式的改变,这种新型的商业模式逐渐融入了人们的生活中。通过企业的门户网站,人们可以足不出户的寻找自己所需的物品,通过对不同虚拟商城的访问,“顾客”可以找出性价比最高的商品,自己有极大地选择空间;通过下订单,你可以很快得到自己想要的物品,这给顾客节省很多时间和精力;对于厂家来说,可以极大地降低库存风险,可根据客户需要,按需采购和生产,大大地提高了效益。
本毕业设计的内容是设计并且实现一个基于web技术的在线交易系统。系统主要以j2EE作为开发基础,使用了struts+spring+hibernate等多种协议或技术,用eclipse作为开发工具,以Macromedia公司的Dreamweaver作为界面美化工具。基本实现了网上交易系统应有的主要功能模块,包括:管理员的登录,管理和维护;用户注册、登录、注销,个人信息的查询、修改;商品管理,购物车管理,订单管理。该系统界面简单、操作方便,容易维护。
关键词:电子商务j2EEstruts+spring+hibernate
DevelopmentofanOnlineTradingSystemBasedonJavaTechnology
Abstract
Withtheestablishmentofhighwayofinformation,thepopularizationofInternetandtherapiddevelopmentofnetworktechnology,humansocietyhasenteredasocietyofinformation.
E-commerceisanewbusinesstransaction,throughwhichbothbuyersandsellerscanuseasimple,fastandlow-costmeansofelectronicandcommunication.WiththedevelopmentoftheInternet,andpeople'sconsumptionideaandthewayoflifechanging,thisnewbusinessmodelhasgraduallyintegratedintopeople'slives.Throughtheportalsiteofenterprise,peoplecanlookupthegoodswhichtheyrequiredwithoutgoingout;throughthedifferentvirtualmallvisit,peoplecanfindthemostcost-effectiveproducts,andtheyhavemuchself-choice;throughorders,peoplecanfindthethingswhichtheyneed,andquicklygettheproductswhichtheyordered.Thisnewbusinessmodlecansavealotoftimeandenergyforcustormers,andgreatlyreduceinventoryriskofmanufaturers.Themanufacturescanprocureandproduceaccordingtocustomerneeds,thiswascalledon-demandprocurementandproduction,whichgreatlyimprovedtheefficiency.
Thesubjectofthisgraduationprojectisdesigningaweb-basedonlinetradingsystem.Thissystemmainlyusesj2EEasthebasisofdevelopment,andalsousethestruts+spring+hibernatetechnologiesandotherorders.Thisprojectuseeclipseasthedevelopmenttools,andMacromedia'sDreamweaverastheinterfaceslandscapingtools.Thebasicfunctionsofanonlinetradingsystemhavebeenimplemented,whichincludeadministratorlogin,managementandmaintenance;userregistration,login,write-offspersonalinformationenquiriesandamendments;commoditymanagement,cartmanagement,ordermanagement.Interfaceofthesystemissimple,itcanbeusedandmaintainedeasily.
Keywords:E-commercej2EEstruts+spring+hibernate
6
目录
摘要
Abstract
第一章引言
1.1课题背景
1.2课题目的和意义
1.3本文结构
第二章系统应用的关键技术
2.1JSP技术介绍
2.1.1JSP的概述
2.1.3JSP的强势与劣势
2.1.4JSP与ASP的比较
2.2Java组件JavaBeans
2.2.1什么是JavaBeans
2.2.2JSP与JavaBeans的关系
2.3J2EE概述
2.4关于Struts
2.4.1Struts简介
2.4.2Struts的主要功能
2.5关于Spring
2.5.1Spring简介
2.5.2为什么需要Spring
2.5.3Spring带给我们什么
2.6关于Hibernate
2.6.1为什么引入hibernate
2.6.2使用Hibernate的好处
2.6.3Hibernate的工作原理
2.7Mysql
2.7.1mysql的特点
2.7.2mysql的安装和配置(部分截图)
2.8Tomcat服务器
2.8.1Tomcat服务器简介
2.8.2Tomcat的特点
2.8.3Tomcat的优势
2.8.4Tomcat服务器的安装和配置
小结
第三章系统需求分析和总体设计
3.1系统功能需求
3.2系统角色及其功能分析
3.2.1系统的3个角色:
3.2.2系统角色的功能
3.3总体设计思想概述
3.4数据库设计
3.4.1E-R图
3.4.2数据表的设计
3.5系统的类设计
3.5.1DAO类设计
3.5.2POJO类设计(部分)
3.5.3过滤器类设计
3.5.4监听器类设计
3.6系统的用例图
3.6.1总体用例分析
3.6.2用户管理用例分析
3.6.3购物车管理用例分析
小结
第四章系统的详细设计
4.1数据库与POJO映射的实现
4.2主要模块的设计说明与界面
4.2.1用户管理模块
4.2.2购物车管理模块
4.2.3定单模块
4.3系统的测试
小结
第五章总结与展望
5.1工作总结
5.2后续工作展望
参考文献
附录
致谢
第一章引言
1.1课题背景
随着当今世界进入信息时代,Internet的飞速发展和在全球的普及给人类生活带来革命性的改变。Internet将传统意义上的物理空间转变成电子空间,把人们带入了一个网络社会中。网络时代的到来,带给人们的不只是快捷、方便,它带来的是划时代的进步。在网络大家族中,电子商务则是一个热点,它的发展速度之快远远超过我们的想象,普及速度之快令人难以置信。我们完全有理由相信,全球性的电子商务热潮必将一浪高于一浪[1]。
电子商务一个最基本体现就是电子购物网站,从一定程度上讲它就是网上超市,也就是一种网上交易。“网”字意味着它具有信息时代的快捷方便等特征。事实上电子商务的出现,给消费者的地位,消费观念带来了重要的变化。网上交易系统正是应这种变化而悄然崛起,并以惊人的速度发展着。通过网上交易系统,人们可以足不出户的寻找自己所需的物品,通过对不同虚拟商城的访问,“顾客”可以找出性价比最高的商品,自己有极大地选择空间,通过下订单,你可以很快得到自己想要的物品,这给顾客节省很多时间和精力,对于厂家来说,可以极大的降低库存风险,根据客户需要,按需生产和采购,大大的提高了效益。
1.2课题目的和意义
自从电子商务出现在人们的视野中,电子商务就在全世界范围内受到了格外的关注,并得到了迅速的发展。从实用角度看,目前电子商务网站的普遍存在是购买者难以找到所希望购买的商品甚至用户在耗费很大的经历与时间后即使找到了自己想要的产品,最后却由于各种原因而放弃购买。很多报道指出,推销商们普遍对目前的网络行销感到失望,尽管如此,电子商务无疑是目前最好的在线商品展示的媒体和工具。然而,网上产品展示的目的不仅仅是展示产品,而更重要的是通过让客户更多地了解产品而提高产品的购买率。因此,电子商务目前所面临的挑战之一就是网站的设计,如何使得网页能够有效地展示自己的产品,同时方便用户的使用,使用户以愉悦的心情选购称心如意的商品。
本系统的目的和意义就是应上述挑战而尝试为用户提供一个操作简单方便的网上交易系统。利用本系统,用户可以自由地浏览商品,注册成为网站会员,选择商品加入自己的购物车,而后生成订单,实现网上购物。
1.3本文结构
本文共分五个章节,系统地阐述了系统开发的全过程。
第一章,主要介绍了开发的背景、目的和意义。
第二章,主要介绍了本系统所用到的关键技术和工具,为下一步的设计的设计奠定基础。
第三章,主要对系统进行需求分析并进行总体设计。需求分析阶段通过分析系统的功能模块的划分以及角色的划分,为系统的总体设计提供依据。总体设计阶段通过对数据库、过滤器、监听器、和实体类的设计,以及各个模块用例图的描述,形成了开发的整体思路。
第四章,主要介绍了主要模块的设计与实现,并给出关键源代码和最终的效果图。
第五章,主要是对这次毕业设计的总结和对后续工作的展望。
第二章系统应用的关键技术
2.1JSP技术介绍
2.1.1JSP的概述
JSP(JavaServerPages)是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准,类似于其他技术标准,如ASP,PHP等,主要用于开发动态网页内容。
JSP是新一代的动态内容编程技术,它继承了Java技术的“一次编写,随处运行”的特性,允许Web开发人员开发和维护与平台无关,信息丰富动态的Web页面,包括HTML,DHTML,_HTML和_ML,它能使Web开发人员轻易搭建网络平台,建立起功能强大的Web网站。JSP可以把用户界面从内容层次中分离出来,使得Web开发人员不必修改在底层的动态内容,就可以修改整体的页面布局。
2.1.2JSP的运行机制
JSP文档被复制到Web服务器的文档目录中。当有人请求这个文档时,服务器识别出这个带有.jsp扩展名的文档,并意识到需要做特殊处理。第一次请求这个文档时,它被编译成一个servlet对象,并存储在内存中,然后输出内容回送给发出请求的客户机。第一请求之后,只要有请求到来,服务器将进行检查,看看这个文件是否做过改动,如果没有变化,服务器调用先前编译过的servlet对象。
JSP请求的步骤[2]如图2-1所示。
(1)客户机请求一个JSP页面。
(2)JSP引擎编译该JSP成一个servlet。
Web
浏览器
JSP页面
生成的servlet
编译的servlet
Web服务器
2.第一次编译
3.第二次编译
1.请求
4.响应
图2-1一个JSP的请求步骤
(3)生成的servlet被编译并装载。
(4)编译的servlet服务请求并把一响应发送回客户机。
JSP主要是针对Java程序处理不熟悉的人设计的。与Servlet相比,JSP有如下两个优势:方便与HTML混合;在开发、测试方面比Servlet方便。
2.1.3JSP的强势与劣势
JSP的强势:
(1)可移植性。JSP是用Java开发的,因此它是可移植的,可以一处编写,随处运行,支持多平台。
(2)有效性。JSP的初始化代码仅在Web服务器第一次加载时执行一次。一旦加载,在处理一个新的请求时,只须调用一个新的服务方法。与处理每个请求都要全部加载一个完整的可执行程序相比,这是一个相当有效的技术。
(3)强大的可伸缩性和可扩充性。它能够在面向对象的语言(Java)中进行开发,并可以在现有对象基础上进行扩展,形成新的对象,从而更好地满足用户的需求。
(4)多样化和功能强大的开发工具支持。Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。
(5)JavaServlet是一种开发Web应用的理想框架。JSP以Servlet技术为基础,又在许多方面作了改进。利用跨平台的JavaBeans组件,JSP为分离处理逻辑与显示样式提供了卓越的解决方案。
JSP的劣势:
(1)为了跨平台的功能,为了极度的伸缩能力,极大的增加了产品的复杂性,Java系统中包括JRE,JDK,J2EE,EJB等多种产品,这就需要大量的学习和培训才能掌握它们,将它们有效地搭配在一起,灵活地加以运用。
(2)Java的运行速度快是由于用户将class常驻内存,这样使用的内存空间就比较大。另一方面,它还需要硬盘空间来存储一系列.Java文件和.class文件以及对应的版本文件。
(3)JSP只有对Java相当熟悉的人才能用得很好。
(4)JSP程序调试困难。
2.1.4JSP与ASP的比较
JSP与ASP(ActiveServerPage)两者都是常用的动态网页技术,也都是可以嵌入HTML中的程序,但两者是有着本质的不同,主要从以下几个方面对其进行比较:
(1)Web服务器的支持:大多数通用的Web服务器如:Apache、Netscape和MicrosoftIIS都支持JSP页面,只有微软本身的MicrosoftIIS和PersonalWebServer可以支持ASP。
(2)平台的支持:JSP具有平台独立性,只要是一般的Java程序可以运行的平台,都支持JSP程序。Windows平台可以很好的支持ASP,但ASP对于基于Win32逐渐模型的依赖,使得它难于一直到其它平台上。
(3)组件模型:JSP是建立在可重用的、跨平台的组件(如:JavaBeans、EnterprisesJavaBeans和用户定制的标签库等组件)之上的,而ASP使用的是基于Win32的COM组件模型。
(4)脚本语言:JSP可以使用Java编程语言或JavaScript作为脚本语言,而ASP使用VBScript或Jscript作为脚本语言。
(5)安全性:JSP使用Java安全模型,而ASP使用WindowsNT的安全结构。
(6)与Access数据库的连接:JSP使用JDBC建立与Access数据库的连接,而ASP对Access数据库使用DataActiveObjects。
(7)用户定制的标签:JSP可以使用用户定制标签库进行扩充,而ASP中没有用户定制标签库,ASP是不能扩充的[3]。
2.2Java组件JavaBeans
2.2.1什么是JavaBeans
JavaBeans事实上有三层含义。首先,JavaBeans是一种规范,一种在Java(包括JSP)中使用可重复使用的Java组件的技术规范。其次,JavaBeans是一个Java的类,一般来说,这样的Java类将对应于一个独立的.java文件,在绝大多数情况下,这应该是一个public类型的类。最后,当JavaBeans这样的一个Java类在我们的具体的Java程序中被示例之后,我们有时也会将这样的一个JavaBeans的实例称之为JavaBeans[4]。
2.2.2JSP与JavaBeans的关系
使用JSP技术,Web页面开发人员可以使用HTML和_ML标识来设计和格式化最终页面。使用JSP标识或者小脚本生成页面上的动态内容。生成内容的逻辑被封装在JSP标识和JavaBeans组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。核心逻辑封装在标识和Beans中,可以方便页面设计者编辑和使用JSP页面。
在服务器端,JSP引擎解释JSP标识和小脚本生成所请求的内容(例如,通过访问JavaBeans组件,使用JDBC技术访问数据库),并且将结果以HTML(或_ML)页面的形式发送回浏览器。
绝大多数JSP页面依赖于可重用的跨平台的足见(JavaBeans或者EnterpriseJavaBeans组件)来执行应用程序所要求的复杂的处理。这样的好处是开发人员能够共享和交换执行普通操作的组件,加速了总体开发过程。因此,基于Web的较为复杂的应用程序(如电子商务网站或网上MIS),JSP的复杂架构必须由JavaBeans达成。
2.3J2EE概述
J2EE(Java2PlatformEnterpriseEdition)是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术不断适应和促进企业级应用过程中的产物。目前,Java平台有三个版本:适用于小型设备和智能卡的J2ME(Java2PlatformMicroEdition)、适用于桌面系统的J2SE(Java2PlatformStandardEdition)和适用于企业级应用的J2EE(Java2PlatformEnterpriseEdition)。Sun推出J2EE的目的是为了克服传统Client/Server模式的弊病,迎合Browser/Server架构的潮流,为应用Java技术开发服务器端应用提供一个平台独立的、可移植的、多用户的、安全的和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。J2EE是一个标准,而不是一个现成的产品。各个平台开发商按照J2EE规范分别开发了不同的J2EE应用服务器,J2EE应用服务器是J2EE企业级应用的部署平台。由于它们都遵循了J2EE规范,因此,使用J2EE技术开发的企业级应用可以部署在各种J2EE应用服务器上。为了推广并规范化使用J2EE架构企业级应用的体系架构,Sun同时给出了一个建议性的J2EE应用设计模型:J2EEBlueprints。J2EEBlueprints提供了实施J2EE企业级应用的体系架构、设计模式和相关的代码,通过应用J2EEBlueprints所描述的体系模型,能够部分简化架构企业级应用这项复杂的工作。J2EEBlueprints是开发人员设计和优化J2EE组件的基本原则,同时为围绕开发工作进行职能分工给出了指导性策略,以帮助应用开发设计人员合理地分配技术资源。
J2EE的优势主要有以下几点:
(1)高效的开发:J2EE允许公司把一些通用的、很繁琐的服务端任务交给中间件供应商去完成这样开发人员可以集中精力在如何创建商业逻辑上,相应地缩短了开发时间。高级中间件供应商提供以下这些复杂的中间件服务:状态管理服务--让开发人员写更少的代码,不用关心如何管理状态,这样能够更快地完成程序开发。
(2)持续性服务:让开发人员不用对数据访问逻辑进行编码就能编写应用程序,能生成更轻巧,与数据库无关的应用程序,这种应用程序更易于开发与维护。分布式共享数据对象CACHE服务,让开发人员编制高性能的系统,极大提高整体部署的伸缩性。
(3)支持异构环境:J2EE能够开发部署在异构环境中的可移植程序。基于J2EE的应用程序不依赖任何特定操作系统、中间件、硬件。因此设计合理的基于J2EE的程序只需开发一次就可部署到各种平台。这在典型的异构企业计算环境中是十分关键的。J2EE标准也允许客户订购与J2EE兼容的第三方的现成的组件,把他们部署到异构环境中,节省了由自己制订整个方案所需的费用。
(4)可伸缩性:企业必须要选择一种服务器端平台,这种平台应能提供极佳的可伸缩性去满足那些在他们系统上进行商业运作的大批新客户。基于J2EE平台的应用程序可被部署到各种操作系统上。例如可被部署到高端UNI_与大型机系统,这种系统单机可支持64至256个处理器。(这是NT服务器所望尘莫及的)J2EE领域的供应商提供了更为广泛的负载平衡策略。能消除系统中的瓶颈,允许多台服务器集成部署。这种部署可达数千个处理器,实现可高度伸缩的系统,满足未来商业应用的需要。
(5)稳定的可用性:一个服务器端平台必须能全天候运转以满足公司客户、合作伙伴的需要。这是实时性很强商业系统理想的选择[5]。
2.4关于Struts
2.4.1Struts简介
Struts已逐步越来越多运用于商业软件,是一种非常优秀的J2EEMVC实现方式。Struts用JavaServlet/JavaServerPages技术,开发Web应用程序的开放源码的framework。
2.4.2Struts的主要功能
(1)包含一个controllerservlet,能将用户的请求发送到相应的Action对象。
(2)JSP自由tag库,并且在controllerservlet中提供关联支持,帮助开发员创建交互式表单应用。
(3)提供了一系列实用对象:_ML处理、通过JavareflectionAPIs自动处理JavaBeans属性、国际化的提示和消息。Struts项目的目标是为创建Javaweb应用提供一个开放源代framework。Strutsframework的内核是基于例如JavaServlets,
JavaBeans,ResourceBundles,和_ML,以及各种JakartaCommons包的标准技术的灵活的控制层。Struts提供了它自身的控制器组件,并整合了其他技术,以提供模型和视图。Struts已逐步越来越多运用于商业软件,是一种非常优秀的J2EEMVC实现方式[6]。
2.4.3Struts工作原理
MVC(Model-View-Controller),是一种常用的设计模式。MVC减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化,MVC可以让整个逻辑很清晰,这种思想和思维和人的思维很接近,很容易被理解。
MVC的工作原理如图2-2所示:
图2-2MVC工作原理
Struts是MVC的一种实现,它将Servlet和JSP标记(属于J2EE规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的工作原理,如图2-3所示:
图2-3struts工作原理
(1)Controller:在_ML文件Struts-config._ml中,与之相关联的是Controller,在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充ActionFrom(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问javabean或调用EJB。最后动作类把控制权传给后续的JSP文件,后者生成视图。所有这些控制逻辑利用Struts-config._ml文件来配置。
(2)视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP标签库:Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
(3)模型:模型以一个或多个javabean的形式存在。这些bean分为三类:ActionForm、Action、JavaBeanorEJB。ActionForm通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用JavaBean或EJB等[7]。
2.5关于Spring
2.5.1Spring简介
Spring是一个开源框架,它由RodJohnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益[8]。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
◆轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
◆控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个_ML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
2.5.2为什么需要Spring
你可能正在想“Spring不过是另外一个的framework”。当已经有许多开放源代码(和专有)J2EEframework时,我们为什么还需要SpringFramework?
Spring是独特的,因为若干个原因:
◆它定位的领域是许多其他流行的framework没有的。Spring关注提供一种方法管理你的业务对象。
◆Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。因此从你的学习中,你可得到最大的价值。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。
◆它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。
Spring对你的工程来说,它不需要一个以上的framework。Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。
2.5.3Spring带给我们什么
◆方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
◆AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
◆声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
◆方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。
◆方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hession、Quartz)等的直接支持。
◆降低JavaEEAPI的使用难度
Spring对很多难用的JavaEEAPI(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些JavaEEAPI的使用难度大为降低。
◆Java源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果[9]。
2.6关于Hibernate
2.6.1为什么引入hibernate
在B/S项目的开发中,和数据库的交互式不可避免的,J2EE的规范中提供了JDBC的接口来操作数据库,对于JDBC,开发人员可以获取数据库连接,然后向数据库发送SQL语句,并返回数据库操作的结果集,然后封装成对象返回给上层的应用程序。这就造成开发人员不但要求能够编写程序,熟悉业务逻辑,还要求开发人员同时能够担任DBA,对开发人员的要求很高;同时,当引入新的项目时,很多地方必须废弃,因为我们的代码中不光是业务逻辑,其中也嵌入了许多和底层有关的一些SQL代码;
另外这些嵌入在代码中的SQL语句也影响了我们程序的可测试性,我们在对代码进行调试的时候,既要测试代码,同时我们还要测试SQL语句。为了解决这些问题,引入了hibernate[10]。
2.6.2使用Hibernate的好处
(1)Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和AppServer,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序的数据库访问代码,DAO接口的实现类,甚至可以是BMP(Bean-ManagedPersistence)里面的访问数据库的代码。
(2)Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和ApplicationServer
没有任何关系,也不存在兼容性问题。
(3)Hibernate不能用来直接和EntityBean做对比,只有放在整个J2EE项目的框架中才能比较。并且即使是放在软件整体框架中来看,Hibernate也是做为JDBC
的替代者出现的,而不是EntityBean的替代者出现的。
(4)由于是对JDBC的轻易级封闭,内存消耗少,最快的运行效率。
(5)开发效率高,Eclipse、JBuilder等主流JAVA集成开发环境对Hibernate有很好的支持,在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率高的惊人。
(6)分布式,安全检查,集群,负载均衡的支持。
2.6.3Hibernate的工作原理
Hibernate的工作就是为Object和Ralational之间提供一个映射,其工作流程如下面的图2-4所示。
图2-4hibernate工作流程
(1)启动Hibernate,如果在系统中添加Hibernate的支持,此处加载由系统自动完成。
(2)读取hibernate.cfg._ml或者hibernate.properties文件的配置信息,并将其加载为实例。
(3)构建SessionFactory实例(包含二级缓存)。
(4)从SessionFactory中取得Session对象,从而可以调用其方法,对数据库进行操作,实现ORM的功能。
Hibernate可以通过一个_ML的mapping文件把一个POJO(Plainoldjavaobject)和数据库中的表对应起来,在这个_ML文件(一般命名为_.hbm._ml)中,我们可以配置好Object和数据库中标的映射关系,然后把这个mapping加入到hibernate.cfg._ml中,这样Hibernate在启动时就可以加载这些mapping,并可以根据配置文件对对象实现自动的加载,并且可以对这些Object实习自动的维护。Hibernate还提供查询语句(HQL)供应用程序使用,Hibernate对数据访问实现封装,还可以对查询语句的发送实现管理,达到优化的目的,能够有效减少数据库的访问频率。
2.7Mysql
数据库(Database)是一系列信息资源的集合。在一个数据库中,与一个项目有关的所有信息都可以叫做一条记录(Record)。每一条记录都是由一系列的字段(Field)组成的。一系列记录的集合就构成了数据表格(Table)。对于一个简单的“平面文件”的数据库来说,它仅包含了一个数据表格,而对一个“关系型”数据库来说,它却包含两个或两个以上的数据表格,表格的各字段之间存在这一种或多种关系(有时可以把这种关系叫做“链接”)。
2.7.1mysql的特点
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。
由于MySQL是开放源代码的,因此任何人都可以在GeneralPublicLicense的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。它使用系统核心提供的多线程机制提供完全的多线程运行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等编程语言的编程接口(APIs),支持多种字段类型并且提供了完整的操作符支持查询中的SELECT和WHERE操作。
目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库[11]。
2.7.2mysql的安装和配置(部分截图)[12]
图2-5mysql安装图(开始)
安装时一般采用默认路径:
图2-6mysql安装图(路径)
图2-7mysql安装图(数据库类型)
为了支持中文,在下面的列表框中学者gb2312(切记)
图2-8mysql安装图(语言)
图2-9mysql安装图(等待成功)
2.8Tomcat服务器
2.8.1Tomcat服务器简介
Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。Tomcat中采用了Servlet容器:Catalina,完整的实现了Servlet2.3和Jsp1.2规范。Tomcat提供了各种平台的版本供下载,可以从其官方网站上下载其源代码版或者二进制版。由于Java的跨平台特性,基于Java的Tomcat也具有跨平台性[13]。
2.8.2Tomcat的特点
在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。另外Tomcat也提供了一个应用:manager,访问这个应用需要用户名和密码,用户名和密码存储在一个_ml文件中。通过这个应用,辅助于Ftp,你可以在远程通过Web部署和撤销应用。当然本地也可以。
2.8.3Tomcat的优势
Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache.我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet.这种集成只需要修改一下Apache和Tomcat的配置文件即可。
2.8.4Tomcat服务器的安装和配置
在开始安装之前,先准备J2SDK和TOMCAT两个软件,如果已经安装了J2SDK,就只需TOMCAT即可。
(1)需设置的环境变量
变量名:CATALINA_HOME
变量值:D:/ProgramFiles/tomcat6.0
变量名:CLASSPATH
变量值:.;%JAVA_HOME%/lib;%CATALINA_HOME%/common/lib
(2)安装完成后,打开tomcat服务器,启动浏览器,在地址栏上输入:http://localhost:8080/若出现以下界面说明安装成功[14]。
图2-10tomcat启动页面
小结
本章全面介绍本系统所用到的关键技术和工具,其中jsp作为javaweb开发的基础,对它的运行机制要理解,同时还要明白它的优劣势;j2ee作为开发的标准也作了简单介绍。而SSH(struts+spring+hibernate)作为本系统的核心与亮点技术,更是作了详细介绍,要掌握他们的工作原理,主要功能。最后介绍了本系统使用的数据库mysql以及tomcat服务器的安装与配置。只有掌握了这些技术基础,才能使本系统的开发正常进行。
第三章系统需求分析和总体设计
3.1系统功能需求
图3-1系统功能模块
如图3-1所示,在本系统中主要阐述用户管理、购物车管理、订单管理、产品展示四个模块。
(1)购物车管理:实现添加商品、取消一个商品、数量修改、清空购物车功能。
(2)订单管理:实现提交订单、删除订单、查询订单功能。
(3)产品展示:实现产品列表、产品明细功能。
(4)用户管理:实现用户注册、用户信息修改、用户删除、用户查询功能。
3.2系统角色及其功能分析
3.2.1系统的3个角色:
(1)注册用户
(2)管理员
(3)普通的网站浏览者(即游客)
3.2.2系统角色的功能
(1)普通用户
网站的普通浏览者(即游客)只能浏览商品。
(2)注册用户
普通浏览者只要注册为网站用户后,获得自己的帐号,设置自己的密码就具有以下功能:登录,登出,向购物车中添加商品,生成并提交订单。添加或修改个人明细资料。
(3)管理员
拥有注册用户的所有功能
还可以对用户进行管理,包括添加新用户、修改用户密码、删除用户。
3.3总体设计思想概述
本系统是基于B/S架构下的多层结构应用系统。B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)[15]。
在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。推荐的分层式结构一般分为三层,从下至上分别为:数据访问(持久)层、业务逻辑层(或称为领域层)、表示层[16],如图3-2:
图3-2系统架构
总的来说,采用分层结构的设计思想,可以让每个层由一组相关的类或组件构成,共同完成特定的功能。层与层之间存在自上而下的依赖关系,上层组件会依赖下层组件的API,而下层组件则不依赖于上层组件。例如:表述层依赖于业务逻辑层,而业务逻辑层依赖于数据库层。并且每个层对对上层公开API,但具体的实现细节对外透明。当某一层发生变化,只要API不变,不会影响其他层的实现。
在本系统中,使用开源的mysql数据库,持久层用到spring所集成的Hibernate技术,业务逻辑层用普通javabean实现,表述层运用基于struts的MVC设计模式(struts用来做C层,spring实现V层与C层的解耦以及C层与M层的解耦)。
3.4数据库设计
3.4.1E-R图
下面是该系统数据库表的E-R图,如图3-3:
图3-3E-R图
3.4.2数据表的设计
下面列出了设计过程中所用到的数据库表及其结构:
orders表用来保存客户的订单信息,如表3-1:
1.orders
列名类型长度描述
orderidint11订单ID
totalpriceNUMBER16总价钱
orderstateNUMBER1订单状态
payinfoDATE付款方式
CreatetimeDATE创建日期
useridVARCHAR220用户ID
User_item_idNUMBER8用户明细ID
表3-1orders
2.orderline表用来保存客户订单中的订单项信息,如表3-2:
3.orderline
列名类型长度描述
order_item_idNUMBER16订单条目ID
ProductidNUMBER16商品对象ID
OrderidVARCHAR220订单对象ID
qualityNUMBER8数量
numNUMBER8商品数量
表3-2orderline
3.orderstatus表用来保存定单状态,如表3-3:
orderstatus
列名类型长度描述
statusidint11状态ID
namevarchar30状态名
descriptionvarchar100描述
表3-3orderstatus
4.users表用来保存用户个人信息,如表3-4:
users
列名类型长度描述
user_idint11用户ID
passwordvarchar15用户密码
表3-4users
5.contactinfo表用来保存用户个人明细,如表3-5:
contactinfo
列名类型长度描述
contact_idint11
User_idvarchar30用户id
Street1varchar64住址1
Street2varchar64住址2
cityvarchar32城市
provincevarchar32省份
Countryvarchar32国家
zipvarchar20邮编
officephonevarchar50办公室电话
cellphonevarchar20手机
emailvarchar20电邮
homephonevarchar12家庭电话
表3-5contactinfo
6.product表用来保存商品,如表3-6:
product
列名类型长度描述
productidint11产品
modlevarchar30产品型号
namevarchar15品牌名
companyvarchar20出品公司
weightdouble50产品重量
pricedouble20价格
statevarchar20产品状态
createtimedate出厂日期
CategoryidInt10产品类型
descriptionvarchar1000产品描述
表3-6product
7.category表用来保存商品类型,如表3-7:
category
列名类型长度描述
categoryidint11类型ID
namevarchar30类型名
descriptionvarchar100描述
表3-7category
8.payway表用来保存权限信息,如表3-8:
payway
列名类型长度描述
paywayidint11ID
payStylevarchar30名
表3-8payway
3.5系统的类设计
3.5.1DAO类设计
图3-4dao类设计
如图3-4,通过这个工厂获取对应的DAO,然后使用DAO进行数据库操作。
3.5.2POJO类设计(部分)
图3-5POJO类设计
这些实体类将通过hibernate映射到数据库中
3.5.3过滤器类设计
图3-6过滤器类设计1
如图3-6,这是编码过滤器类,通过他可保证页面不出现乱码问题。
图3-7过滤器类设计2
如图3-7,这是登陆安全过滤器类,通过它来达到控制访问权限的功能。
3.5.4监听器类设计
如图3-8,“CartSessionListener”启动时把购物车信息初始化到内存中,提高系统性能。“ProductConte_tListener”启动时把商品信息初始化到内存中,提高系统性能。
图3-8监听器类设计
3.6系统的用例图
3.6.1总体用例分析
图3-9总体用例图
如图3-9,用户管理、购物车管理、订单管理、产品展示四个模块构成了本网上交易系统。User是指系统用户,包括注册用户和匿名用户两种,匿名用户只可以浏览商品,匿名用户通过用户管理模块注册后就可以使用购物车和下订单。
3.6.2用户管理用例分析
图3-10用户管理用例图
如图3-10,用户管理模块主要包括:用户登陆、用户注册、用户信息修改、用户删除、用户信息查询五个功能组成。
3.6.3购物车管理用例分析
图3-11购物车管理用例图
如图3-11,购物车管理模块主要包括:添加商品、取消一个商品、数量修改、清空购物车四个功能组成。
3.6.4订单管理用例分析
图3-12订单管理用例图
如图3-12,订单管理模块主要包括:订单提交、删除订单、订单明细三个功能组成。
3.6.5产品展示用例分析
图3-13产品展示用例图
如图3-13,商品展示模块主要包括:产品列表、产品明细两个功能组成。
小结
本章首先分析系统的功能需求,通过对系统功能模块的划分以及角色的划分,明确了系统需求,为总体设计提供依据。接下来阐述了系统的总体设计思想,说明了本系统是基于B/S架构下的多层结构应用系统。最后通过对数据库、过滤器、监听器、和实体类的设计分析,以及各个模块用例图的描述,形成了开发的整体思路,为下一步编程实现各个具体功能铺平了道路。
第四章系统的详细设计
4.1数据库与POJO映射的实现
前面第二章曾介绍过:Hibernate可以通过一个_ML的mapping文件把一个POJO(Plainoldjavaobject)和数据库中的表对应起来,在这个_ML文件(一般命名为_.hbm._ml)中,我们可以配置好Object和数据库中表的映射关系,然后把这个mapping加入到hibernate.cfg._ml中,这样Hibernate在启动时就可以加载这些mapping,并可以根据配置文件对对象实现自动的加载,并且可以对这些Object实习自动的维护。
由于Spring提供了对Hibernate的集成,所以我们可以不配置hibernate.cfg._ml文件,而通过在applicationConte_t._ml文件中进行相关配置来达到同样的目的。图例说明如下:
图4-1user.hbm._ml
如图4-1,user.hbm._ml文件配置了user类的相关信息。
图4-2session工厂配置
图4-2是applicationConte_t._ml文件中Session工厂的配置信息,可以看到,图中的mappingResources属性中囊括了所有我们需要的mapping文件。
4.2主要模块的设计说明与界面
4.2.1用户管理模块
用户管理模块主要包括用户注册,登录,退出3个部分.
(1)用户注册
当用户第一次登录时首先要注册,成为会员后,才可以购买物品.用户可以通过单击首页的注册按键来打开注册页面进行会员注册操作,用户注册页面的运行结果如图4-3所示.
图4-3用户登录/注册界面
如果用户的注册信息不符合要求,系统会提示用户,部分结果如图4-4:
图4-4登录信息提示界面
校验用户注册信息是是否正确的javaScript部分代码如下[17]:
当用户确认所提按信息无误后,单击“注册“按钮,系统会执行以下流程:
request请求将页面上的信息传递到控制层的struts中的Action类中,执行以下代码
/_
_注册一个新用户
_/
publicActionForwardregister(ActionMappingmapping,
ActionFormform,HttpServletRequestreq,HttpServletResponseres)throwsE_ception{
ActionForwardforward=null;
RegisterActionFormregisterForm=(RegisterActionForm)form;
Useruser=registerForm.getUser();
ContactInfocontactInfo=registerForm.getContactInfo();
if(userBiz.getUserById(user.getUserid())!=null){
user.setContactinfo(contactInfo);
req.setAttribute("user",user);
forward=mapping.findForward("refresh");
}else{
try{
log.debug("beginsaveuserinfo...");
userBiz.userRegister(user,contactInfo);
req.setAttribute("TIP_KEY","恭喜您!注册成功!");
forward=mapping.findForward("success");
}catch(ECPortE_ceptionbe){
forward=mapping.findForward("fail");
be.printStackTrace();
log.error("saveuserinfoerror...",be);
}
}
returnforward;
}
在UserService中调用dao中的addUser方法,代码如下:
publicvoidaddUser(Useruser)throwsStoreE_ception{
.....
try{
session=HibernateSessionFactory.getSession();
t_=session.beginTransaction();
session.save(user);
t_.commit();
}.....
}
在注册成功后,会跳转到这样的页面,如图4-4:
图4-4注册成功界面
(2)用户登录
网站首页在用户第一次访问时会判断用户是否登录,未登录则显示用户登录窗口,提示用户登录或注册.对于已经登录的用户,在用户登录窗口将显示用户的相关信息.
首页主要是根据保存用户名信息的Session参数来判断用户是否已经登录的,关键代码如下:
在会员登录窗口中单击登录按纽后,系统将对用户名和密码进行验证,判断用户是否是已注册用户,如果已注册,则更新用户在网站中的状态,如果没有注册,则拒绝用户的登录操作,登录数据验证的程序代码如下:
/_
_用户登录方法
_/
publicActionForwardlogin(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsE_ception{
Stringusername=request.getParameter("userid");
Stringpassword=request.getParameter("password");
if(userService.isLoginCorrect(username,password)){
Useruser=userService.getUserByName(username);
/_
_只有在用户登录的时候才创建一个session,并且把用户的信息存放到session中;
_同时sessionListener也会把car同时也放到session中,这样能保证为每一个来
_网站需要购物的用户分配一个session,一个购物车,并且也可以利用session来跟踪用户.
_/
HttpSessionsession=((HttpServletRequest)request).getSession(true);
session.setAttribute("user",user);
returnmapping.findForward("loginsuccess");
}else{
Stringmessage="用户名或者密码错误!";
request.setAttribute("message",message);
returnmapping.findForward("loginfailed");
}
}
publicUsergetUserByName(Stringname)throwsStoreE_ception{
Sessionsession=null;
try{
session=HibernateSessionFactory.getSession();
Useruser=(User)session.createQuery(
"fromUseruwhereu.username='"+name+"'")
.uniqueResult();
returnuser;
}....
}
(3)用户退出
当用户决定退出网站时,只要点击当前页面上的“退出”按钮,就会回到首页。
实现代码如下:
/_
_用户退出系统并做一些清理工作;
_/
publicActionForwardlogout(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsE_ception{
HttpSessionsession=request.getSession();
session.removeAttribute("user");
session.removeAttribute("cart");
returnmapping.findForward("logout");
}
(4)管理员登录
系统设置了一个默认的管理员admin,只要通过此用户名登录就可进入管理员界面,如图4-5和图4-6所示:
图4-5管理员登录
图4-6管理员界面
主要代码如下:
publicActionForwardtoModify(ActionMappingmapping,ActionFormform,
HttpServletRequestreq,HttpServletResponseres)throwsE_ception{
HttpSessioncur_session=req.getSession(false);
Useruser=(User)cur_session.getAttribute("USER");
Stringuserid=user.getUserid();
StringreqUserid=req.getParameter("userid");
if(reqUserid==null){
ListuserList=userBiz.findAllUsers();
cur_session.setAttribute("userList",userList);
if(userid.equals("admin")){
returnmapping.findForward("adminInfo");
}else{
Userp_user=userBiz.getUserById(userid);
req.setAttribute("user",p_user);
}
}
if(reqUserid!=null){
Userp_user=userBiz.getUserById(reqUserid);
req.setAttribute("user",p_user);
}
returnmapping.findForward("modify");
}
4.2.2购物车管理模块
购物车管理模块主要功能有如下几个部分:
(1)创建购物车
当客户登录后,系统会给客户创建一个购物车放入服务器的Session会话中。使客户在整个会话中都拥有一个相同的购物车。这里主要运用了Http协议中的会话机制,将购物车保存在客户的会话中,这样在整个客户游览不同页面商品的过程中,都会使用同一个购物车对象。
具体执行步骤:
(1)从客户的请求对象中获取Session会话对象
(2)从会话对象中获取购物车对象
(3)判断是购物车对象是不是空的,如果是空是就创建一个
/_
_在监听到session被创建之后,就立即向session中添加一个购物车Car;
_/
publicvoidsessionCreated(HttpSessionEventarg0){
HttpSessionsession=arg0.getSession();
Cartcart=newCart();
session.setAttribute("cart",cart);
}
/_
_从session中获得购物车
_/
Cartcart=(Cart)session.getAttribute("cart");
if(cart==null){
cart=newCart();
}
(2)向购物车中添加一个商品项
客户在查看网页上的一个商品时,当向服务器发送一个“添加到购物车”的请求时,会执行这个功能。
功能执行过程:
(1)从客户请求对象中获取商品的ID
(2)调用业务层的方法根据商品ID去数据查询商品的信息,返回商品对象
(3)从商品对象中获取商品名,商品价格,来构建一个商品项对象
(4)从Session会话中获取购物车对象
(5)调用业务层的方法来根据购物车对象和商品项对象来执行添加操作
(6)将些商品项对象放入到购物车中
部分实现代码:
/_
_从数据库中把商品取到;
_/
ProductServiceproductService=(ProductService)ServiceFactory.getInstance().getService(Globals.PRODUCT_SERVICE);
Integerid=Integer.parseInt(request.getParameter("productid"));
Productproduct=productService.getProductById(id);
/_
_在向购物车中添加商品的时候会判断商品是否已经存在,
_已存在的就不让在加入了;
_/
if(cart.isE_ist(id)){
message="该商品已经存在!请返回!";
request.setAttribute("message",message);
returnmapping.findForward("error");
}else{
/_
_向购物车添加一个商品;
_/
cart.addCart(product);
session.setAttribute("cart",cart);
returnmapping.findForward("addcartsuccess");
}
(3)修改购物车中一个商品项
在客户查看购物车时,想修改自己的购买商品时,会执行这个功能。由于商品的名称和价格都是系统管理人员设置的,所以客户都不可以修改,客户只能修改他/她所购买商品的数量。修改所选购的商品数量时,相应的商品项的小计和购物车的总计都会保持实时的更新,如图4-7。
图4-7修改商品数量
功能的执行步骤:
(1)将ActionForm转换为ItemForm对象
(2)从ItemForm对象中获取商品ID
(3)从Session会话中获取购物车对象
(4)根据商品ID去调用业务层的方法去修改商品项
(5)修改小计
(6)将些商品项对象放入到购物车中
部分实现代码:
publicActionForwardmodifyNumber(ActionMappingmapping,ActionFormform,
HttpServletRequestreq,HttpServletResponseres)throwsE_ception{
Stringtempid=req.getParameter("productId");
LongproductId=Long.parseLong(tempid);
StringtempNum=req.getParameter("num"+productId);//num是一与JSP页面一致的字符串
intnum=newInteger(tempNum).intValue();
HttpSessionsession=req.getSession(false);
IShoppingCartcart=(IShoppingCart)session
.getAttribute("SHOPPING_CART");
cart.modifyProductAmountById(productId,num);
returnmapping.findForward("success");
}
(4)查看购物车
客户选取了所有的商品后,来向服务器发送“购物车”请求时,会执行此功能,系统根据会话中的购物车中的商品项,来获取客户所选选商品的一个集合,在JSP页面上对这个集合中的商品项进行显示,如图4-8。
图4-8我的购物车
功能的执行步骤:
(1)从客户的请求对象中获取购物车对象
(2)从购物车对象中获取所有的商品项
(3)将所有的商品项对象加载到请求对象中发送给客户端
部分实现代码:
var="orderLine"items="${sessionScope.SHOPPING_CART.orders.orderlines}"varStatus="status"
(5)删除购物车中的一个商品项
客户在查看购物车时,当向服务器发送一个“删除商品项”的请求时,会执行这个功能。删除商品项时,系统会自动更新购物车的总计值,如图4-9:
图4-9删除商品
功能执行过程:
1从客户请求对象中获取商品的ID
2调用业务层的方法根据商品ID去数据查询商品的信息,返回商品对象
3从Session会话中获取购物车对象
4调用业务层的方法根据商品ID去删除购物车对象中的商品项
5将购物车重新加入到Session会话中,来更新Session会话中的购物车对象
部分代码实现:
//删除购物车中一个商品项
publicActionForwarddeleteById(ActionMappingmapping,ActionFormform,
HttpServletRequestreq,HttpServletResponseres)throwsE_ception{
Stringtempid=req.getParameter("productId");
LongproductId=Long.parseLong(tempid);
HttpSessionsession=req.getSession(false);
ShoppingCartcart=(ShoppingCart)session
.getAttribute("SHOPPING_CART");
cart.removeProductById(productId);
if(cart.isEmpty()){
returnmapping.findForward("inde_");
}
returnmapping.findForward("success");
}
(6)清空购物车
客户在查看购物时不要想要所有所选的商品时,向服务器发送“清空购物车”请求时会执行此功能。如图4-10:
图4-10清空购物车
执行此功能的步骤:
(1)从请求对象中获取Session会话
(2)从Session会话中获取购物车对象
(3)将购物车对象传给业务层的方法去清空购物车中的所有商品项
部分实现代码:
/_
_也就是从session中把购物车清除掉;
_/
publicActionForwardclearShopCart(ActionMappingmapping,ActionFormform,
HttpServletRequestreq,HttpServletResponseres)throwsE_ception{
HttpSessionsession=req.getSession(false);
IShoppingCartcart=(IShoppingCart)session
.getAttribute("SHOPPING_CART");
cart.removeAllProducts();
returnmapping.findForward("inde_");
}
4.2.3定单模块
生成订单是网上购物商城的最终目的,前面的所有的功能的实现都是为最后生成一个用户满意的订单做基础,在此要生成一个可以供用户随时查询订单号,还要保存用户订单中所购买的商品信息。当用户确认对购物车不再改变后,就可以到收银台结帐并生成订单。结帐的流程是:从购物车中读取商品名称,商品数量,商品价格信息,生成唯一的一个订单号,同时也把用户注册的基本信息读取出来,形成一个完整的订单写入数据库中。
1、创建一个订单
客户选好了所有的商品时,并确认要买时,会向服务器发送一个“生成定单”的请求,运行结果如图4-11:
图4-11生成订单
此时用户可以添加收货人的地址,点击图中的用户信息“修改”,会弹出一个页面,在此修改收货人地址等信息,如图4-12:
图4-12修改收货地址
/_
_将修改后的地址保存到数据库中,其中保存了用户的信息:id
_/
publicvoidaddUserItem(UserItemuseritem)throwsStoreE_ception{
..
try{
session=HibernateSessionFactory.getSession();
t_=session.beginTransaction();
session.save(useritem);
t_.commit();
}..
}
用户确认无误后点击图4-11的“提交订单“,会出现下图:
图4-13订单列表
部分实现代码:
/_
_确定定单
_/
publicActionForwardcheckOut(ActionMappingmapping,ActionFormform,
HttpServletRequestreq,HttpServletResponseres)throwsE_ception{
ActionForwardforward=null;
GregorianCalendargc=newGregorianCalendar();
Longpaywayid=Long.parseLong(req.getParameter("payway"));
PayWaypw=newPayWay(paywayid);
ListorderStatus=(List)req.getSession().getServletConte_t()
.getAttribute("all_orderStatus");
OrderStatusos=(OrderStatus)orderStatus.get(1);
HttpSessionsession=req.getSession(false);
Useruser=(User)session.getAttribute("USER");
ShoppingCartcart=(ShoppingCart)session
.getAttribute("SHOPPING_CART");
//MaporderLineMap=cart.getOrderLineMap();
Ordersorder=cart.getOrders();
order.setUsers(user);
order.setCost(cart.getTotalPrice());
order.setName(user.getUserid()+"-"+gc.get(gc.YEAR)+""
+gc.get(gc.MONTH)+""+gc.get(gc.DAY_OF_MONTH));
order.setPayway(pw);
order.setOrderstatus(os);
try{
log.debug("===begintogeneratororder=====");
orderBiz.checkOut(order);
log.debug("====generatorordersuccess...");
forward=mapping.findForward("success");
}catch(ECPortE_ceptionbe){
forward=mapping.findForward("fail");
log.error("====saveuserorderfail...",be);
be.printStackTrace();
}
cart.removeAllProducts();//定单产生后应清楚当明购物车中的商品
returnforward;
}
/_
_向数据库中保存一个指定的order对象;
_/
publicvoidsave(OrderstransientInstance){
log.debug("savingOrdersinstance");
try{
getSession().save(transientInstance);
log.debug("savesuccessful");
}catch(RuntimeE_ceptionre){
log.error("savefailed",re);
throwre;
}
}
2.查看定单
客户确认了所有的订单选项后,可以向服务器发送“查看定单明细”的请求:当用户点击了图4-13上的“明细”按钮是,页面运行结果如下:
图4-14订单明细
部分代码实现:
/_
_根据指定的order对象来获得属于该order的所有orderline项;
_/
publicActionForwardorderDetail(ActionMappingmapping,ActionFormform,
HttpServletRequestreq,HttpServletResponseres)throwsE_ception{
ActionForwardforward=null;
Stringtempid=req.getParameter("orderid");
Longorderid=Long.parseLong(tempid);
Ordersorder=null;
try{
order=orderBiz.getOrderById(orderid);
log.debug("===getordersuccessful.===");
req.setAttribute("ORDER",order);
forward=mapping.findForward("showinfo");
}catch(ECPortE_ceptionbe){
log.error("====getfailed.====");
forward=mapping.findForward("fail");
}
returnforward;
}
4.3系统的测试
测试是软件开发必不可少的环节,每个开发者都应该养成良好的测试习惯,一个系统的完善就是通过不断地测试与维护来完成的。
测试的意义有以下几点[18]:
(1)测试并不仅仅是为了找出错误.通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进;
(2)这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效性;
(3)没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法。
测试一般有两种方法:如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能都能正常使用;如果知道产品内部工作过程,可以通过测试来检验产品的内部动作是否按照说明书的规定正常运行。前一个方法称为黑盒测试,后一个称为白盒测试。
对于本系统,我采取第一个方法,即黑盒测试。做完一个模块,就进行测试,看所做的模块能不能实现所需要的功能。经过了先期的模块测试和后期的综合测试,本系统实现了规格说明书的所有功能,达到了预期的要求。
小结
本章详细介绍了系统主要功能模块的具体实现,包括用户管理模块、购物车模块和定单模块,分析他们的设计思路,执行步骤,并给出了每个功能的主要实现代码,还有为每个功能的最终执行结果配上截图,让我们看到更直观的效果。最后对完成的系统进行了测试,介绍了两种主流的测试方法,给出了测试结果,达到了预期的要求。
第五章总结与展望
5.1工作总结
开发Web站点,是一项复杂、繁重的工作,需要多方面的知识。
此次通过设计网上交易系统,使我接触到许多基于java语言的WEB网络开发方面的知识,包括HTML语言,CSS级联样式表,客户端开发语言JavaScript,MVC分层体系结构,支持MVC架构的struts框架,开源服务器Tomcat,mysql数据库,服务器端开发语言JSP等,这些语言(或技术)扩展了我的知识面,也使我在制作的过程中对它们的特点,应用方向等有了基本的了解,并在实际的应用中大致明白如何将它们融合运用,以开发出界面美观,功能强大的Web站点来。
通过本次亲自动手设计系统,我更加深刻的了解系统开发的全过程,从中我熟练掌握了B/S结构Web应用软件设计的思想及其开发的全过程。首先要进行系统的需求分析,分析系统要达到什么功能,系统要划分为几个模块来设计,系统的具体功能应当如何去实现;分析完之后,考虑其涉及到的计算机专业知识,把问题细化,把大的问题划分为小的问题,然后逐个进行解决。毕业设计开始阶段,由于我们没有软件架构的设计经验,所以在项目的业务流程和软件的开发规范上犯了很的错误,所以在后期的组装过程变的非常的困难。
设计收获:
1.掌握了网站开发的基本流程,设计整个网站的功能模块图;
2.掌握了如何搭建和配置一个Tomcat服务器;
3.掌握了使用JSP编程,实现对信息的显示、修改、删除和添加等;
遇到的问题:
1.JSP中文乱码问题的解决
对于JSP中文乱码问题的处理,常用的方法有两种:一种方法是在JSP页面上设置页面的“contentType”属性。这种方法就是在页面开始时,设置页面的“contentType”属性,例如:
另一种方法是输出中文信息时使用“ISO8859-1”编码。这种方法是在输出中文信息之前,对中文信息进行一次“ISO8859-1”编码。
2.Java.lang.NullPointerE_ception异常
一般是对一个为NULL值的变量进行操作引起的。为了避免这种异常,最好在对变量操作之前检查看它是否为NULL值。
3.SQL语句换行书写时未加适当的空格而导致的错误。我们先看一段代码,
Stringtest=aaa;
Stringsql=〞select_fromtest〞+
〞wheretest1=’〞+a+〞’〞+
〞andtest2=bbb〞;
上面所示的代码在执行时将转换成这样的SQL语句:
Select_fromtestwheretest1=’aaa’andtest2=bbb
从输出的SQL语句可以看出test和where之间,以及’aaa’和and之间都缺空格,这样是不能从数据库中取出数据的.正确的写法如下:
Stringtest=aaa;
Stringsql=〞select_fromtest〞+
〞wheretest1=’〞+a+〞’〞+
〞andtest2=bbb〞;
5.2后续工作展望
由于个人能力有限以及实践经验欠缺,系统基本满足在线电子产品交易的功能需求,本系统不可避免有不足之处,如一些系统功能过于简单,所以系统的功能还算不上很完善。希望老师和同学能给予建议和指导。
参考文献
[1]景玉建.电子商务的发展与前景[J].《职业时空》,2005年第13期,P10-11
[2]张孝祥.深入JavaWeb开发内幕——核心基础[M].北京:电子工业出版社.北京.2006.10
致谢
本次毕业设计的最终完成离不开很多人的大力协助。衷心的感谢上海达内科技有限公司在我实习期间交给我这个项目任务,使我有了设计课题,还感谢在实习期间给我帮助的项目经理以及公司同事。真诚的感谢本次毕业设计的指导老师-宋玲教授,给了我自由选题的机会,在我的论文审稿阶段指出了很多方面的不足,并一一给出修改意见,对我进行悉心指导,对我的毕业论文最终完成给予了极大的支持和帮助。
特别感谢曹杰师兄,在毕业设计中遇到难点的时候,热情和耐心地给予指导,对我毕业设计工作的顺利完成有着重要的意义。
最后,再一次感谢所有帮助过我的人们!