网上书店系统设计
目录
摘要 iii
Abstract iv
第一章 绪论 1
1.1 网上书店系统概论 1
1.1.1 课题开发的背景 1
1.2 课题开发的意义 2
1.2.1网上书店的优势 2
1.2.2 目前国内网上书店存在的主要问题 3
1.3 结构模式 4
第二章 开发技术综述 6
2.1 开发工具与环境 6
2.2开发平台 7
2.2.1 硬件平台 7
2.2.2 软件平台 7
2.2.3 技术平台 7
2.3 开发语言 8
2.3.1 HTML超文本标识语言 8
2.3.2 脚本语言 9
2.3.3 文本编辑方式 9
2.3.4 利用可视化编辑工具软件 9
2.4数据库技术 10
2.4.1 Microsoft SQL SERVER 2005数据库简介 10
2.4.2 连接SQL SERVER 2005数据库 11
2.5 B/S模式 12
2.6 Tomcat服务器 12
第三章 需求分析 14
3.1 系统要实现的目标 14
3.2 可行性分析 15
3.2.1 经济可行性 15
3.2.2 技术可行性 15
3.3 性能需求 15
3.4 系统的安全性要求 16
第四章 系统概要设计 17
4.1 系统功能结构 17
4.2系统功能模块设计 18
4.3系统的业务流程 19
4.4 安全性设计 21
4.5数据库设计 22
第五章 系统实现 26
5.1系统功能模块的实现 26
5.1.1系统功能主界面的设计 26
5.1.2后台系统管理模块设计 28
5.1.3核心代码分析 49
5.2系统性能测试 53
5.2.1测试环境 53
5.2.2测试方法和策略 54
5.2.3测试用例设计(后台) 55
5.2.4测试结论 55
结束语 56
参考文献 57
谢 辞 58
网上书店系统设计—后台设计
摘要:随着计算机和互联网的发展打开了人们的视野,信息化、数字化时代的步伐就向我们迈进了,一种新的购物平台——电子商务平台在不知不觉中影响着我们的生活。通过网络进行电子购物不但节省了消费者的时间,而且商家也可以通过分析网上购物者的需求关系,来调整生产产品的种类和数量。
本系统主要是采用MVC模式,基于B/S结构并运用jsp技术和SQL SERVER 2005数据库技术来实现的。电子商务是在互联网开放的网络环境下,基于浏览器/服务器应用方式,实现消费者的网上购物、商户之间的网上交易和在线电子支付的一种新型的商业运营模式。电子化的商业贸易蓬勃发展,网上在线交易,电子商务创建了一个不受时空限制的协作交流空间,买卖双方的交易信息都可以借助这个虚拟平台进行沟通。
本系统共分两个部分:前台用户部分和后台管理部份。其中根据电子商城前台的特点,可以将其分为购物、管理个人信息,前台订单处理,浏览信息,查询信息几个部分。根据电子商城后台的特点,可以将其分为商品设置、公告设置、后台订单设置、用户设置以及退出后台几个部分。
关键词:电子商城;JSP;B/S结构;MVC模式
The Design of BookStore System
Abstract: Along with the development of computer and the Internet opened their horizons and informationization, the pace of digital times forward to us, a kind of new shopping platform - e-commerce platform in imperceptible in affect our lives. Through the network shopping not only save the consumer electronic the time and merchants can also through the analysis of the demand of online shoppers to adjust production relations, product category and quantity.
This system is mainly using MVC pattern, using the JSP technology and SQL SERVER 2005 database technology to realize. Electronic commerce is in Internet open network environment, based on the browser/server application methods to realize the online shopping, consumer entered into between online trading and on-line electronic pay a new type of business operation mode. Electronic commercial trade vigorous development, online transactions, electronic commerce created a limited by time and space, the collaborative communication between buyer's trading information can communicate with the virtual platform.
This system is divided into two parts: front desk user part and backend department copies. Among them according to the characteristics of electronic mall receptionist, can he divided into shopping, management personal information, front desk order processing, browsing information, inquires the information several parts. According to the characteristics of electronic mall backstage, can he divided into commodity Settings, announcement Settings, backstage order Settings, user Settings and exit backstage several parts.
Keywords: electronic mall; The JSP; B/S structure; MVC
第一章 绪论
1.1 网上书店系统概论
1.1.1 课题开发的背景
随着Internet的发展。网上书店将成为21世纪网络应用发展的热点,网上购物将成为一种购物时尚,目前国内企业正纷纷加入到阿里巴巴等一系列大型电子商务网站中,通过网络进行交易将成为未来商品交易的重要组成部分。随着中国市场经济的日趋成熟,中国企业面对的竞争压力也越来越大,企业要想生存,就必须充分利用信息化手段来提高管理效率及市场响应速度。电子商务是在互联网开放的网络环境下,基于浏览器/服务器应用方式,实现消费者的网上购物、商户之间的网上交易和在线电子支付的一种新型的商业运营模式。电子商务网站是其生存的理由和基础,同时也是企业对外展示信息、从事商务活动的窗口和界面。如何设计、建立一个经济、实用、安全、高效、稳定的网站是每个电子商务网站必须考虑的问题。
一般来说,一个完整的电子商城系统包括信息流、资金流与物流三个要素,并且三者相辅相成。信息流就是通过电子网络向客户展示所售商品的相关信息,引导客户通过网络进行购物;资金流就是使客户在选择商品后,能过通过网络进行支付相关费用,物流就是把客户所购买的商品通过物流配送系统送到客户手中,常见的物流公司有申通、圆通、中通等快递公司,还有EMS以及通过邮局以包裹的方式平邮。另外对于一些特殊行业和特殊领域的电子商城,如证券、金融、信息类。产品,如股票、Q币、电子文件、网站域名信息等也可以不需要配送系统的支持便可以把商品送到客户手中。
概而言之,电子化的商业贸易蓬勃发展,网上在线交易,电子商务创建了一个不受时空限制的协作交流空间,买卖双方的交易信息都可以借助这个虚拟平台进行沟通。
1.2 课题开发的意义
1.2.1网上书店的优势
网购发展为何发展得如此迅速,如此深入人心,主要有以下几方面的原因: 首先,对于消费者来说:
1.坐在家里的电脑前就可以“逛商店”,订货不受时间和空间的限制。
2.与在亲历书店相比,网上购书可以获得较大量的商品信息,可以买到当地没有的商品。
3.网上支付相比较传统的拿现金支付更加安全,可避免现金丢失或遭到抢劫; 弊端是支付账号和密码会被人窃取,因此要保存好自己各种支付账号和密码,防止他人获取。
4.从订货、付款到货物上门无需亲临现场,既省时又省力。
5.由于网上商品省去租店面、聘请雇员及储存保管等一系列费用,总的来说其价格较一般商场的同类商品更便宜。
6.网上书店的书常常会打折,对于大量购书的人来说,能剩下不少钱。
7.对于商家来说,由于网上销售没有库存压力、经营成本低、经营规模不受场地限制等,在将来会有更多的企业选择网上销售,通过互联网对市场信息的及时反馈适时调整经营战略,以此提高企业的经济效益和参与国际竞争的能力。每天24小时,每周7天。任何时候都在为客户服务。客户无限:全球的任何人都可以通过Internet访问您的商店,不受空间限制。服务优质:网上商店,不但可以完成普通商店可以进行的所有交易,同时它还可以通过多媒体技术为用户提供更加全面的商品信息。成本低廉:由于是网络虚拟商店,业主无需为租赁场地发愁,无需为水电费发愁,无需为店员的工资发愁,再次,对于整个市场经济来说,这种新型的购物模式可在更大的范围内、更广的层面上以更高的效率实现资源配置。
综上可以看出,网上购物突破了传统商务的障碍,无论对消费者、企业还是市场都有着巨大的吸引力和影响力,在新经济时期无疑是达到“多赢”效果的理想模式。
1.2.2 目前国内网上书店存在的主要问题
外部环境问题:
1.国内互联网普及程度不高,网上读者相对量小。目前,中国互联网用户为0.988亿,占中国人口的7.72%。在互联网用户中又真正浏览网上书店并点击选订的更不多,一般受众多为白领阶层和专业人士。
2.结算方式滞后,网上银行发展不发达。2004年末中国互联网中网上银行用户为16.9%,其中只有5.1%将网络银行作为常用网络服务之一,更多的网上业务结算还是通过传统的异地汇款和货到付款。银行间的复杂结算造成延迟到书,失去网上书店快捷的比较优势,丧失竞争力。
3.社会信用水平不高,交易诚信相对差。中国个人信用制度尚处于起步阶段,诚信凭个体的道德自律,社会上信用问题较多,人们担心网上交易的安全性。在CNNIC最新的统计数据中显示,网上交易的安全性问题也排在网上交易问题的第二位。读者担心在交易过程中泄露个人资料而带来不必要的损失和麻烦,因而,难以保证的交易安全对读者网上购物产生了很大的心理障碍。
4.人们购书和阅读习惯一时难以改变。网上书店提供的图书信息无法了解到图书的详细内容,而了解才是购买与否的关键。
内部因素问题:
1.信息服务不完善、低质量。查询、分类形式单一,注重图书数量的丰富而忽略图书及其相关知识和信息的提供、介绍。图书推介过于简明扼要、书评太少,读者缺少选择参考。
2.图书配送周期长、成本高、时效性差。物流不发达,配送网络不畅,无配送点的地方只能采用邮资成本居高不下的邮寄方式。特别是在一些中小城市,读者往往不能在网上书店提示的时间收到货物,甚至有人等待了1个月的时间才收到图书。我国疆域宽广,地区发展存在差异,所以完善的配送系统是成功的网上书店必须具备的。中国加入WTO后,实力雄厚、发展成熟的海外书店将进军中国,竞争将更加激烈,因而,完善的配送系统、高质量的配送服务是现在乃至将来网上书店发展必须解决的问题。
3.经营目标有差异、动机不一。不少投资者进军网络,以网上书店做壳,进行做秀、炒作圈钱。其投入是为了在证券市场卖掉,而非把公司经营下去。这将会影响网上书店健康发展,以至把书业电子商务引入歧途。有的经营者为了盈利,常常以次充好, 近年来,我国图书市场较为混乱,图书选题重复、“搭便车”的现象屡见不鲜,盗版产品层出不穷,严重影响了图书的质量。读者在网上书店购物时不能像在传统书店一样,通过仔细阅读进行挑选。因而,读者收到的商品很可能名不副实。同时,商品的调换退货问题也是网上书店的老大难问题:读者不能像在传统书店购物一样,发现质量问题就及时调换,调换或退货商品很可能“一去不复返”。这些问题的存在都会损害网上书店的信誉和读者的购物热情,不利于书店的发展。
4.经营模式未走出传统书店模式。营业流程仅将店头买卖转变网络点选,再依不同运输动作送到消费者手中,其充其量是传统书店的被动网络资源,并未真正做到网上书店低库存量的优势,没有充分体现出电子商务对商业的革命性的意义。
1.3 结构模式
按照交易实施的参与主体分,电子商务的主要分为五种模式。
1.B2B模式
企业与企业间的电子商务,即B2B(Business to Business)。 企业对企业的电子商务,提供商务信息平台,供买卖双方的企业在平台上发布供求信息、寻找合作伙伴、在线交易、跟踪服务等。可以在企业内部(内部结算平台),也可以是企业之间进行。国内代表:阿里巴巴,比较纯的B2B商务模式。
2.B2C模式
企业与消费者之间的电子商务,即B2C(Business to Customer)。主要是企业开设产品专卖电子商店,在互联网上向顾客出售企业产品,提高物流速度,节约无力商店的成本、管理、人员等费用。例如:HP网上专卖店;亚马逊、卓越、当当等购书网站。其特点类似于现实商务世界中的零售。
3.C2C模式
消费者对消费者的交易模式,C2C电子商务平台就是通过为买卖双方提供一个在线交易平台,使卖方可以主动提供商品上网拍卖,而买方可以自行选择商品进行竞价。国内代表:易趣、淘宝、拍拍等。其特点类似于现实商务世界中的跳蚤市场。
4.B2G模式
B2G即政府与企业之间的通过网络进行的交易活动,比如电子通关,电子纳税等。B2G的特点是迅速和信息量大。由于活动在网上完成,使得企业可以随时随地的了解政府的动向,还能减少中间环节的实践延误和费用,提高政府办公的公开性和透明度。
5.C2G模式
它是属于电子政务征收的一方面,政府把电子商务扩展到福利发放和自我估税及个人税收。
第二章 开发技术综述
在本系统的设计开发中,选取了Adobe Dreamweaver CS3作为页面设计工具、B/S模式的交互模式、JSP技术、MVC模式的Struts框架、SQL SERVER 2005数据库技术。本章将对所选取的技术和工具进行技术基础分析。
2.1开发工具与环境
[操作系统] : Windows XP、Windows NT4.0或NT5.0、Windows ME等。
[内存] : 建议512MB以上;
[硬盘空间] : 预留1GB以上空间;
[其它]:modem或网络适配器,安装TCP/IP网络通信协议
[开发工具] :
1.jdk 1.6: JDK(Java Development Kit)是Sun Microsystems针对Java程序员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的第一步。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。
2.myelipse 5.5 : MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。
3. Dreamweaver 8:是优秀的网页制作工具,对于创建专业 Web 站点而言,世界上最好的方法现在莫过于最简单的建立功能强大的 Internet 应用程序的方法。您可以在单一环境下工作,从而快速创建、建立和管理 Web 站点和 Internet 应用程序。获取Dreamweaver的可视化布局工具、Dreamweaver UltraDev的快速Web应用程序功能以及HomeSite的代码编辑支持,所有这些都可以在Dreamweaver 8这一完整的集成解决方案中完成可以方便快捷地创建可视网页,自动生成全部的HTML代码。
2.2开发平台
2.2.1 硬件平台
系统中最重要的硬件平台是Web服务器,建议使用专用的服务器,如 HP、Compaq等公司的产品。系统中的其它计算机没有大的限制,只要能够满足使用浏览器和联网的需求。网络环境可直接使用目前的校园网。
2.2.2 软件平台
软件平台包括终端软件平台和服务器软件平台。可以采用以下一套方案 :各终端使用 Windows XP为平台 ,使用 Internet Explorer为浏览器。
Web服务器端,选用 Windows NT4. 0 Server中文版作为网络操作系统;选用 Internet Information Server4. 0作为Web服务器软件;选用Microsoft SQL SERVER 2005作为管理系统的数据库。
2.2.3 技术平台
JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。
JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
JSP的1.0规范的最后版本是1999年9月推出的,12月又推出了1.1规范。目前较新的是JSP1.2规范,JSP2.0规范的征求意见稿也已出台。
JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
自JSP推出后,众多大公司都支持JSP技术的服务器,如IBM、Oracle、Bea公司等,所以JSP迅速成为商业应用的服务器端语言。
JSP可用一种简单易懂的等式表示为:HTML+Java=JSP。
2.3开发语言
2.3.1 HTML超文本标识语言
与常见的字处理文件不同 ,Web页以超文本标识语言编排格式。HTML文件是带有特定HTML插入标记的,用以编排文档属性和格式的标准文本文件。
2.3.2 脚本语言
本电子商务平台主要采用脚本语言是Javascript, jQuery。Javascript是一种由NetScape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对数据进行验证,由于网络速度相当缓慢,只有28.8kbps,验证步骤浪费的时间太多。于是Netscape的浏览器Navigator加入了Javascript,提供了数据验证的基本功能。
Jquery是继prototype之后又一个优秀的Javascrīpt框架。它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。
2.3.3 文本编辑方式
主要采用HTML语言(超文本标记语言)来对前台页面进行编写,它和视图模式的主要区别在于使用HTML可以对网页上的网页元素进行精确定位,另外,它是一种描述文档结构的语言,它使用描述性的标记符来指明文档的结构。这些标记符是区分文档和各部分的分界符,使得文档在浏览器中能够正确显示。另外它的编写环境非常简单,可以使用任何文本编辑工具进行编辑。
2.3.4 利用可视化编辑工具软件
利用文本编辑工具进行编辑时,需要逐行敲入代码,这将会给网页编辑工作带来很大的工作量。所以,我们可以使用可视化的编辑软件,它可以所见即所得,非常直观地显示出所做的网页效果,以便我们进行设计网页。这两种网页制作方式各有优点和缺点,所以采用两种方式相结合的方式进行网页设计。
2.4数据库技术
2.4.1 Microsoft SQL SERVER 2005数据库简介
SQL Server 是美国Microsoft公司开发的一个关系型数据库管理系统,是目前世界上最著名的关系数据库管理系统之一。它在性能和可扩展方面确立了世界领先的地位,是一套完全的数据库和数据分析解决方案,使用户可以快速创建下一代的可扩展电子商务和数据仓库解决方案。Microsoft SQL Server 2005 在数据库服务器自动调整和自动管理技术方面在数据库领域中处于领先地位,使客户可以集中精力处理商业战略上的问题,而不是去细微调整数据库服务器的各项参数。SQL Server 的主要功能:
1. 数据库管理功能
作为数据库管理系统,SQL Server 自然应该具有数据库管理功能。它的数据库由包含数据的20世纪,随着计算机科学的发展,数据库技术在Internet 中的应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。个性化已逐渐成为当今Wed应用的潮流。本文研究了一种基于数据关联规则采集技术的用户个性化页面动态生成方案,此方案与现今网上已采用的一些方案相比,具有用户使用更简单、反映用户更明显细致等优点。
2. 数据仓库功能
SQL SERVER 2005提供了一套全新的综合分析服务系统。分析服务为商业活动提供了集成的OLAP服务和数据挖掘功能。OLAP可以通过多维存储技术对大型、复杂数据集执行快速、高级的分析工作。数据挖掘功能能够揭示出隐藏在大量数据中的倾向及趋势。SQL Server针对包括集成数据挖掘、OLAP服务、安全性服务及通过Internet对多维数据集进行访问和链接分析提供新的数据仓库功能。
3. 电子商务
SQL Server 不仅提供电子商务所需的可伸缩性与可扩展性之外,还提供了丰富的数据库编程能力,以确保系统的协同工作和灵活性。SQL Server2000 不仅支持集中化数据库管理功能,而且还最大程度地实现了管理与优化工作的自动化,从而,减轻了有关管理人员的负担。
4. 完备的 Web 功能
SQL Server2005允许通过HTTP协议,在 Web上进行高性能、基于标准的安全访问。基于Web的客户端拥有访问关系型数据存储和访问分析服务的能力。
5. 分布式数据复制功能它可以将一个数据库中的数据复制到通过局域网、广域网或 Internet 网络连接的不同地点服务器或同一服务器中的不同数据库中,并能够自动保持这些数据同步,使各个数据库中具有相同的数据。
2.4.2 连接SQL SERVER 2005数据库
连接数据库主要是采用JDBC-ODBC桥来链接。 由于微软的数据库不是用Java语言来编写的,但是我们需要用java语言连接微软的数据库,这样就要编写一个桥连接,使java语言编写的代码也可以操作数据库。JDBC-ODBC这个桥连接就可以实现。建立一个JDBC-ODBC桥连接,由于建立桥连接时可能会发生异常,因此,要捕获这个异常。建立桥连接的标准如下:
try{
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
}catch(ClassNotFoundException e){}
这里,Class是包java.lang中的一个类,该类通过调用静态方法forName加载com.microsoft.sqlserver.jdbc包中SQLServerDriver类来建立纯java代码连接。
2.5 B/S模式
B/S(Browser/Server,浏览器/服务器)模式又称B/S结构。它是随着Internet技术的兴起,对C/S模式应用的扩展。在这种结构下,用户工作界面是通过IE浏览器来实现的。B/S模式最大的好处是运行维护比较简便,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据;最大的缺点是对企业外网环境依赖性太强,由于各种原因引起企业外网中断都会造成系统瘫痪。
随着Internet和WWW的流行,以往的主机/终端和C/S都无法满足当前的全球网络开放、互连、信息随处可见和信息共享的新要求,于是就出现了B/S型模式,即浏览器/服务器结构。B/S模式最大特点是:用户可以通过WWW浏览器去访问Internet上的文本、数据、图像、动画、视频点播和声音信息,这些信息都是由许许多多的Web服务器产生的,而每一个Web服务器又可以通过各种方式与数据库服务器连接,大量的数据实际存放在数据库服务器中。客户端除了WWW浏览器,一般无须任何用户程序,只需从Web服务器上下载程序到本地来执行,在下载过程中若遇到与数据库有关的指令,由Web服务器交给数据库服务器来解释执行,并返回给Web服务器,Web服务器又返回给用户。在这种结构中,将许许多多的网连接到一块,形成一个巨大的网,即全球网。而各个企业可以在此结构的基础上建立自己的Internet。
2.6 Tomcat服务器
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 6 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是6.0。
Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。
Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
这里的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
第三章需求分析
3.1 系统要实现的目标
通过对一些典型网上书店如:卓越网,当当网的考察、分析以及实际的市场调查,要求本系统具有以下功能:
1.系统运行稳定、安全可靠,尤其是要保证从Internet上可以访问到的前台销售管理系统的安全。
2.统一友好的操作界面,能保证系统的易用性,便于用户掌握。
3.展示网站最新的商品信息,不断更新商品种类,使用户了解最新的市场动态。
4.网站根据商品的销售情况及厂家的信誉度来推荐并展示部分商品。
5.用户可以在网站上修改个人资料、密码,查询提交的订单以及查询个人在网站上的消费情况。
6.实现购物车和收银台的功能,用户在选择商品后,在线提交商品订单。
7.以循环滚动的方式显示网站公告的信息。
8.根据商品销售情况进行销售排行。
9.对商品信息进行管理,选择商品类别将商品具体信息和图片信息都存储在数据库中,并且可以修改或者删除商品信息。
10.可以直接查看和查询用户详细信息、用户消费信息。
11.对用户提交的订单,根据情况进行阶段处理。
12.对管理员信息、网站公告信息以及友情链接信息进行管理和维护。
3.2 可行性分析
3.2.1 经济可行性
企业电子商务平台在经济上主要有一下几个突出优势:
1.资金投资少,回收快,而且无所谓存货,所以特别适合小商店和个人在网上创业。
2.销售时间不受限制,无需专人看守,可以实现24小时营业。
3.销售地点不受限制,小商店也可以做出大生意。
4.网上商店人气很旺,赚钱多。网上客流量比较多,只要商品有特色,经营有方,电子商城每天将为企业额外带来成千上万的客流量,大大增加了销售收入。
5.企业无需派业务员到处游说,节省了劳力和财力。
3.2.2 技术可行性
开发一个中小型企业电子商城系统,涉及到的技术问题不会太多,本电子商务平台系统主要用到的技术就是Struts框架。Struts框架是专门开发web应用程序的框架,它是采用Java Servlet和JSP技术来构造MVC模式的Web应用的一种框架,它是由一组相互协作的类、Servlet和JSP标签组成的一个可重用的MVC设计模式。Struts是框架而不是库。
3.3 性能需求
网站每天都必须承载大量的数据访问以及数据处理,为此,服务器必须做到运行高速、24小时无障碍运行、高带宽、稳定。同时尽可能做到WEB服务器与数据库服务器不在一台机器上运行,以保证服务器的负载均衡,避免服务器宕机。
3.4 系统的安全性要求
信息的透明和安全是一对矛盾的两个方面。设备管理系统的安全性设计使得机密的人事信息处在一种“受控”状态下的透明。只有得到系统授权的用户才可以访问被允许获取的信息。因此,不需要担心会因为采用本设备管理系统而降低了设备信息的保密性,相反,信息的安全性会因为本管理系统的采用而得到加强。
用户在使用系统时,为了增加本系统的安全性,首先需要验证用户身份,只有在登录界面上输入正确的用户名和密码才能登陆本系统。
第四章系统概要设计
4.1 系统功能结构
图4.1前台功能结构图
4.2后台功能结构图
4.2系统功能模块设计
设计的系统要求能通过互联网发布电子商务相关信息并能进行网上信息查询和网上交易。其具体功能模块概括如下:
1. 会员管理模块
该模块的功能包括会员注册、会员登录和会员资料的修改。会员只能是通过前台注册,管理员不能添加会员而只能查看会员信息。
2. 图书查询模块
提供给Internet的客户方便以及灵活快速查找所需图书的功能。图书浏览检索功能主要实现图书的分类浏览、关键字检索。需要提供给客户按照书名,作者、查询,另外也可以从销售量排行版查到。
3. 购物车模块
该模块主要提供添加商品至购物车、查看购物车和清空购物车的功能。会员可以任意选择自己喜欢的商品放入购物车,并可以随时查看和删除购物车中的商品。
4.图书管理模块
该模块主要的功能是完成图书信息的录入、修改、删除以及多种方式的查询 ,管理员可以根据商店的实际情况对网上书店里的书籍进行录入、修改、删除等操作。
5. 收银台模块
该模块主要的功能是会员填写订单信息和结账。会员决定要购买时要填写一些基本信息,结账后订单信息会插入到数据库中,管理员可查看到详细地订单信息并决定是否出货。
6. 商城公告管理模块
该模块主要提供商城公告的动态变化的功能,以供会员查看。管理员可以添加公告、删除公告和查询公告。
7. 后台管理模块
该模块主要是实现后台管理员对数据库中基本表的操作。主要的功能有:商品设置、后台管理员设置、会员设置、订单设置、公告设置、友情链接设置和退出后台。
4.3系统的业务流程
为了更清晰地表达系统的业务功能模块,下面给出本电子商务平台的的业务流程图。本系统主要包括面向会员的客户端流程图和面向系统管理员的管理端流程图两部分。
图4.3客户端流程图
图4.4管理端流程图
图4.5 服务台结账流程图
4.4 安全性设计
Internet是个开放的网络,只要将计算机与Internet相连,就可以与世界各地的人和计算机通信,灵活性很强却增加了冒险性,虽然此商城面向所有互联网用户开放,但是用户的权限是有限的.。这就需要在系统中加入防护机制来保护系统不被侵犯,防止无权用户的询问。可以用以下几种方式来建立安全机制:
1.在WWW服务器上建立安全机制:在WWW服务器建立用户名验证机制,限制访问WWW的用户的部分功能匿名访问,使用请求验证方式,在用户访问服务器的同时,提交身份及密码,由服务器在在数据库中验证是否合法,若合法则请求响应,否则拒绝。
2. 明确各用户角色对资源的使用权限。除系统维护员外的各角色用户只能访问与自己相关的功能模块和系统资源。
3. 加密数据库文件。对数据库文件进行加密处理,使非法使用者不能直接查看数据内容。当系统需要使用数据库文件时,先对该数据库文件进行解密后再使用,使用完后,关闭数据库文件,并对其进行加密处理。
4.5数据库设计
本系统的数据结构比较清晰,数据库主要包括五张表:bookInfo(书籍的信息表), bookType(书籍类型表), custom(顾客表), orders(订单表), USERS(用户表) 每张表的表结构如下:
表4.1 bookInfo(书籍的信息表)
序号 列名 数据类型 长度 小数位 标识 主键 允许空 说明
1 bookId int 4 0 是 是 否 不生成ID
2 bookName varchar 200 0 否 书籍名称
3 booktypeId Int 4 0 否 书籍类型id
4 pbName varchar 200 0 否 书籍出版社
5 author varchar 100 0 否 书籍作者
6 context varchar 200 0 是 书籍内容
7 smallImg varchar 200 0 是 书籍小图片
8 bigImg varchar 200 0 是 书籍大图片
9 price money 否 书籍价格
10 pbdate datetime 否 出版日期
11 bookStates Int 4 否 书籍状态
12 bookstoreprice money 4 否 书店的价格
表4.2bookType (书籍的类型表)
序号 列名 数据类型 长度 小数位 标识 主键 允许空 说明
1 bookTypeId int 4 0 是 是 否 自动生成ID
2 parentId Int 4 0 否 书籍类型id
3 bookTypeName varchar 200 0 否 书籍父类型名
4 isdelete Int 4 0 否 书籍是否删除
5 context varchar 200 0 是 书籍内容
表4.3 custom (书籍的顾客表)
序号 列名 数据类型 长度 小数位 标识 主键 允许空 说明
1 orderId int 4 0 是 是 否 订单id自动生成
2 price money 0 否 订单价格
3 name varchar 200 0 是 否 顾客名字
4 tel Int 0 否 顾客电话
5 address varchar 200 0 是 顾客地址
表4.4 orders (书籍的订单表)
序号 列名 数据类型 长度 小数位 标识 主键 允许空 说明
1 bookId int 4 0 是 否 书籍id
2 orderId Int 4 0 否 订单id
3 bookName varchar 200 0 否 书籍名称
4 quantity Int 0 否 订单数量
5 price money 0 是 书籍价格
表4.4 USERS (用户表)
序号 列名 数据类型 长度 小数位 标识 主键 允许空 说明
1 userID int 4 0 是 是 否 用户id
2 status Int 4 0 否 用户身份
3 userName varchar 20 0 否 用户名
4 password varchar 20 0 否 用户密码
图4.6数据库结构图
图4.7数据库bookInfo关系分解图
图4.8数据库bookType关系分解图
图4.9数据库custom关系分解图
图4.10据库orders关系分解图
图4.11库USERS关系分解图
图4.12各个表的关系图
第五章 系统实现
前一章详细说明的系统设计的各个方面,包括总体设计、数据库的设计及主要功能模块的详细设计。本章主要介绍系统实现部分,给出了主要模块功能页面及使用流程说明,最后就系统的相关性能进行了用例测试
5.1系统功能模块的实现
5.1.1系统功能主界面的设计
本电子商务平台的主界面包括以下功能:商品查询、商品展台、购物车、会员注册和登录、收银台结账等。在主界面上可以很直观地看到新上架的商品。系统的主界面如图5.1所示:
图5.1网上书店首页
新书上架的存储过程如下:
CREATE proc [dbo].[proc_hotbookInfo]
@page int ,
@pagenumber int ,
@counter int output,
@pagecount float output
as
select @counter=count(*) from dbo.bookInfo where bookStates=2
set @pagecount=@counter
set @pagecount=ceiling(@pagecount/@pagenumber)
if(@page<=1)
begin
set @page=1
end
if(@page>=@pagecount)begin
set @page=@pagecount
end
select top (@pagenumber) * from dbo.bookInfo
where bookId not in(select top (@pagenumber*(@page-1))
bookId from dbo.bookInfo
where bookStates=2)and bookStates=2
将上架书籍显示的源代码如下:
public List findHotBook(int pagenum,int page){
List<BookInfo> list =new ArrayList<BookInfo>();
getCon();
CallableStatement cs=null;
String sql="exec proc_hotbookInfo ?,?,?,?";
try {
cs=con.prepareCall(sql);
cs.setInt(1, page);
cs.setInt(2, pagenum);
cs.registerOutParameter(3,1);
cs.registerOutParameter(4,1);
rs=cs.executeQuery();
while (rs.next()) {
BookInfo bookInfo =new BookInfo();
bookInfo.setBooktypeId(rs.getInt("booktypeId"));
……
list.add(bookInfo);
}
pagecount=cs.getInt("pagecount");
counter=cs.getInt("counter");
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
5.1.2后台系统管理模块设计
网上书店登陆界面如下:
图5.2网上书店后台登录页面
输入用户名“admin”和密码“admin”后再登录即可进入到后台,如图5.3所示:
图5.3 后台管理主界面
登录到后台的用户验证源码如下:
public Users findUsers(String userName) {
getCon();
String sql = "select * from USERS where userName=?";
String[] param = { userName };
executeSQL(sql, param);
try {
while (rs.next()) {
Users users = new Users();
users.setPassword(rs.getString("password"));
users.setStatus(rs.getInt("status"));
users.setUserID(rs.getInt("userID"));
users.setUserName(userName);
return users;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeAll();
}
return null;
}
Login.jsp页面得到用户名密码,然后再转发到doLogin.jsp页面进行验证,如果是管理员,就转发到后台的index.jsp页面
<% String uname="";
String upassword="";
request.setCharacterEncoding("UTF-8");
request.removeAttribute("str");
if (request.getParameter("uname")!= null||!"".equals(request.getParameter("uname"))) {
UserDao userDao = new UserDao();
uname = request.getParameter("uname");
Users users = userDao.findUsers(uname);
if (users != null) {
if (request.getParameter("upass") != null||!"".equals(request.getParameter("upass"))) {
upassword = users.getPassword();
String upass = request.getParameter("upass");
if (upassword.equals(upass)) {
if(request.getParameter("valide").equals(session.getAttribute("rand"))){
String valide=request.getParameter("valide");
session.setAttribute("USER_LOGIN", users);
if (users.getStatus() == 1) {
request.getRequestDispatcher("admin/index.jsp").forward(request, response);
} else {
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}else{
String valide=request.getParameter("valide");
request.getRequestDispatcher("Login.jsp").forward(request, response);
}
} else {
request.getRequestDispatcher("Login.jsp").forward(request, response);
}
} else {
request.getRequestDispatcher("Login.jsp").forward(request, response);
}
} else {
request.getRequestDispatcher("regedit.jsp").forward(request, response);
}
} else {
request.getRequestDispatcher("regedit.jsp").forward(request,response);
}
%>
单击图5.3中的“用户管理”按钮并且点击子菜单下的“用户管理”按钮,则可以转到下面的页面,如图5.4所示。
图5.4 后台用户信息页面
用户管理页面的存储过程如下:
CREATE proc [dbo].[proc_bookUser]
@page int ,
@pagenumber int ,
@counter int output,
@pagecount float output
as
select @counter=count(*) from dbo.USERS
set @pagecount=@counter
set @pagecount=ceiling(@pagecount/@pagenumber)
if(@page<=1)
begin
set @page=1
end
if(@page>=@pagecount)begin
set @page=@pagecount
end
select top (@pagenumber) * from dbo.USERS where userID not in(select top (@pagenumber*(@page-1)) userID from dbo.USERS)
用户管理的源代码如下:
public List findUserList(int pagenum, int page) {
List<Users> list = new ArrayList<Users>();
getCon();
CallableStatement cs = null;
String sql = "exec proc_bookUser ?,?,?,?";
try {
cs = con.prepareCall(sql);
cs.setInt(1, page);
cs.setInt(2, pagenum);
cs.registerOutParameter(3, 1);
cs.registerOutParameter(4, 1);
rs = cs.executeQuery();
while (rs.next()) {
Users users = new Users();
users.setPassword(rs.getString("password"));
users.setStatus(rs.getInt("status"));
users.setUserID(rs.getInt("userID"));
users.setUserName(rs.getString("userName"));
list.add(users);
}
pagecount = cs.getInt("pagecount");
counter = cs.getInt("counter");
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
单击图5.3中的“用户管理”按钮并且点击子菜单下的“添加用户”按钮,则可以转到下面的页面,如图5.5所示。
图5.5 后台添加用户信息页面
添加用户信息的源代码如下:
public int findMaxId() {
getCon();
int a = 0;
String sql = "select max(userID) from dbo.USERS";
executeSQL(sql, null);
try {
while (rs.next()) {
a = rs.getInt(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
closeAll();
}
return a;
}
public int insertUser(Users users) {
int id=findMaxId();
getCon();
String sql = "insert into USERS(userID,userName,password,status)values(?,?,?,?)";
String[] param = {Integer.toString(id+1) ,users.getUserName(), users.getPassword(),
Integer.toString(users.getStatus()) };
int row = executeSQL(sql, param);
closeAll();
return row;
}
单击图5.3中的“图书管理”按钮并且点击子菜单下的“添加图书”按钮,则可以转到下面的页面,如图5.6所示。
图5.6 后台添加图书信息页面
添加书籍的源代码如下:
public int findMaxId(){
getCon();
String sql="select max(bookId)from dbo.bookInfo";
executeSQL(sql, null);
try {
while(rs.next()){
maxid=rs.getInt(1);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return maxid;
}
public int insertBook(BookInfo bookInfo){
int row=0;
int bookId=findMaxId();
bookId=bookId+1;
getCon();
String sql="insert into bookInfo(bookId,bookName,booktypeId,pbName,author,context,smallImg,bigImg,price,pbdate,bookStates,bookstoreprice) values(?,?,?,?,?,?,?,?,?,'',?,?)";
String[]param={Integer.toString(bookId),bookInfo.getBookName(),Integer.toString(bookInfo.getBooktypeId()),bookInfo.getPbName(),bookInfo.getAuthor(),bookInfo.getContext(),bookInfo.getSmallImg(),bookInfo.getBigImg(),Double.toString(bookInfo.getPrice()),Integer.toString(bookInfo.getBookStates()),Double.toString(bookInfo.getBookstoreprice())};
row=executeSQL(sql, param);
closeAll();
return row;
}
单击图5.3中的“图书管理”按钮并且点击子菜单下的“图书管理”按钮,则可以转到下面的页面,如图5.7所示。
图5.7 后台图书信息页面
书籍展示页面的存储过程如下:
CREATE proc [dbo].[proc_bookInfo]
@page int ,
@pagenumber int ,
@counter int output,
@pagecount float output
as
select @counter=count(*) from dbo.bookInfo
set @pagecount=@counter
set @pagecount=ceiling(@pagecount/@pagenumber)
if(@page<=1)
begin
set @page=1
end
if(@page>=@pagecount)begin
set @page=@pagecount
end
select top (@pagenumber) * from dbo.bookInfo where bookId not in(select top (@pagenumber*(@page-1)) bookId from dbo.bookInfo)
书籍展示的源代码如下:
public List findAllBooks(int pagenum,int page){
List<BookInfo> list =new ArrayList<BookInfo>();
getCon();
CallableStatement cs=null;
String sql="exec proc_bookInfo ?,?,?,?";
try {
cs=con.prepareCall(sql);
cs.setInt(1, page);
cs.setInt(2, pagenum);
cs.registerOutParameter(3,1);
cs.registerOutParameter(4,1);
rs=cs.executeQuery();
while (rs.next()) {
BookInfo bookInfo =new BookInfo();
bookInfo.setBooktypeId(rs.getInt("booktypeId"));
……
list.add(bookInfo);
}
pagecount=cs.getInt("pagecount");
counter=cs.getInt("counter");
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
单击图5.3中的“上架管理”按钮并且点击子菜单下的“图书上架”,则可以转到下面的页面,如图5.8所示。
图5.8 后台非上架图书信息页面
后台费上架图书的存储过程如下:
CREATE proc [dbo].[proc_hotbookInfoshangjia]
@page int ,
@pagenumber int ,
@counter int output,
@pagecount float output
as
select @counter=count(*) from dbo.bookInfo where bookStates!=2
set @pagecount=@counter
set @pagecount=ceiling(@pagecount/@pagenumber)
if(@page<=1)
begin
set @page=1
end
if(@page>=@pagecount)begin
set @page=@pagecount
end
select top (@pagenumber) * from dbo.bookInfo where bookId not in(select top (@pagenumber*(@page-1)) bookId from dbo.bookInfo where bookStates!=2)and bookStates!=2
后台非上架图书的源代码如下:
public List findHotBook(int pagenum,int page){
List<BookInfo> list =new ArrayList<BookInfo>();
getCon();
CallableStatement cs=null;
String sql="exec proc_hotbookInfo ?,?,?,?";
try {
cs=con.prepareCall(sql);
cs.setInt(1, page);
cs.setInt(2, pagenum);
cs.registerOutParameter(3,1);
cs.registerOutParameter(4,1);
rs=cs.executeQuery();
while (rs.next()) {
BookInfo bookInfo =new BookInfo();
bookInfo.setBooktypeId(rs.getInt("booktypeId"));
bookInfo.setAuthor(rs.getString("author"));
bookInfo.setBigImg(rs.getString("bigImg"));
bookInfo.setBookId((Integer.parseInt(rs.getString("bookId"))));
bookInfo.setBookName(rs.getString("bookName"));
bookInfo.setBookStates((Integer.parseInt(rs.getString("bookStates"))));
bookInfo.setBookstoreprice(rs.getDouble("bookstoreprice"));
bookInfo.setContext(rs.getString("context"));
……
list.add(bookInfo);
}
pagecount=cs.getInt("pagecount");
counter=cs.getInt("counter");
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
单击图5.3中的“上架管理”按钮并且点击子菜单下的“上架的图书”,则可以转到下面的页面,如图5.9所示。
图5.9 后台图书上架信息页面
后台图书上架存储过程源代码如下:
CREATE proc [dbo].[proc_hotbookInfoshangjia]
@page int ,
@pagenumber int ,
@counter int output,
@pagecount float output
as
select @counter=count(*) from dbo.bookInfo where bookStates!=2
set @pagecount=@counter
set @pagecount=ceiling(@pagecount/@pagenumber)
if(@page<=1)
begin
set @page=1
end
if(@page>=@pagecount)begin
set @page=@pagecount
end
select top (@pagenumber) * from dbo.bookInfo where bookId not in(select top (@pagenumber*(@page-1)) bookId from dbo.bookInfo where bookStates!=2)and bookStates!=2
源代码如下:
public List findAllBooksShangJia(int pagenum,int page){
List<BookInfo> list =new ArrayList<BookInfo>();
getCon();
CallableStatement cs=null;
String sql="exec proc_hotbookInfoshangjia ?,?,?,?";
try {
cs=con.prepareCall(sql);
cs.setInt(1, page);
cs.setInt(2, pagenum);
cs.registerOutParameter(3,1);
cs.registerOutParameter(4,1);
rs=cs.executeQuery();
while (rs.next()) {
BookInfo bookInfo =new BookInfo();
bookInfo.setBooktypeId(rs.getInt("booktypeId"));
……
list.add(bookInfo);
}
pagecount=cs.getInt("pagecount");
counter=cs.getInt("counter");
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
单击图5.3中的“订单管理”按钮并且点击子菜单下的“订单管理”,则可以转到下面的页面,如图5.10所示。
图5.10 后台图书订单信息页面
订单页面的存储过程如下:
CREATE proc [dbo].[proc_Order]
@page int ,
@pagenumber int ,
@counter int output,
@pagecount float output
as
select @counter=count(*) from dbo.orders
set @pagecount=@counter
set @pagecount=ceiling(@pagecount/@pagenumber)
if(@page<=1)
begin
set @page=1
end
if(@page>=@pagecount)begin
set @page=@pagecount
end
select top (@pagenumber) * from dbo.orders where orders.orderId not in(select top (@pagenumber*(@page-1)) orders.orderId from dbo.orders)
源代码如下:
public List findAll(int pagenum,int page){
List<Order> list =new ArrayList<Order>();
getCon();
CallableStatement cs=null;
String sql="exec proc_Order ?,?,?,?";
try {
cs=con.prepareCall(sql);
cs.setInt(1, page);
cs.setInt(2, pagenum);
cs.registerOutParameter(3,1);
cs.registerOutParameter(4,1);
rs=cs.executeQuery();
while (rs.next()) {
Order order=new Order();
order.setOrderId(rs.getInt("orderId"));
……
list.add(order);
}
pagecount=cs.getInt("pagecount");
counter=cs.getInt("counter");
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
查询顾客信息:
public Custom findCustom(int orderId){
getCon();
String sql="select * from custom where orderId="+orderId;
executeSQL(sql, null);
try {
while(rs.next()){
Custom custom=new Custom();
custom.setAddress(rs.getString("address"));
……
return custom;
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
closeAll();
}
return null;
}
单击图5.3中的“查询”按钮并且点击子菜单下的“模糊查询”,则可以转到下面的页面,如图5.11所示。
图5.11 后台图书查询页面
模糊查询存储过程如下:
CREATE proc [dbo].[proc_doFindbooks]
@page int ,
@pagenumber int ,
@dolikes varchar(200),
@counter int output,
@pagecount float output
as
select @counter=count(*) from dbo.bookInfo
set @pagecount=@counter
set @pagecount=ceiling(@pagecount/@pagenumber)
if(@page<=1)
begin
set @page=1
end
if(@page>=@pagecount)begin
set @page=@pagecount
end
select top (@pagenumber) * from dbo.bookInfo where bookId not in(select top (@pagenumber*(@page-1)) bookId from dbo.bookInfo where bookName like '%'+@dolikes+'%' or bookId like '%'+@dolikes+'%' or booktypeId like '%'+@dolikes+'%') and(bookName like '%'+@dolikes+'%' or bookId like '%'+@dolikes+'%' or booktypeId like '%'+@dolikes+'%')
源代码如下:
public List doFindBooks(int pagenum,int page,String str){
List<BookInfo> list =new ArrayList<BookInfo>();
getCon();
CallableStatement cs=null;
String sql="exec proc_doFindbooks ?,?,?,?,?";
try {
cs=con.prepareCall(sql);
cs.setInt(1, page);
cs.setInt(2, pagenum);
cs.setString(3, str);
cs.registerOutParameter(4,1);
cs.registerOutParameter(5,1);
rs=cs.executeQuery();
while (rs.next()) {
BookInfo bookInfo =new BookInfo();
bookInfo.setBooktypeId(rs.getInt("booktypeId"));
……
list.add(bookInfo);
}
pagecount=cs.getInt("pagecount");
counter=cs.getInt("counter");
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
如果您要修改用户:如图5.4 点击修改即可进入5.12所示的界面:
图5.12 后台用户信息修改页面
修改用户源代码如下:
public int updateUser(int userId, Users users) {
getCon();
String sql = "update USERS set userName=? , password=? , status=? where userID="
+ userId;
String[] param = { users.getUserName(), users.getPassword(),
Integer.toString(users.getStatus()) };
int row = executeSQL(sql, param);
closeAll();
return row;
}
如果你要删除用户,在图5.4中点击删除即可:
删除的源代码如下:
public int deleteUsers(int userId) {
getCon();
String sql = "delete USERS where userID=" + userId;
Users users = findUserById(userId);
if (users.getStatus() != 1) {
row = executeSQL(sql, null);
} else {
System.out.println("bbbbb");
}
closeAll();
return row;
}
如果你要修改图书信息,在图5.7中点击修改即可,界面如图5.13
图5.13 后台图书修改页面
源代码如下:
public int updataBookInfo(int bookId,BookInfo bookInfo){
getCon();
String sql="update bookInfo set bookName=? ,booktypeId=? ,pbName=? ,author=? ,context=? ,smallImg=? ,bigImg=? ,price=? ,pbdate=? ,bookStates=? ,bookstoreprice=? where bookId="+bookId;
String param[]={bookInfo.getBookName(),Integer.toString(bookInfo.getBooktypeId()),bookInfo.getPbName(),bookInfo.getAuthor(),bookInfo.getContext(),bookInfo.getSmallImg(),bookInfo.getBigImg(),String.valueOf(bookInfo.getPrice()),bookInfo.getPbdate(),Integer.toString(bookInfo.getBookStates()),String.valueOf(bookInfo.getBookstoreprice())};
row=executeSQL(sql, param);
closeAll();
return row;
}
如果要删除图书信息点击图5.7中删除即可
源代码如下:
public int deleteBookInfo(int bookId){
getCon();
String sql="delete bookInfo where bookId="+bookId;
row=executeSQL(sql, null);
closeAll();
return row;
}
如果要修改上架的图书信息点击图5.9中的修改界面如图5.14所示
图5.14 后台上架的图书修改页面
如果要上架图书点击图5.9中的上架即可
源代码如下:
public int updatehot(int bookId ,int bookStates ){
getCon();
String sql="update bookInfo set bookStates=? where bookId=?";
switch (bookStates) {
case 1:
bookStates=1;
break;
case 2:
bookStates=2;
break;
case 3:
bookStates=3;
break;
default:
bookStates=1;
break;
}
String param[]={Integer.toString(bookStates),Integer.toString(bookId)};
row=executeSQL(sql, param);
closeAll();
return row;
}
如果你点击上架图书中的修改的话界面如图5.13所示代码也是相同的
如果你要删除订单,选择图5.10所示的删除即可:
代码如下:
public int deleteOrder(int orderId){
getCon();
String sql="delete orders where orderId="+orderId;
int row=executeSQL(sql, null);
closeAll();
return row;
}
5.1.3核心代码分析
1.连接数据库关闭数据库代码:
public static final String URL="jdbc:sqlserver://localhost:1433; DatabaseName=storebook";
public static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public static final String USER="sa";
public static final String PWD="2113413";
public PreparedStatement ps=null;
public Connection con=null;
public ResultSet rs=null;
public CallableStatement cs=null;
public Connection getCon(){
try {
Class.forName(DRIVER);
con=DriverManager.getConnection(URL,USER,PWD);
System.out.println("连接数据库");
} catch (Exception e) {
System.out.println("连接数据库出错!");
e.printStackTrace();
}
return con;
}
public void closeAll(){
if(rs!=null){try {rs.close();} catch (SQLException e){e.printStackTrace();}}
if(cs!=null){try {cs.close();} catch (SQLException e){e.printStackTrace();}}
if(ps!=null){try {ps.close();} catch (SQLException e){e.printStackTrace();}}
if(con!=null){try {con.close();} catch (SQLException e){e.printStackTrace();}}
System.out.println("关闭数据库");
}
2.处理jsp中的中文乱码解决方案:
2.1:request.setCharacterEncoding("UTF-8");
2.2:String ***=new String(request.getParamter(“”).getBytes(“ISO-8859-1”),”UTF-8”);
2.3:respons.setCharacterEncoding(“text/html;charset=UTF-8”);
UTF-8的编码格式支持中文和英文,是国际编码,所以这里我采用的是Utf-8的编码格式.
3.图片验证码:
<%!
Color getRandColor(int cc,int bb)
{
Random random = new Random();
if(cc>255) cc=255;
if(bb>255) bb=255;
int r=cc+random.nextInt(bb-cc);
int g=cc+random.nextInt(bb-cc);
int b=cc+random.nextInt(bb-cc);
return new Color(r,g,b);
} //获取随机颜色
%>
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int width=70; //定义验证码图片的长度
int height=30; //定义验证码图片的宽度
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//定义字体形式
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int i_x = random.nextInt(width);
int i_y = random.nextInt(height);
int i_xl = random.nextInt(12);
int i_yl = random.nextInt(12);
g.drawLine(i_x,i_y,i_x+i_xl,i_y+i_yl);
}
//用线条画背景
String s_Rand="";
for (int i=0;i<4;i++)
{
String rand=String.valueOf(random.nextInt(10));
s_Rand+=rand;
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(rand,13*i+6,16);
}
//产生4位随机码
session.setAttribute("rand",s_Rand);
//将验证码存入Session中
g.dispose();
ImageIO.write(image, "JPEG", response.getOutputStream());
//输出验证图片
out.clear();
out = pageContext.pushBody();
%>
4.购物车代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session =request.getSession(false);
Map<String ,CartItemBean> cart= (Map<String ,CartItemBean>)session.getAttribute("cart");
if(cart==null){
cart=new HashMap<String, CartItemBean>();
session.setAttribute("cart", cart);
}
if(session.getAttribute("bookInfo")==null){
request.getRequestDispatcher("/order.jsp").forward(request, response);
return;
}
BookInfo bookInfo=(BookInfo)session.getAttribute("bookInfo");
CartItemBean cartItemBean =(CartItemBean)cart.get(Integer.toString(bookInfo.getBookId()));
if(cartItemBean!=null){
cartItemBean.setQuantity(cartItemBean.getQuantity()+1);
} else{
System.out.println("kongde !");
cart.put(Integer.toString(bookInfo.getBookId()), new CartItemBean(bookInfo,1));
}
request.getRequestDispatcher("/order.jsp").forward(request, response);
}
上来就先判断有没有购物车,没有就创建一个,并且存入session中,session中存的是个map集合对象,如果把详细页中的session放入map中,然后把map的键设置成该书籍的ID,然后,把map放进购物车,如果,购物车中有书籍,就把该书籍的数量加1,如果不存在,就书籍数量就设置成1.
5.购物车servlet的配置:
在web.xml中
<servlet>
<servlet-name>AddBookToCart</servlet-name>
<servlet-class>servlet.AddBookToCart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddBookToCart</servlet-name>
<url-pattern>/AddBookToCart</url-pattern>
</servlet-mapping>
5.2系统性能测试
系统测试是系统开发周期中一个十分重要而漫长的阶段。其重要性体现在它是保证系统质量与可靠性的最后关口,是对整个系统开发过程包括系统分析,系统设计和系统实现的最终审查。系统测试的对象不仅仅是源程序,而应是整个系统,它把需求分析,概要设计,详细设计以及程序设计各阶段的开发文档,包括需求规格说明,概要设计说明,详细设计说明以及源程序,都作为测试的对象。测试的目的就是发现系统的错误
5.2.1测试环境
本机器配置如下:
软件配置为:
安装了jdk1.6.0;
安装了MyEclipse5.5;
安装了Tomcat6.0;
安装了Microsoft SQL SERVER 2005;
安装了 Adobe Dreamweaver 8;
5.2.2测试方法和策略
对本网站后台的测试主要是采用“黑盒测试”的方法来进行测试的。黑盒测试又称为功能测试、数据驱动测试等,它将待测试对象看成是一个黑盒子,不考虑程序内部的逻辑结构和特性,只依据规格说明书检查程序的功能是否能正常使用。
黑盒测试常用来发现以下类型的错误:
1.功能错误:表现在功能不正确、功能遗漏或实现了不该实现的功能等。
2.接口错误:表现在不能正确地接受信息或输出信息。
3.数据错误:表现在数据结构错误或外部信息(如数据文件)访问错误。
4.性能错误:表现在性能需求得不到满足。
5.初始化或终止错误:表现在不能进行正确地初始化或终止。
所以,用黑盒测试发现程序中的错误,主要根据输入条件和输出条件确定测试数据,来检查程序是否能产生正确的输出。
5.2.3测试用例设计(后台)
登陆测试:
如果用户名不存在,跳转到注册页面,如果密码错误,跳转到登陆页面,如果验证码不对,也是跳转到登陆页面,如果用户身份为1 ,跳转到后台首页,不为1,跳转到前台首页.
表单测试:
这里只对表单的非空进行了判断.
5.2.4测试结论
对以上用例进行测试,系统运行良好,并有一定的冗错性,即当用户对系统进行了非法操作后,系统能自动给予相应的错误处理方法,并能友好的对用户进行提示;系统的安全性也有比较好,会员和管理员都只能在自己的权限范围内操作,不能越权操作;另外系统的界面较为简洁,用户操作起来也很方便。整个后台管理经过严格的测试过后,都没有出现问题,因此,整个后台的功能都能按照要求完成。
结束语
这次毕业设计我做的是网上书店设计(后台设计),主要采用的是MVC模式。这几个月的时间里面,我在陈老师的悉心指导和帮助下,最终顺利完成了此次毕业设计。
本网上书店站能够完成网上购物的所有基本功能。为用户提供了商品展台、商城公告和网上交易等等功能,使用起来也十分简单方便。当然,本网站也有不足之处,由于时间紧迫,未能实现搜索商品的功能,根据用户输入的关键字搜索罗列出本网站的相关商品。
这段时间了我从图书馆和同学那里借了一些相关的书籍看,有关于Java三大框架的,有jsp和servlet的等等。自己还在网上找了一些电子书看,使得我对这方面的知识都有个大致的了解,然后通过看自己在学习的jsp,我对MVC模式的原理有了很熟悉了解,为后面的开发作了技术上的储备。
当然,不能只有技术准备,要开发一个项目,必须得先把整个项目的需求给弄好了,写好详细的需求分析说明书。我做的这个网上书店是b2c的,也就是企业和消费者之间的,因此,企业必须尽量提供消费者的所有日常用品和优质服务,并且开发出的网站使用起来必须得很方便。
每当程序遇到问题时,一定要静下心来去找错误。首先要分清楚是哪种错误,是数据库连接有问题呢,还是程序里面的语法错误和逻辑错误呢,或是部署的问题呢等等。对于不同的错误的快速定类,有助于快速解决,若是连接数据库出错,则必须检查数据源是否配置好,连接数据库的语句是否正确等。有些细节也必须注意,比如空格的问题,可能会导致登录失败,所以比较两个字符串时最好先将它们的空格去掉。因此,调试程序时一定要有耐心。
通过这次毕业设计,我学到了许多东西。不仅学会了jsp等技术知识,还学会了与别人合作。与同学的交流,帮了我不少忙,让我少走了弯路。不论是在以后的学习和工作中,我都一定会继续努力,以提升自己各方面的水平。
参考文献
[1]符绍宏主编,《因特网信息资源检索与利用》第二版[M] 北京:清华大学出版社 2005
[2]杨占胜主编,JSP Web应用程序开发程序[M] 西北工业大学出版社 2010
[3]李忠伟,刘健 编著,JSP动态网页设计技术教程 [M] 科学出版社 2009
[4]刘培文,耿小芬 主编,SQL Server 2000数据库原理与应用教程[M] 中国人民大学出版社 2009
[5]Shapiro, C.,Varian, H. R. Information Rules:A Strategic Guide to The Network Economy. [M] Boston:Harvard Business School Press, 1998
[6]Linden J. C.,Cantrell,S. Changing Business Models:Surveying the Landscape, [M] Institute for Strategic Change,Accenture, 2001
[7]Mahadevan, B. Business Models for Internet-based e-Commerce:An anatomy. [M] California Management Review. 2000
[8]李卫宁,蓝海林,电子商务时代的竞争结构分析[J].山西大学学报(哲学社会科学版),2001(1) :43-46
[9]李贤华. 基于JSP技术的大型网上购物系统的设计与实现 [J]. 计算机与现代化.2008(8):82-84,89.
[10]何静, 谭新民. 基于J2EE的网上购物系统的设计 [J]. 山西电子技术.2008(1):66-68.
[11]廖彦华, 罗小亮. 基于JSP技术的网上购物系统 [J]. 电脑知识与技术:学术交流.2007(12):1276-1279.
谢 辞
本文从选题到定稿,历时近半年。从收集资料到写成初稿,再到最后定稿,
得到了导师陈也平副教授的热情鼓励和悉心指导。
陈也平副老师严谨求实的学术态度、精益求精的学术风范以及坦诚的教诲使我受益匪浅,并将是我不断学习的榜样。
开发网上书店系统的过程中,同学和朋友给了我很大的帮助和支持,对此也表示衷心的感谢!
在完成论文的过程中,还得到了我的家人的全力支持与关心,在此也一并献
上我最真诚地感谢!
最后,再次向所有给予我支持和帮助的所有老师和同学表示最诚挚的谢意!