目 录
摘 要
Abstract
第一章 引言
1.1网上书店系统的国内外研究现状
1.1.1 国内外的研究现状
1.1.2 JavaScript、CSS
1.1.3 Servlet、struts、hibernate
1.1.4 jsp、mysql
1.2网上书店系统的背景、目的和意义
1.2.1 设计提出的背景
1.2.2 设计提出的目的和意义
1.3 设计思路和研究方法
第二章 系统概述
2.1开发技术的选择
2.2系统的主要架构及开发模式
2.2.1基于B/S的体系结构
2.2.2 基于MVC的应用开发模型
2.2.3 系统功能结构
2.2.4 注册功能流程
2.2.5用户登录流程
2.2.6商品管理流程
第三章 系统功能的具体实现
3.1 主要目录结构说明
3.2各功能模块的实现
3.2.1数据库的连接
3.2.2系统数据库表的基本设计
3.2.3用户登陆模块的实现
3.2.4 购物车模块的实现
3.2.5商品信息的实现
3.2.6后台管理模块的实现
第四章 系统测试及难点分析
4.1 系统程序的安装和加载
4.1.1 文件的拷贝
4.1.2 Myeclipse开发工具
4.2 系统关键部分测试分析
4.2.1 单元测试分析
4.2.2 开发功能模块所遇到的难点
总结
参考文献
致谢
摘 要
网上商城系统开发存在的两个问题就是后台的管理与消费者操作的方便性,系统从数据库开发的基本内容入手,利用JAVA技术开发了基于Web的在线用户管理模块、在线商品销售模块、在线后台管理模块。实现了最重要的商品销售功能,也就是管理库房中的商品,及管理用户的购物车,从而实现结帐等一系列功能。另外网上商品销售系统还提供给用户查找数据库中商品相关记录的功能。同时,为了保证商品交易的正常进行,还实现了用户的登录注册功能。网上商城系统按照软件工程的要求,对系统进行需求分析,总体设计,详细设计,编码与测试,在此基础上将理论知识与开发技术运用到系统的实现过程当中,完成了网上商城平台的构建。经过大量的系统测试发现,JAVA网站的访问速度较块,安全性较好,有很强的实用性。
本论文详细介绍了开发网上商城的全过程,是按软件工程的思想设计的 ,包括需求分析、系统总体设计、系统详细设计等。
本系统具有多方面特点:系统功能完备,使用方便简捷,人性化的用户界面,安全保密设置齐全,节省经营成本,大大减少了操作人员的工作负担。
关键词 购物车,数据库管理,网上商城
To develop the web shop system exist two issues. One is the background management the other is the convenience operation for consumers this article take the database development as the basic start use the JAVA technology to develop web-based online user management module online book sales module online background management module. It implement the most important book sale function i.e. manage the shop and shopping car of consumer thus it implement a series of functions such as check-out In addition, the online book sale system is also provided searching the database record function to consumer. Mean wile in order to guarantee the normal trade. the system implements a registered user login function. Web shop systems conform to the specification of soft project, the system needs analysis, design, detailed design, Coding and testing, on this basis, taking the theoretical knowledge and development of technologies to the system implementation process complete the web shop platform building.
This manual in details introduced to develop the web shop system in the Internet, is thought design that press the software engineering of, include detailed design etc. of total design, system of need analysis, system.
This system has the various characteristics: The system function is complete, using convenient, humanized customer interface, the safety keeps secret to establish well-found, economical management cost, reduced to operate the personnel's work burden consumedly.
Key Words Cart,Database Management,Web shop
电子商务(electronic commerce)是计算机网络所带来的又一次革命,它的发展将形成新的交换体制,产生新的市场规则,冲破时间与空间的限制,加快全球市场一体化的进程,电子商务还将有力地推动信息和信息服务业的发展。它不仅涉及电子技术和商业交易本身,而且涉及到诸如金融、税务、教育等其他社会层面,是一个与社会大环境息息相关并且具有完整结构体系的系统工程。电子商务的发展为网上购物带来了勃勃生机,使得网上购物迅速成为一种非常活跃的电子商务模式。
无店铺零售的悄然兴起,是商业经济发展到一定阶段的产物,也是顺应新的消费需求和技术进步的必然结果。上海市商业经济研究中心副主任齐晓斋分析说,与传统的百货商店、连锁超市、大卖场、便利店等有形商铺相比,无店铺零售业态具有一定的先天优势。一是地段。对于传统的有形店铺来说,一是家门店选址、地段的优劣,几乎能够决定其未来经营的成败,而城市中的商业网点资源,尤其是优质商业网点资源通常十分稀缺。无店铺零售则大多不存在地段方面的制约。二是经营成本。借助日益发展的科学技术,无店铺零售通常能够省却从生产到销售过程中的许多环节,从而有效降低经营成本与交易成本,带来消费者、商家双赢的局面。三是风险。对于个人来说,网上商店等无店铺零售业态的准入门槛相对较低,运转比较灵活,即使遇到风险,也有船小好掉头的优势。专家表示,随着社会经济的发展及消费水平的提高,人们希望得到更加方便、更加快捷的购物方式,同时也乐于尝试各种新的购物方式。在这一市场需求的推动下,企业会对商品零售的方式进行创新,而先进的技术给创新提供了重要支撑与平台。
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它最初由网景公司的Brendan Eich设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是Sun公司的注册商标。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,字节顺序记号,Javascript是由 Netscape公司开发的一种脚本语言(scripting language),或者称为描述语言。在HTML基础上,使用Javascript可以开发交互式Web网页。Javascript的出现使得网页和用户之间实现了一种实时性的、动态的、交互性的关系,使网页包含更多活跃的元素和更加精彩的内容。 运行用Javascript编写的程序需要能支持Javascript语言的浏览器。
CSS(Cascading Style Sheet,可译为“层叠样式表”或“级联样式表”)是一组格式设置规则,用于控制Web页面的外观。通过使用CSS样式设置页面的格式,可将页面的内容与表现形式分离。页面内容存放在HTML文档中,而用于定义表现形式的CSS规则则存放在另一个文件中或HTML文档的某一部分,通常为文件头部分。将内容与表现形式分离,不仅可使维护站点的外观更加容易,而且还可以使HTML文档代码更加简练,缩短浏览器的加载时间。
Servlet是一种服务器端的编程语言,是J2EE中比较关键的组成部分,Servlet技术的推出,扩展了Java语言在服务器端开发的功能,巩固了Java语言在服务器端开发中的地位,而且现在使用非常广泛的JSP技术也是基于Servlet的原理,JSP+JavaBeans+Servlet成为实现MVC模式的一种有效的选择。
Servlet容器环境在HTTP通信和web服务器平台之间实现了一个抽象层。Servlet容器负责把请求传递给Servlet,并把结果返回给客户。在使用Servlet的过程中,并发访问的问题由Servlet容器处理,当多个用户请求同一个Servlet的时候,Servlet容器负责为每个用户启动一个线程,这些线程的运行和销毁由Servlet容器负责,而在传统的CGI程序中,是为每一个用户启动一个进程,因此Servlet的运行效率就要比CGI的高出很多。Servlet是运行在服务器端的程序,所以Servlet的运行状态完全由Servlet容器维护,一个Servlet的生命周期一般有三个过程。初始化,请求服务,销毁,如1.1Servlet的生命周期图。
图1.1 Servlet的生命周期
Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点。除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开发效率。关于页面导航将是今后的一个发展方向。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。 缺点:初学者需要一个持续学习的过程,甚至还会打乱你网页编写的习惯;Struts将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。
Struts 控制器组件主要包括:充当Struts框架的中央控制器的ActionServlet组件、充当每个子应用模块的请求处理器的RequestProcessor组件、负责处理一项具体的业务的Action组件。其工作流程如图1.2。
图1-2 struts工作流程图
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任,如图1.3的框架图。
图1.3 Hibernate 框架结构图
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。JSP与Java Servlet一样,是在服务器端执行的,通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP可用一种简单易懂的等式表示为:HTML+Java=JSP。
使用MySQL作为数据库开发工具。MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
无店铺零售的悄然兴起,是商业经济发展到一定阶段的产物,也是顺应新的消费需求和技术进步的必然结果。上海市商业经济研究中心副主任齐晓斋分析说,与传统的百货商店、连锁超市、大卖场、便利店等有形商铺相比,无店铺零售业态具有一定的先天优势。一是地段。对于传统的有形店铺来说,一是家门店选址、地段的优劣,几乎能够决定其未来经营的成败,而城市中的商业网点资源,尤其是优质商业网点资源通常十分稀缺。无店铺零售则大多不存在地段方面的制约。二是经营成本。借助日益发展的科学技术,无店铺零售通常能够省却从生产到销售过程中的许多环节,从而有效降低经营成本与交易成本,带来消费者、商家双赢的局面。三是风险。对于个人来说,网上商店等无店铺零售业态的准入门槛相对较低,运转比较灵活,即使遇到风险,也有船小好掉头的优势。专家表示,随着社会经济的发展及消费水平的提高,人们希望得到更加方便、更加快捷的购物方式,同时也乐于尝试各种新的购物方式。在这一市场需求的推动下,企业会对商品零售的方式进行创新,而先进的技术给创新提供了重要支撑与平台。
随着计算机技术的发展和网络人口的增加,网络世界也越来越广博,越来越丰富,电子商务已经成为网上的一股潮流。相信要不了太长有时间,顾客就可以在网络世界上获得他们在现实世界上可以获得的所有商品和服务。
以下是根据CNNIC(中国互联网络信息中心)公布的中国B2C电子商务发展报告来进一步分析目前的网上购物的现状。
90%选择网上购物的人都认为网上购物节约时间和操作方便,他们分别占46.7%和44.2%,这说明随着生活节奏的加快,人们越来越希望拥有简单快捷的购物方式网上购物已经逐渐成为一种购物趋势,越来越多的人选择网上购物。
消费者对消费要求的日益提高,使得网上商城必须向着专业化迈进,通过提供专业的产品和服务,区分市场。以卓越网和铛铛网为例,日前针对不同的消费者和消费需求,开通了计算机、外语、文学和艺术四个专业商城,这不仅体现了卓越网“最以客户为中心”的经验理念,相信也是中国网上商城未来发展的趋势。
尽管网络版权、阅读习惯仍是制约未来网络出版、网上商城发展的障碍,但网络环境给商品出版业带来深刻的革命,已成大势所趋。网上商城和传统店铺都在继续争取商品发行新的利润空间。目前的情况是,商品发行业对网络的利用并不充分,只刚刚涉足电子商务和网站建设,对网络的其他产品,以及网络及时、一对一、跨时间、跨空间等特性,并没有充分加以利用,可以预计,随着网络进一步融入人们的生活,以技术、服务为品牌支撑的网上商城将成为市场的宠儿和业态创新的引领者。
通过阅读大量相关文献结合在网上购物详细调研结论,从为什么开发网上购物系统的这一问题为起点。分析研究、解决该问题所能带来的意义,然后在国内外前人对该问题研究理论的基础上,结合管理系统理论、电子商务理论和相关技术理论,对系统进行了初步调查到详细调查的分析,在此分析的基础上,又对系统进行了总体设计再到详细设计的系统设计过程。最后,对系统进行实现、维护。
本系统在整体框架研究方法采用的是文献研究法和观察研究法。而在总体设计上采用的是结构化方法,在局部底层开发上为便于交流采用快速原型法。
文献研究法是指根据一定的目的,通过搜集和分析文献资料而进行的研究。也就是说,是建立在前人研究基础之上的。在自己研究的课题方面,你需要了解前人研究的状况,包括人家做过了哪些研究,获得了哪些成果,提出了什么观点,建立了何种理论,应用情况如何,还有哪些问题没有解决或者有哪些新问题产生,目前又有何新进展等等。
观察研究法指根据既定的研究目的,对现象或行为做有计划与有系统的观察,并依观察的记录对现象或行为做客观性的描述和解释。
结构化系统的设计方法是在结构化程序设计思想基础上发展起来的,它的基本涵义是一个系统由层次化的程序模块构成,每一个模块只有一个入口和一个出口,每一个模块只归其上一级模块调用,并有模块连接的准则和构造模块的标准,而且用系统结构图来表达系统的结构,尽可能用最优的方式将系统内各部分组织起来,而不是若干个程序的拼凑。
合理的选择开发技术,对于网站开发的完成情况有着非常重要的影响。要开发一个网站,首先要选择一个动态网页开发技术。当前比较流行的动态网页开发技术有JSP、ASP、PHP。它们的特性比较如表2.1所示:
表2.1 asp/jsp/php比较表
技术名称 |
ASP |
JSP |
PHP |
对数据库的支持 |
好 |
好 |
好 |
开发难易度 |
容易 |
容易 |
较难 |
使用平台 |
Windows9X/NT |
Windows/UNIX |
UNIX |
安全性 |
不好 |
好 |
不好 |
对组件的支持 |
支持 |
支持 |
不支持 |
执行方式 |
解释执行 |
编译之后执行 |
解释执行 |
跨平台 |
不好 |
好 |
好 |
这三种都是在传统的HTML代码中,利用HTML标签的扩展,构成页面。不难看出,JSP的综合实力是最强的,尤其是在安全性和跨平台性两个方面,比其他的两种技术都要好,因此,最后我们选择基于Java的JSP技术作为动态网页的开发技术。
系统的建设关键在于其所使用的架构,而网上购物这种基于web的系统,传统的c/s架构已经不能满足大量用户的访问和操作,b/s基于浏览器的架构则是目前网络系统应用的主流,它将大量的数据处理工作交给服务器端来处理,客户端只用通过普通的IE浏览器即可访问系统,方便快捷而且利于系统的更新和维护,java语言在该方面更是得天独厚,j2ee规范的出现则使系统的开发更加规范,层次更加清楚,更利于对复杂事务的处理,而且在安全性方面也做的更好。基于mvc的开发流程则使开发过程更加清晰明了,利于做一些复杂的逻辑实现,从而节省了开发周期和开发成本。
在B/S体系结构系统中,用户通过浏览器向分布在网络上的许多服务器发出请求,服务器对浏览器的请求进行处理,将用户所需信息返回到浏览器。B/S结构简化了客户机的工作,客户机上只需配置少量的客户端软件。服务器将担负更多的工作,对数据库的访问和应用程序的执行将在服务器上完成。浏览器发出请求,而其余如数据请求、加工、结果返回以及动态网页生成等工作全部由Web Server完成。实际上B/S体系结构是把二层C/S结构的事务处理逻辑模块从客户机的任务中分离出来,由Web服务器单独组成一层来负担其任务,这样客户机的压力减轻了,把负荷分配给了Web服务器。这种三层体系结构如图2.1所示。
图2.1 B/S三层架构示意图
这种结构不仅把客户机从沉重的负担和不断对其提高的性能的要求中解放出来,也把技术维护人员从繁重的维护升级工作中解脱出来。由于客户机把事务处理逻辑部分分给了功能服务器,使客户机一下子"苗条"了许多,不再负责处理复杂计算和数据访问等关键事务,只负责显示部分,所以维护人员不再为程序的维护工作奔波于每个客户机之间,而把主要精力放在功能服务器上程序的更新工作。这种三层结构在层与层之间相互独立,任何一层的改变不会影响其它层的功能。
在传统的基于Web的应用系统中,例如ASP,CGI等,通常开发者将业务逻辑,数据逻辑、展示逻辑等混杂在一起,在同一个界面面里既进行后台数据库的访问和操作,同时还包含业务流程和页面表示。这样编写出来的程序,既不利于程序员对业务代码的调试,同时也不利于编辑人员进行交互页面的设计。同时系统也不具备可扩展性,当我们要在现有业务上进行扩展的时候,通常无法借助于现有的资源和应用,而只能够重新编写,大大增加了投资,延长了系统上线的时间,失去了竞争市场的优势。
在本网上购物系统中,将采用通行的MVC模式来构建应用。这种结构解决了前面所述的所有问题,在我们的应用集成网络中,通过企业级高端J2EE应用服务器实现MVC开发模型。MVC的逻辑图如图2.2所示:
图2.2应用服务器之上采用MVC开发的逻辑示意图
通过这种方案,我们可以迅速地实现整个业务,其优势和特点如下:
Model(模型)层:由EJB组件来实现,EJB将具体的业务封装在组件内部,具备安全、高性能、可重用等优秀的特征。
View(视图)层:由JSP、HTML组成。这一层次的特点是能够真实地展示和客户交互的界面,具备可描绘的功能。同时能够嵌套动态数据,可以进行动态页面的展示。同时可以方便地进行客户端的个性化定制。根据每个客户的需求来展示不同风格的界面。
Controller(控制器)层:是非常重要的一层,这一层是连接View和Model的纽带,同时也是将这两层进行最大限度分离的工具。通常由Servlet来实现,Servlet和JSP虽然同样都属于页面展示工具,但分属两层。主要在于JSP以脚本语言的形式存在, 它的主要优势是进行动态数据的Web展示,而Servlet是一个完整的Java程序,进行业务的调用和流程的处理是它的长处。
通过这种模型的建立,我们的应用系统具备了非常好的性能和可扩展性。将业务组件和展示页面进行分离,并通过Controller来描述调用关系,一方面可以提高效率,另一方面也可以增加系统扩充的能力,使我们的系统可以进行最快速度的业务扩展,以满足不同用户、不同阶段、各种各样的业务需求。
在平台功能的分析基础上,本系统的功能主要由前台管理和后台管理功能组成,则系统的功能模块图,如2.3前台功能结构图。
图2.3 前台功能结构图
该部分主要包括新品上架、特价商品、购物车、留言管理、订单查询、商品查询以及个人信息,如后台功能结构图2.4。
图2.4后台功能结构图
不同权限管理员可以通过后台登录进去进行相应的商品管理,会员管理,订单管理和系统用户管理。在会员管理中,可以对会员就行添加删除和留言的回复、删除,在商品管理中可以对商品进行添加修改。
注册流程图2.5
图2.5 注册功能流程图
注册的具体实现为:
点击主页面的用户注册选项后,会弹出一个注册信息页面,用户需要如实填写用户名,密码,E_mail地址,真实姓名等各项信息,提交后,系统进行检测判断该用户名是否已经注册过,如果已经存在则弹出新页面,提示用户该用户名已经注册过,如果没有则进行下一步判断,用户输入的两次密码是否一致,然后依次往后判断用户所填写的各项信息是否符合要求,直到所有信息均正确无误,系统将该用户注册信息写入会员表并提示用户注册成功,用户登陆后,就可以进行有效的购物了。
用户登录,首先要有一个提供用户登录的表单。用户登录的表单应该嵌入整体的结构当中。在实际的应用中,可以这样设计,如果用户没有登录,则在页面中显示用户登录的选项,用户登录后,则可隐藏用户登录的选项而代之以用户的基本信息。
首先,用户要有一个用户名和密码。商务网站需要很高的稳定性和安全性,因此对用户名不允许使用恶意的代码作为用户名。同时对密码也要求保密,将密码加密后再存入数据库。另外,一个电子商务网站。用户的真实姓名是必不可少的。除此之外还需要用户的地址、E-MAIL、电话号码等,如图2.7。
图2.6用户登录流程图
如2.7商品管理流程图
图2.7商品管理流程图
在该功能里管理员可以进行不需要的商品的删除,在这里管理员当然也可以浏览到商品的详细信息。
(1)Picture用来存储商品的图片资料,管理员上传的商品图片也存在这里。
(2) image和img用来存储网页上的图片文件。
(3)CSS和styles用来存储样式。
(4) classes 用来存储封装.java和.class文件,也可称为JavaBean文件。
(5) Admin 用来存储管理员的页面。
(6)WEB-NIF 用来存储struct.xml文件,将java文件与jsp页面中的表格建立连系
该系统使用MySQL数据库作为被连接的数据库,使用Hibernate连接池技术进行连接。
—连接数据库的URL-->
—连接的登录名-->
—登录密码-->
—JDBC驱动-->
—指定连接的语言-->
数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效的存储和管理数据,满足各种用户的应用需求。
数据库设计要遵循一些规则,三分技术,七分管理,十二分基础数据,由十二分基础数据看出数据的收集、整理、组织和不断更新是数据库建设中的重要环节。而基于E-R模型的数据库设计方法,很好的体现了数据之间的关系以及数据与表之间的关系,该方法被数据库概念设计阶段广泛采用,如图3.1。
图3.1数据库的E-R图
用户登陆模块是防止非法用户登陆的第一道防线,通过它可以保护后台数据库的安全性,当用户要进行定购时,首先要进入的就是身份验证界面,只有在密码正确的情况下才能进行以后的购物,如果输入的密码不正确,则不能进行定购。如果用户以浏览者的身份进入网站,则只能进行一般的商品浏览和搜索,而不能进行选购,在点击添加购物车后,系统会判断该用户是否是登陆用户,如果不是则出现提示信息,提示用户必须先登陆才能定购商品,如果是第一次登陆,请先注册,如图3.2。
图3.2主页面示意图
如果用户还不是会员则提示用户进行注册,用户提交信息之后,系统开始判断用户的注册信息是否有效,首先是用户名是否为空,(该处存在用户名命名规则的问题,后面问题中会详细解决)用户输入的两次密码是否一致,然后依次往后判断用户所填写的各项信息是否符合要求,直到所有信息均正确无误,系统将该用户注册信息写入会员表并提示用户注册成功,用户登陆后,就可以进行有效的购物了,如图3.3。
图3.3注册页面示意图
系统对用户的注册信息的验证实现如下:
用户输入的各项信息分别对应字段
判断两次输入是否一致
document.all.loginPwd.value != document.all.reLoginPwd.value
判断登录账号是否已存在
var lname = document.all.loginName.value;
(lname !=null)&&(lname.length>0)&&(!jsonrpc.ajax.chkLoginName(lname))
运用正则匹配判断联系电话、邮政编码、电子邮箱是否符合要求
Phone : /^13[0-9]{1}[0-9]{8}|^15[9]{1}[0-9]{8}$/,
Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
Zip : /^[0-9]\d{5}$/,
如果条件符合则将该值赋给各个字段
当所有条件都符合的时候,系统将数据写入数据表,并提示注册成功,写入关键语句为:
登陆的具体实现要通过一个全程变量,即Member类的form变量来实现. MemberForm form=(MemberForm)session.getAttribute("form");
图3.4 登录示意图
具体的判断过程为:
若表单为空即session.getAttribute("form")==null,表明没有经过登录与否的验证,则立即提示表单不能为空,请用户登录;并将检查用户登录的帐号和密码,如图3.4
关键代码为:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
String p = request.getParameter("method");
if (p!=null && p.equals("logout"))return null;
ActionErrors errors = new ActionErrors();
ActionMessages msg = new ActionMessages();
if(loginName==null||loginName.length()<1){
msg.add("loginName",new ActionMessage(Constants.ADMIN_LOSTNAME_KEY));
}else if(loginPwd==null||loginPwd.length()<1){
msg.add("loginPwd",new ActionMessage(Constants.ADMIN_LOSTPWD_KEY)); }
errors.add(msg);
return errors; }
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { MemLoginForm memLoginForm = (MemLoginForm) form;
MemService service = new MemServiceImpl();
ActionForward forward = null;
ActionMessages msgs = new ActionMessages();
try{
Membermem = service.memLogin(memLoginForm.getLoginName(), memLoginForm.getLoginPwd());
if (mem!=null){
request.getSession().setAttribute("member", mem);
forward=new ActionForward("/mer.do?method=browseIndexMer");
}else{
forward = mapping.getInputForward();
msgs.add("loginError",new ActionMessage(Constants.ADMIN_LOGINERROR_KEY));
saveErrors(request, msgs); }
}catch(Exception ex){
logger.info("在执行LoginAction类中的login方法时出错:\n");
ex.printStackTrace(); }
return forward; }
如果loginName存在的话则判断其密码是否正确
如果为真则将跳转ActionForward("/mer.do?method=browseIndexMer");以方便系统对用户在操作一些会员功能时进行用户身份验证。
登录后,可以马上看到自己的资料,如图3.5
图3.5用户信息示意图
用户在登录之后也可以对自己的资料进行修改,在点击主页面的修改资料之后,弹出这样的一个页面,用户可以直接在文本框里修改,然后确认,如图3.6。
图3.6 用户资料修改示意图
修改这一过程的具体实现过程为
// 修改会员属性
public ActionForward updateMember(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { MemService service = new MemServiceImpl();
ActionMessages msgs = new ActionMessages();
try{ Membermem= (Member)request.getSession().getAttribute("member");
mem.setMemberName(request.getParameter("memberName").trim());
mem.setLoginName(request.getParameter("loginName").trim());
if(request.getParameter("loginPwd")!=null&&request.getParameter("loginPwd").length()>0){
mem.setLoginPwd(request.getParameter("loginPwd").trim()); }
mem.setPhone(request.getParameter("phone").trim());
mem.setAddress(request.getParameter("address").trim());
mem.setZip(request.getParameter("zip").trim());
当用户登陆成功以后,如果找到了希望定购的物品,在点击物品下方的定购以后,点击进入购物车页面进行查看,显示该物品已经添加进购物车,然后用户需要选择定购的数量,如图3.7。
图3.7购物车示意图
在点击确认以后,该物品信息被后台添加到
List tmp = cartService.browseCart(mem);
if (tmp!=null && tmp.size()>0){
result = new ArrayList();
Iterator it = tmp.iterator();
Cartselectedmer sel = null;
Merchandise mer = null;
while(it.hasNext()){
row = new HashMap();
sel = (Cartselectedmer)it.next();
mer= erService.loadMer(sel.getMerchandise());
row.put("merId", mer.getId());
row.put("selId", sel.getId()); row.put("merName", mer.getMerName().trim());
row.put("memprice", Double.valueOf(df.format(sel.getPrice())));
row.put("price", Double.valueOf(df.format(mer.getPrice())));
row.put("number", sel.getNumber());
row.put("money", sel.getMoney());
money = money + sel.getMoney().doubleValue();
result.add(row); }
request.setAttribute("result", result);
request.setAttribute("totalMoney", Double.valueOf(df.format(money))); }
forward = mapping.findForward("browseCart"); }
如果用户在去收银台结帐前对已经选购的物品不满意时,可选择清空购物车。用户完成选购之后,可点击收银台付款,如图3.8
图3.8购物车结帐示意图
该步骤实现的关键语句为:
public ActionForward submitOrder(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { ActionForward forward = null;
String memName = request.getParameter("memName");
String phone = request.getParameter("phone");
String zip = request.getParameter("zip");
String address = request.getParameter("address");
OrderService oService = new OrderServiceImpl();
CartService cService = new CartServiceImpl();
try{
//判断会员是否已成功登录
Member mem = (Member)request.getSession().getAttribute("member");
if(mem==null){
forward = mapping.findForward("memSorry");
}else{
mem.setMemberName(memName.trim());
mem.setPhone(phone.trim());
mem.setZip(zip.trim());
mem.setAddress(address.trim());
MemService service = new MemServiceImpl();
系统会返回给用户用户信息,提示用户核对收货人详细信息,包括姓名、地址、邮编、电话、,这些信息是提交后将存入数据库表中,点击提交后会生成相应的订单。
进入查看订单页面,将看到生成的相应的订单以及以前生成的没有出货的订单,点击查看详细信息,如图3.9。
图3.9 订单信息示意图
这一步的具体实现
//查询订单的详细信息
if(order!=null){
List tmp = service.browseOrderMer(order.getCart());
if (tmp!=null && tmp.size()>0){
result = new ArrayList();
Iterator it = tmp.iterator();
Cartselectedmer sel = null;
Merchandise mer = null;
while(it.hasNext()){
row = new HashMap();
sel = (Cartselectedmer)it.next();
mer = merService.loadMer(sel.getMerchandise());
row.put("merName", mer.getMerName().trim());
row.put("memprice", sel.getPrice());
row.put("price", mer.getPrice()); row.put("number", sel.getNumber());
row.put("money", sel.getMoney());
result.add(row); }
request.setAttribute("result", result); }
request.setAttribute("order", order); }
forward = mapping.findForward("viewOrder"); }
进入后台点击订单设置
图3.10 后台订单管理示意图
该页面也就是将用户提交的订单信息返回,并产生了一个唯一订单号,以方便用户查询是否出货,如图3.10。
商品信息主要是为了让顾客对所需要的信息就行了解。其中网站设置正常价格和打折价格,如图3.11。
图3.11 商品信息示意图
网上购物系统除了能够让用户实现前台的浏览和购物等操作之外,还必须能够使管理人员能够对系统的各种信息进行维护,比如商品的增加、删除、修改,会员的审查,更新等等。管理功能是网上购物系统相当重要的一部分功能。
管理员可以通过主页面的“后台管理”进入系统后台进行维护,点击之后,首要的就是进行身份验证,输入正确的帐号,密码之后,方能进入。由于涉及到交易,出于安全性考虑,管理员帐号应尽量少分配,密码也要尽量复杂,经常更换,如图3.12。
图3.12 后台登录示意图
这个过程中,点击登录后,将用户名和密码框中的值传form对象中。具体
进入之后系统管理的主页面 采用了框架结构,左边是一个树型菜单,右边显示具体信息,如图3.13。
图3.13后台登录首页界面
管理的主要功能有商品信息的更新,会员信息维护,后台管理员设置等四大块,商品信息管理,主要就是添加新的商品,删除和修改已经添加的商品,如图3.14。
图3.14 商品添加界面
这一部分的实现代码:
// 添加商品的信息
public ActionForward addMer(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { MerForm merForm = (MerForm) form;
Merchandise mer = new Merchandise();
MerService service = new MerServiceImpl();
ActionMessages msgs = new ActionMessages();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
mer.setMerName(merForm.getMerName().trim());
mer.setMerModel(merForm.getMerModel().trim());
mer.setPrice(merForm.getPrice());
mer.setSpecial(merForm.getSpecial());
mer.setSprice(merForm.getSprice());
mer.setMerDesc(merForm.getMerDesc().trim());
mer.setManufacturer(merForm.getManufacturer().trim());
删除商品主要用到的关键语句
public ActionForward delMer(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { ActionMessages msgs = new ActionMessages();
MerService service = new MerServiceImpl();
String p = request.getParameter("id");
Integer id = null;
if(p!=null){
id = new Integer(p);
}else{
id = new Integer(0); }
会员信息管理,则主要是查看会员信息和对一些恶意注册用户进行删除。添加会员注册的普通用户,如图3.16。
图3.16 用户添加界面
查看用户和删除用户的语句分别是:
// 查看会员详细信息
public ActionForward viewMember(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { MemService service = new MemServiceImpl();
Member member = null;
String p = request.getParameter("id");
Integer id = null;
if(p!=null){
id = new Integer(p);
}else{
id = new Integer(0); }
// 删除操作
public ActionForward delMember(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) { MemService service = new MemServiceImpl();
ActionMessages msgs = new ActionMessages();
String p = request.getParameter("id");
Integer id = null;
if(p!=null){
id = new Integer(p);
}else{
id = new Integer(0); }
我们可以将整个系统文件夹Eshop拷贝到Tomcat的默认根目录下,一般路径为:
C:\Tomcat6.0\webapps
Myeclipse8.5是开发jsp的强有力的工具,他集成了很多插件,本网上购物系统就是在Myeclipse8.5的平台上开发的。
系统完成之后,对各个模块的功能进行了详细的测试,输入数据和预测输出数据相比,发现了一些问题。主要是在查询过程中预计查询结果和实际结果不一致,有时候达不到目的,对数据库的操作表之间的关联考虑得不够周到,因此往往会出现一些小的错误。还有查询条件的前后数据类型不一致也是一个很常见的错误,需要靠一步步的查找解决。各个模块组装完成后,又会出现一些问题。比如在操作购物车结帐的这个流程中,由于是多次添加和修改,最后结帐,所以很容易造成数据混乱,必须对相应的数据关系理清楚,一些关键查询统计的SQL语句必须反复斟酌才能放在程序中使用。
(1)经过上面部分的分析,我们可以得知,购物车模块是我们需要特别注意的地方,因为它涉及到了我们数据库中的大部分数据,并且是进行网上交易的最关键部分,绝对不能出现任何的差错,下面我们就针对这一模块进行用例测试:
我们以用户aa的身份登入系统,用户名是:aa密码是:aa
然后点击商品查看详细内容:货币战争 单价为56元
点击购买:选择商品 进入购物车栏,购物清单显示商品名称货币战争
数量1 合计56元与我们估算的数据相符。
此时选择清空购物车,继续购物,点击定购商品两次:货币战争 单价56元
进入购物车栏,购物车清单:显示商品名称货币战争 合计112元
继续进入下一步,出现订单显示:填写订单信息,并提交订单,进入后台管理,点击订单设置,进入订单详细信息,显示商品详细信息:商品名称货币战争 合计112元
与我们估算的数据也相符,证明购物车的功能正常有效。
(2)对用户注册部分进行测试
用户名:aa 密码:aa 确认:aa E _mail:[email protected]
真实性名:bb 提交以后,提示信息:该用户已存在,用户名重复验证正常
因为是第一次做这么完整的基于Jsp的系统,所以碰到的问题也很多,除了一些基本的语法之外,感觉还是一些考虑问题的思维方式不太得当。
第一个问题是用户在注册过程中,一些关键字段的命名规则存在着比较大的缺陷,比如用户名的选择上,一般的习惯是规定只能从a~z和数字0~9的随机组合,不能有特殊字符,而且只能以字母开头,不能以数字开头,用户名的长度也有限制。
第二个问题就是用户登陆以后,如果需要修改资料,系统会先将数据库中该用户的所有信息以列表形式显示出来,问题就是此时出现的用户密码信息是以明码形式出现的,这对用户来说就存在这很大的风险,容易被他人看到,最好是以一些特殊符号来代替从而防止信息泄漏,在参考了其他网站的登陆模块之后,我对代码进行了简单修改,即可实现,问题是由密码的输入框属性引起的。
第三购物车这个模块比较的难设计,因为过程比较复杂,他的一些逻辑处理就比较的难以用代码实现。我参考了一些电子商务网站,研究了一下他们的购物流程,大概有了一些处理的想法。