网上商城系统

网上商城系统

摘   要

目前,人们的购物方式已经变得多种多样,在现实中的商场、超市、各种店铺,还有就是在网上购物。网络购物作为一种新的购物形式被广大群众所接受,尤其是年轻群体。

因此本文的主要研究对象就是网上商城系统,研究网上商城一般的业务流程,还有网上商城的结构和模块,各个模块的功能等等。整个论文从如何来分析一个网上商城系统的业务流程和它的结构以及模块,再到到对开发工具的选择,以及对前面分析出来的结果进行初步的设计(这里我设计的是使用Java的web开发技术来实现这个网上商城系统),对网上商城系统分析和设计完成之后,就进入到实际的代码编写阶段,在这个阶段就可能对前面的设计进行一定的修改或是完善。在开发阶段,我将采用的是螺旋递增式的开发,每次只完成一部分功能,然后就立即对这些功能进行测试,接着进入下一个开发阶段,然后继续测试,直到所有的功能全部实现后,再对整个系统进行一个完整的测试,看其是否达到了先前的设计要求。

综上所述,本文讨论的就是如何使用Java的web开发技术来完整的实现一个网上商城系统的主要功能。

关键词  网上商城;Java;Web开发

Online Shopping Mall System

Abstract

At present, people's shopping patterns have become diverse, in reality shopping malls, supermarkets, various shops, and the online shopping. Online shopping as a new form of shopping has been accepted by the masses, especially in younger age groups.

So in this paper we will discuss the Online Shopping Mall, study the general business processes of online shopping mall, and the Online Shopping Mall's structure and modules, the functions of each module, and so on. This paper start from how to analysis a Online Shopping Mall’s business process and it’s structure, then we go to choose development tools, next I will make a preliminary design (here I designed to use the java web technology to achieve this Online Shopping Mall), all this done, then we go to type the code, in development stage I use the Increasing spiral development model, it just completed a part of the function, then I will test this part, then a other part, step by step, until all the Online Shopping Mall be complete, after this I will do a complete test for the whole system, to check if it meets the design requirements previously.

So in this paper, we discuss how to use java web technology to build a Online Shopping Mall.

Keywords  Online Shopping Mall; Java; Web Development

目   录

摘要…… I

Abstract II

第1章 绪论

1.1 选题目的和意义

1.2 论文研究内容

1.3 什么是网上商城

1.4 网上商城的分类

第2章 网上商城系统的需求分析

2.1 网上商城业务流程分析

2.1.1 作为一名消费者的使用流程

2.1.2 作为一名商城管理员的使用流程

2.2 网上商城模块分析

2.2.1 用户模块分析

2.2.2 管理员模块分析

2.3 本章小结

第3章 网上商城系统的设计与实现

3.1 开发语言和工具介绍

3.1.1 开发语言介绍

3.1.2 数据库介绍

3.1.3 服务器介绍

3.1.4 开发工具介绍

3.2 业务逻辑设计

3.2.1 基础共用类和相应方法

3.2.2 用户实体类和相应方法

3.2.3 管理员实体类和相应方法

3.2.4 商品类别类和相应方法

3.2.5 商品类及其相应管理方法

3.2.6 购物车类及其方法

3.2.7 订单类及其方法

3.3 数据库设计

3.3.1 数据库设计简要介绍

3.3.2 数据库具体设计

3.4 本章小结

第4章 系统的测试和分析

4.1 V0.1版本

4.2 V0.2版本

4.3 V0.3版本

4.4 V0.4版本

4.5 V0.5版本

4.6 V0.6版本

4.7 V0.7版本

4.8 V0.8版本

4.9 V0.9版本

4.10 V1.0版本

4.11 本章小结

    

    

参考文献

    

  1. 绪论
    1. 选题目的和意义

对于网上商城来说,我想每个人都不陌生,即使你没有亲自在网上买过东西也一定见过、听说过网上购物这种方式。网络购物作为一种新的购物形式已经被广大群众所接受,尤其是年轻群体,他们特别热衷于网购。

网购最大的优势就是东西要比现实中商场里的商品便宜,而且一般都是送货上门,因为网购一般都是采取快递送货方式,直接送到你家楼下或者公司里,因此网络购物的第二大优势就是其便利性,用户只要坐在电脑前,点点鼠标就可以买东西了。当然网购也有它的缺点,比如无法见到实物,只能通过商家介绍的文字和图片来了解商品,再比如买衣服无法试穿,而且这也为不良商家提供了忽悠消费者的方法,他们会尽力美化自己的商品来诱惑消费者买单,而消费者收到商品后才发现和想象中的差异很大,而商家又以各种各样的理由推脱,而且由于采用网上交易,所以会存在安全问题。但是这些都不能挡住网购的魅力,网上购物现在正变得越来越流行,市场份额也变得越来越大。因此这次毕业设计题目就以目前现有的网上商城系统为研究对象,例如淘宝和当当,这里主要研究后者的形式,也就是商城自己经营的方式,研究一般的网上商城的业务流程,猜测其各个功能模块及其组合、连接方式,并分析其具体的实现方式,最后使用Java加web服务器和数据库完成一个网上商城系统的主要功能模块。

通过这样一个毕业设计,可以提高自己Java编程的水准,也练习了怎样构建一个完整的系统,从系统的需求分析到设计,直至编码、测试并运行,熟悉并掌握一个完整的Web开发流程,为今后工作打下基础。

    1. 论文研究内容

网上商城是一个基于Internet的应用,属于B/S架构,前端就是一个客户浏览器,客户需要通过浏览器来访问服务器,因此,本文主要研究的就是一个网上商城系统(商城自负经营的类型)的业务流程及其实现方式。

首先,需要站在使用者的角度去思考你究竟会怎么使用这个系统,而一个网上商城的使用者一般又有两类,一类是普通消费者,而另一类则是商城的管理员,因此我就需要思考这两类人都会怎么来是使用这个系统,这样就能分析出网上商城系统的业务流程。

而实现这个业务流程可以采用很多种不同的方法,很明显,网上商城系统是一个基于Internet的应用,因此就需要使用到Web开发的方法,目前Web开发的方法有很多,流行的有Java和.Net,这里我选择了Java,因此我就需要研究如果采用Java作为编程语言,我应当如何来实现这个系统,这个系统应该划分为多少个模块,每个模块的功能又是什么,他们之间如何组合到一起,这也就是系统的设计。

而到了实际的代码开发阶段,也会碰到一些各种各样的问题,这也需要思考并解决。因此,本文的研究内容囊括了系统的分析、设计和编码,是在研究一个完整的Web开发流程。

    1. 什么是网上商城 

为了正确的开发一个系统,你首先就需要全面的了解一个系统,它究竟是个什么东西,它为什么要这个样子,因此在这里就介绍什么是网上商城。

网上商城类似于现实世界当中的商店,差别是利用电子商务的各种手段,达成从买到卖的过程的虚拟商店,从而减少中间环节,消除运输成本和代理中间的差价,造就对普通消费,和加大市场流通带来巨大的发展空间[1]。尽能的还消费者以利益,带动公司发展和企业腾飞,引导国民经济稳定快速发展,推动国内生产总值。

网上商城的出现一是因为技术的进步,Internet愈发发达,现在全世界都在使用Internet,而基于Internet的应用也越来越多;再就是人们思维方式的转变,不再拘泥于现实中的世界,喜欢畅游在虚拟的世界中,在网上交友,聊天,因此在网上购物也就诞生了,到了今天网上购物也变得越来越流行,市场份额也逐渐扩大。网上商城是在为个人用户和企业用户提供人性化的全方位服务,努力为用户创造亲切、轻松和愉悦的购物环境,不断丰富产品结构,最大化地满足消费者日趋多样的购物需求,并凭借更具竞争力的价格和逐渐完善的物流配送体系等各项优势,赢得市场占有率多年稳居行业首位的骄人成绩,也是时代发展的趋势。

当然,一种事物的出现必然伴随着它的两面性,它有它的优点,也有缺点,而网上商城的优点就是便宜,再就是便利性。在网上买东西一般都会比现实中的便宜一些,因此就吸引了很多的消费者购买;再者,网购一般都是快递送货,直接送到家门口或者公司里,这就使许多不愿意或者懒得逛街的人们提供了方便,坐在电脑前,只要点点鼠标就能买东西。而网上商城的缺点也是显而易见的,最大的缺点就是你无法见到实物,你对商品的了解仅能通过商家的文字和图片介绍,因此,在网上买的东西拿回来之后就有可能发现与想象中的相差很大,尤其是衣服,你无法试穿,买回来可能就不合适,其颜色、质地也可能有较大出入,而商家通常拒绝更换和退掉因为颜色和质地与想象不同的东西,而且网上还有很多假货,看上去很便宜,但是买回来却发现上当受骗;再就是网上交易存在风险,你的银行账号和密码有可能被不法分子盗取,你的个人信息也可能泄露,给你的工作和生活带来不便,因此网购时要注意保护你的密码和个人信息。

    1. 网上商城的分类

网上商城主要有三大类: B2B(Business To Business, 商家对商家)、B2CBusiness To Customer商家对顾客直销和C2CCustomer to Customer客户和客户),还有就是G2C(Government to Citizen)其功能不尽相同。

B2B的典型代表有阿里巴巴,中国制造网,主要是从事批发业务;B2C的典型代表有当当网,卓越,八点商城,问学商城,主要是从事零售业务;C2C的典型代表有淘宝、易趣、拍拍、百度有啊。G2C:G2C电子政务是指政Government与公众Citizen之间的电子政务。是政府通过电子网络系统为公民提供各种服务。G2C电子政务所包含的内容十分广泛,主要的应用包括:公众信息服务、电子身份认证、电子税务、电子社会保障服务、电子民主管理、电子医疗服务、电子就业服务、电子教育、培训服务、电子交通管理等。G2C电子政务的目的是除了政府给公众提供方便、快捷、高质量的服务外,更重要的是可以开辟公众参政、议政的渠道,畅通公众的利益表达机制,建立政府与公众的良性互动平台。而在这里,主要研究的是B2CBusiness To Customer商家对顾客直销方式。

  1. 网上商城系统的需求分析
    1. 网上商城业务流程分析

开发一个项目,不管你采用什么实现方式,其实都是在完成其业务流程,因此,将一个系统的业务流程分析清楚,将为后面的开发提供极大的便利。由于本文选择了B2CBusiness To Customer商家对顾客直销模式,所以之后的分析或讨论均是针对此种模式。

如何对一个系统进行分析有很多的方法,这里我采用了站在具体的使用者的角度来考虑这个网上商城系统的功能和结构,先是粗略的分析一下使用的流程,在这个过程中就能够发现一些必须的基础的类。

      1. 作为一名消费者的使用流程

如果一个消费者第一次来到一个网络商城,他一般会先浏览浏览商品,看看他是否喜欢这个商城,因此,目前的网上商城大多在首页就会显示商品,用户也不需要登录就可以查看。

接下来如果他对这个商城感兴趣,那消费者一般会注册一个账号,以便以后使用,那么商城就需要提供用户注册功能;既然提供了注册功能就需要提供登录功能,用户登录之后应当显示这个用户。

用户登录之后就会拥有一定的权限,比如查看自己的个人信息,修改自己的个人信息,修改自己的密码等,当然登录用户也可以查看商品,最重要的,登录用户可以选择商品放入自己的购物车并下单结账。还可以查看自己所下的订单。

因此从上面的分析,我们大致可以分析出来有这么几个实体类来支撑这些操作,首先,如果要浏览商品,那么商品这个东西需要包装成一个实体类,才能在系统中向用户展示;再者用户注册会员,那么会员就又应该是一个实体类,你得在这个实体类里记录注册会员的一些信息啊,什么用户名啊、密码啥的;再者,用户选择了商品放入了购物车,那么购物车就又是一个实体类,它应当负责记录用户买了什么东西,也就是记录用户拿的哪些个商品;最后会员买完东西后给商城下了订单,那么这个订单也需要包装成一个实体类,上面需要记录一些信息,最主要的信息应当有:谁下了这个订单?买了什么东西?多少钱?其它的诸如什么时候下的也可以记录。

      1. 作为一名商城管理员的使用流程

管理员首先要登录才能拥有操作,商城管理员应当能管理商城注册的会员:可以查看商城的注册会员,并且可以修改某个会员的信息,还可以删除会员。

商城管理员应当能管理商品,和商品的类别:可以查看商品类别,添加、修改和删除商品的类别;可以查看商品,添加、修改和删除商品。

商城管理员可以管理会员所下的订单:查看订单和处理订单。

管理员也可以修改自己的密码。

从管理员的操作,我们也可以得到这么几个实体类。第一,管理员,既然有管理员那么就必须有一个类来记录这些东西;第二,这里提到了商品的类别,那么这个也应当包装成一个类,而且这个类应当和商品类有一定的关联。

因此,从前面两个站在不同角度来分析使用流程来看,我从中提取出了一些个名词,这写个名词也就成为了一些基础的实体类,目前分析的出来的有,用户类、管理员类、商品类别类、商品类、购物车类、订单类。

这些个类都是明显的,但是还有一些类可能不能这样直接的通过找名词来得出来,但是可以分析这个过程,来将其推算出来。商城肯定是要用数据库的,那么对数据库的通用操作通常也会封装成为一个JDBC的类。随着分析的不断深入,还会有一些类不断地冒出来。这里我想采用的是实体类只是纯纯的实体类,只是包装一些属性,有一些简单的读取和设置方法,再专门写一个管理类来提供一些和这个实体类相关的一些业务所需的操作,那么这里就又得到了一些类:用户管理类、管理员管理类、商品类别管理类、商品管理类、购物车管理类和订单管理类。

当然这肯定不是全部,随着分析设计的深入,还会有一些类添加进来,就算进入到实际开发阶段,还有可能突然觉得需要再加入某个类。

    1. 网上商城模块分析

现在我再从另一个方面着手,来分析这个网上商城系统。那就是按照功能划分模块的分析方法。基本上每个系统基本上会划分为若干个不同的模块,以方便管理和维护。因此,在这里我也把我的这个网上商城系统按照功能划分为两大模块,管理员模块和用户模块,这两个模块又可以划分为若干个子模块。

      1. 用户模块分析

用户模块是为商城的前台展示所设计的,用户模块又可以大致划分为一下子模块:

  1. 用户注册模块
  2. 用户登录模块
  3. 用户信息修改模块
  4. 修改用户密码模块
  5. 商品展示模块
  6. 购物车模块
  7. 查看以往订单模块

用户注册模块负责新会员注册,并将其持久化,也就是将新注册的会员的信息写入数据库。登录模块负责验证会员的登录,看看有没有这个用户,密码是否正确等,这种操作通常都是从数据库查询。用户信息修改模块可以让用户修改自己的个人信息,这就涉及到了数据库的修改。修改用户密码模块让用户修改自己的密码。商品展示模块应当是从数据库中将商品拿出来,然后再以某种方式显示的网页上。购物车模块就是收集和记录用户所购买的商品,购物车最后要么被直接销毁,要么会转化为订单,然后被销毁。查看以往订单模块使用户能查看自己所下的订单。因此数据库的操作始终贯穿在整个系统里面,几乎所有的地方都涉及到了数据库的操作。

      1. 管理员模块分析

管理员模块是为管理员管理商城事物所设计的,管理员模块又可以初步划分为以下子模块:

  1. 会员管理模块
  2. 商品类别管理模块
  3. 商品管理模块
  4. 订单处理模块
  5. 管理员的自我管理

很明显,会员管理模块是用来管理商城的注册会员的,应当可以查看会员、修改会员信息、删除会员,这就是对数据库的增删改查的体现。商品类别管理模块用来管理商品类别,可以查看商品类别,添加商品类别,修改商品类别和删除商品类别。商品管理模块用来管理商城的商品,可以查看商品,添加商品,修改商品和删除商品。订单处理模块用来管理会员所下订单,可以查看会员所下的订单,并处理这些订单。

这里又把这个网上商城系统分成了两个模块,用户模块和管理员模块,这两个模块又可以具体分为若干个小模块,这么做的目的就是使整个系统更加的清晰明了,更加的有层次感,而且通过不同角度的分析,可以让我更好地去理解这个网上商城系统的结构以及它的组合方式。

    1. 本章小结

本章主要从商城的使用者角度,也就是普通用户和商城管理员两方面分别分析了这些用户对商城一般的操作流程。然后根据这些流程分析出了一些直接的类,也就是一些基础的实体类,并跟据这些大致的流程分析出两个大模块,用户模块和管理员模块,两个大模块又可以进一步细分为一个个小模块。并大致分析了这些模块的功能。

  1. 网上商城系统的设计与实现

本章是网上商城系统的具体设计,包括开发环境的选择及介绍,各个功能模块的具体设计以及一部分实现。

    1. 开发语言和工具介绍

这里介绍我选择的开发语言,开发工具等。

      1. 开发语言介绍

1.Java简介:Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。

Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成[2]。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。 

Java分为三个体系JavaSE(Java2 Platform Standard Edition,java平台标准版),JavaEE(Java 2 Platform,Enterprise Edition,java平台企业版),JavaME(Java 2 Platform Micro Edition,java平台微型版)[3]。

2.HTLM简介:HTML(HyperText Mark-up Language)即超文本标记语言或超文本链接标示语言[4],是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。

3.JavaScript简介:Javascript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果,并且能为在客户端就进行数据的验证[5]。

4.AJAX简介:AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术[6]。

5.JSP/Servlet简介:JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准[7]。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面[8]。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

      1. 数据库介绍

MySQL是一个小型关系型数据库管理系统[9],开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。MySQL的官方网站的网址是:www.mysql.com。

      1. 服务器介绍

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目[10],由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是6.0。

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。[11]另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。

      1. 开发工具介绍

在开发工具选择方面,我选择了MyEclipse、Dreamweaver作为主要开发工具,还使用到了UltraEdit、MySQL Workbench等。

1.MyEclipse介绍:MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率[12]。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。

2.Dreamweaver介绍:Macromedia Dreamweaver是个由Macromedia公司开发的著名网站开发工具,它使用所见即所得的界面,亦有HTML编辑的功能[13]。它现在有Mac和Windows系统的版本。一个可视化的网页设计和网站管理工具,支持最新的Web技术,包含HTML检查、HTML格式控制、HTML格式化选项、HomeSite/BBEdit捆绑、可视化网页设计、图像编辑、全局查找替换、全FTP 功能、处理Flash和Shockwave等富媒体格式和动态HTML、基于团队的Web创作。在编辑上可以选择可视化方式或者喜欢的源码编辑方式。 

    1. 业务逻辑设计

要实现网上商城的业务逻辑,必须有相应的实体类和其相应的方法,这里就大致将其设计出来。

      1. 基础共用类和相应方法

整个系统有一些通用的类和方法,比如连接数据库等。

        1. DB类

方法:

  1. public static Connection getConn() 取得用于连接数据库的Connection。
  2. public static void close(Connection conn) 关闭Connection。
  3. public static void close(Statement stmt) 关闭Statement。
  4. public static void close(ResultSet rs) 关闭ResultSet。
        1. 系统基础配置

这里采用xml文件来储存一些基本的系统设置,比如数据库连接设置。

sys-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<config>

<db-info>

<driver-name>com.mysql.jdbc.Driver</driver-name>

<url>jdbc:mysql://localhost/shopping</url>

<user-name>root</user-name>

<password>root</password>

</db-info>

</config>

这里储存了数据库连接的Driver和url以及用户名和密码,当连接数据库时,就会从这里读取配置信息,当配置信息改变时,直接在这里修改,而不再需要改代码了。

        1. JdbcConfig类

JdbcConfig类就包装了上面sys-config.xml配置文件所配置的数据库连接信息。

成员变量:

  1. private String driverName 数据库连接的Driver。
  2. private String url 数据库连接字符串。
  3. private String userName 用户名。
  4. private String password 密码。

方法:

getters()和setters()方法,用来得到和设置成员变量的值,因此不详细列出。

        1. XmlConfigReader类

XmlConfigReader是负责在连接数据库是从sys-config.xml文件里读取配饰,采用了单例模式,只在第一次加载时读取一次,并保存到jdbcCofig类中,再次连接时直接从jdbcConfig类中读取,XmlConfigReader使用了开源的dom4j来读取xml文件。

成员变量:

  1. private static XmlConfigReader instance XmlConfigReader的实例。
  2. private JdbcConfig jdbcConfig jdbcConfig类的实例。

方法:

private XmlConfigReader() {

SAXReader reader = new SAXReader();

InputStream is = Thread.currentThread().getContextClassLoader()

.getResourceAsStream("sys-config.xml");

try {

Document doc = reader.read(is);

//获取jdbc配置信息

Element driverNameEle = (Element) doc.selectObject("/config/db- info/driver-name");

Element urlEle = (Element) doc.selectObject("/config/db-info/url");

Element userNameEle = (Element) doc.selectObject("/config/db- info/user-name");

Element passwordEle = (Element) doc.selectObject("/config/db- info/password");

//设置jdbc配置信息

jdbcConfig.setDriverName(driverNameEle.getStringValue());

jdbcConfig.setUrl(urlEle.getStringValue());

jdbcConfig.setUserName(userNameEle.getStringValue());

jdbcConfig.setPassword(passwordEle.getStringValue());

} catch (DocumentException e) {

e.printStackTrace();

}

}

XmlConfigReader类的构造方法,在这里采用的dom4j来读取sys-config.xml文件的内容,首先通过ClassLoader把sys-config.xml文件当做一个输入流并交给SAXReader的对象reader,reader就会通过查找标签的方式来把这个标签当做一个Element对象读取上来,例如Element driverNameEle = (Element) doc.selectObject("/config/db-info/driver-name");就会吧sys-config.xml中的<driver-name>com.mysql.jdbc.Driver</driver-name>这对标签当做Element对象读取上来,实际上SAXReader是将xml文件当做一颗dom树并读取其上的内容的。再通过driverNameEle.getStringValue()就能将标签中的值拿到,也就是com.mysql.jdbc.Driver,然后再把它设置到jdbcConfig中,这样再调用的时候就去jdbcConfig中读取。整个构造方法执行完毕后,sys-config.xml文件里得内容就会全部被读取上来并保存到jdbcConfig中。

public static synchronized XmlConfigReader getInstance() 取得 XmlConfigReader的实例。

public JdbcConfig getJdbcConfig() 取得jdbcConfig

        1. PageModel类

PageModel包装了分页信息。

成员变量:

  1. private List<E> list 一个被包装的结果集,如果是User就是一个UserList。
  2. private int totalRecords 总记录数。
  3. private int pageSize 每页记录数。
  4. private int pageNo 当前页码。

方法:

getters()和setters()方法,用来得到和设置成员变量的值,因此不详细列出。

        1. CharsetEncodingFilter类

这是一个filter,用来为jsp页面统一设置request字符集,使得每个jsp页面不再需要单独设置,而且也为修改配置带来了方便,它同样从xml文件中读取配置信息。

成员变量:

  1. private String charsetEncoding 字符集设置。

方法:

  1. public void destroy() 销毁这个filter。
  2. public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 在这里统一为jsp页面设置request字符集。
  3. public void init(FilterConfig filterConfig) filter的初始化方法,filter会在Web server启动时被初始化,在这里读取了保存在web.xml文件里的配置filterConfig.getInitParameter("charsetEncoding"),并且将其保存在了charsetEncoding里。下面是其配置信息:

<init-param>

<param-name>charsetEncoding</param-name>

<param-value>GB18030</param-value>

</init-param>

Filter需要在web.xml文件里配置一下才能生效,且需要配置其作用范围:

<filter>

   <filter-name>CharsetEncodingFilter</filter-name>

   <filter-class>com.jinyize.shopping.util.filter.CharsetEncodingFilter</filter- class>

  <init-param>

  <param-name>charsetEncoding</param-name>

  <param-value>GB18030</param-value>

  </init-param>

  </filter>

  <filter-mapping>

   <filter-name>CharsetEncodingFilter</filter-name>

   <url-pattern>*.jsp</url-pattern>

  </filter-mapping>

<filter-name></filter-name>标签是为这个filter设置名字。

<filter-class></filter-class>标签是标识这个filter的类的具体位置。

<init-param></init-param>标签可以放置一些filter的初始化参数。

<url-pattern>*.jsp</url-pattern>标签标示了这个filter的作用域,*.jsp就标示对所有的jsp页面起作用。

      1. 用户实体类和相应方法

为了实现商城会员的注册、登录、查看会员自己的信息、修改会员的个人信息、修改个人密码和查看所下的订单,应当有一个用户实体类和其相应的方法,在这里设计出两个类User和UserManager类。User只是包装用户的信息,并提供相应的get和set方法;UserManager则提供和User相关的各种业务逻辑方法。

        1. User类

成员变量:

  1. private int id 用户id。
  2. private String username 用户名。
  3. private String password 密码。
  4. private String phone 联系电话。
  5. private String address 送货地址。
  6. private String email Email。
  7. private Date rDate 注册日期。

方法:

getters()和setters()方法,用来得到和设置成员变量的值,因此不详细列出。

        1. UserManager类

成员变量:

  1. private static UserManager instance UserManager自己的实例化(单例模式)。

方法:

  1. public static UserManager getInstance() 取得UserManager的实例。
  2. public boolean addUser(User u) 添加用户。
  3. public User findUserByName(String userName) 通过用户名查找用户。
  4. public User findUserById(String userId) 通过用户id查找用户。
  5. public User login(String userName, String password) 验证用户登录。
  6. public boolean modifyUser(User u) 修改用户信息。
  7. public boolean delUser(String[] userIds) 删除用户。
  8. public PageModel<User> findUserList(int pageNo, int pageSize) 取得用户的分页信息。
  9. public PageModel<User> findUserList(int pageNo, int pageSize, String text, String flag) 取得用户的分页信息。
      1. 管理员实体类和相应方法

用以实现商城管理员的登录和修改密码。

        1. Admin类

包装了管理员的属性。

成员变量:

  1. private String userName 用户名。
  2. private String password 密码。

方法:

getters()和setters()方法,用来得到和设置成员变量的值,因此不详细列出。

        1. AdminManager类

提供了管理员类的相应管理方法。

成员变量:

  1. private static AdminManager instance 单利模式的AdminManager实例。

方法:

  1. public static AdminManager getInstance() 取得AdminManager实例。
  2. public Admin login(String userName, String password) 验证管理员登录。
  3. public boolean modify(Admin admin) 修改密码。
      1. 商品类别类和相应方法

这是一个基础的类,它是一种树形结构,有根类别,其下又有很多子类别,一个商品必须属于某种商品类别。

        1. Category实体类

包装了商品类别的属性。

成员变量:

  1. private int id Category的id。
  2. private int pid 父类别的id。
  3. private String name 类别的名称。
  4. private String describe 类别的描述。
  5. private int grade 类别的级别。
  6. private boolean leaf 是否是叶子节点。

方法:

getters()和setters()方法,用来得到和设置成员变量的值,因此不详细列出。

        1. CategoryManger管理类

提供一系列管理商品类别的方法,单例模式。

成员变量:

  1. private static CategoryManager instance 单例模式的管理类。

方法:

  1. public static CategoryManager getInstance() 取得CategoryManager的实例。
  2. public String getCategoryTreeHTMLString() 取得类别树形结构的HTLM字符串,这里实际上是调用了另一个类的方法。
  3. public List<Category> getCategoryList() 取得Category的树形结构并放入List里返回,这里也是调用另一个类的方法。
  4. public List<Category> getTopCategoryList() 取得顶级的类别节点,也是通过调用另一个类的方法。
  5. public Category findCategoryById(int id) 通过id查找类别。
  6. public boolean addCategory(Category c) 添加一个商品类别。
  7. public boolean modifyCategory(Category c) 修改一个商品类别。
  8. public boolean delCategory(Category c) 删除一个商品类别及其子类别。
  9. private void delCategory(Connection conn, int id) throws SQLException 被public boolean delCategory(Category c)方法调用的,用来递归删除一个类别的子节点的私有方法。
        1. CategoryTreeReader类

这个类就是负责从数据库中将Category的树形结构读取出来,所有的方法都被CategoryManager类重新包装。

方法:

  1. public String getCategoryTreeHTMLString() 对外提供的公共方法,以取得类别树并组成HTML字符串,以供网页显示出一个树形结构。
  2. private void getCategoryTree(Connection conn, StringBuffer strBuf, int id, int level) throws SQLException 取得HTML字符串的具体实现方法,被public String getCategoryTreeHTMLString()方法调用。
  3. public List<Category> getCategoryList() 取得商品类别的树形结构并放入一个List中。
  4. private void getCategoryList(Connection conn, List<Category> categoryList, int pid) throws SQLException 取得Category的树形结构的具体实现。
  5. public List<Category> getTopCategoryList() 取得顶级的类别节点。
      1. 商品类及其相应管理方法

记录并保存商品,提供一系列的管理方法。

        1. Product实体类

包装了产品的属性,依存于Category类。

成员变量:

  1. private int id 商品的id。
  2. private String name 商品的名称。
  3. private String brand 品牌。
  4. private String describe 商品的描述。
  5. private double normalPrice 市场价格。
  6. private double memberPrice 会员价格。
  7. private Date pDate 商品的上架日期。
  8. private Category category 商品所属的类别。
  9. private String fileName 商品的图片文件的名称。

方法:

getters()和setters()方法,用来得到和设置成员变量的值,因此不详细列出。

        1. ProductManager管理类

提供了一系列的管理商品的方法,采用单例模式。

成员变量:

  1. private static ProductManager instance ProductManager类的单例对象。

方法:

  1. public boolean addProduct(Product p) 添加商品。
  2. public PageModel<Product> findProductList(int pageNo, int pageSize, boolean lazy) 取得商品的列表。
  3. private int getTotalRecords(Connection conn) throws SQLException 得到数据库中商品的总记录数。
  4. public Product findProductById(int id, boolean lazy) 通过id查找商品。
  5. public boolean modifyProduct(Product p) 修改一个商品。
  6. public boolean delProducts(String[] pIds) 批量删除商品。
  7. public PageModel<Product> findProductList(int pageNo, int pageSize, boolean lazy, String text) 搜索商品。
  8. public PageModel<Product> findProductList(int pageNo, int pageSize, boolean lazy, Category category,  String text) 搜索商品。
  9. public boolean uploadProductPicture(int id, String fileName) 将商品图片的文件名称保存到数据库中。
        1. FileUploadServlet

Servlet,用来实现为商品上传图片,用到了apache的commons-fileupload和commons-io组件,这是在Java的Web开发中最常用的文件上传组件。上传的图片会存放在服务器的目录下。

      1. 购物车类及其方法

购物车在所有的网上商城系统中都是非常重要的一块,用户一般都是先将商品放入自己的购物车,然后再下单结账,这里设计了三个类,一个是购物车主体类,用来存放一些主要的信息,还有一个类专门用来存放具体的购物项,之后还有一个管理类来对外提供各种服务。

        1. ShoppingCart实体类

这个类保存了购物车的一些主要信息,如购物项的列表,而具体的每一个的购物项则保存在另一个类中。

成员变量:

  1. private List<CartItem> cartItems 一个购物项的列表。

方法:

  1. public List<CartItem> getCartItems() 取得购物项的列表。
  2. public void setCartItems(List<CartItem> cartItems) 设置购物项的列表。
  3. public void add(CartItem cartItem) 添加购物项。
  4. public void deleteItemById(int productId) 删除购物项。
        1. CartItem类

这个类存放着具体购物项的信息,比如商品和购物数量。

成员变量:

  1. private Product product 商品。
  2. private int count 数量。

方法:

  1. public Product getProduct() 取得商品。
  2. public void setProduct(Product p) 设置商品。
  3. public int getCount() 取得购物数量。
  4. public void setCount(int count) 设置购物数量。
  5. public double getTotalMemberPrice() 取得此购物项的会员价的合计金额。
  6. public double getTotalNormalPrice() 取得此购物项的市场价的合计金额。
        1. ShoppingCartManager管理类

它对外提供一系列的方法以供对购物车进行操作,仍然是单例模式。

成员变量:

  1. private static ShoppingCartManager instance 单例的ShoppingCartManager类的实例。

方法:

  1. public double getTotalNormalPrice(ShoppingCart shoppingCart) 取得购物车的市场价总价。
  2. public double getTotalMemberPrice(ShoppingCart shoppingCart) 取得购物车的会员价总价。
      1. 订单类及其方法

订单是用户在将购物车内的物品结账时产生的,因此订单类的成员变量合法和购物车的很相似,这里也是设计了三个类,一个订单的主类,用来保存订单的主要信息,比如谁下的订单,送货的地址在哪里,什么时候下的订单等,而具体订单上的每一个购物项存放在一个专门的类里,当然也有一个管理类向外提供方法。

        1. Order订单实体类

这个类包装了订单的主要信息,比如谁下的订单,送货的地址在哪里,什么时候下的订单等。

成员变量:

  1. private int id 订单的id。
  2. private User user 下单用户。
  3. private String address 送货地址。
  4. private Date oDate 下单日期。
  5. private int status 订单状态。
  6. private List<OrderItem> items 购物项列表。

方法:

  1. getters()和setters()方法。
  2. public void add(OrderItem item) 添加购物项。
        1. OrderItem类

这个类存放具体购物项的信息。

成员变量:

  1. private int id 购物项的id。
  2. private Product product 商品。
  3. private double price 购买时的价格。
  4. private int count 数量。
  5. private int orderId 所属订单的id。

方法:

  1. getters()和setters()方法。
  2. public double getTotalPrice() 取得此购物项的合计金额。
        1. OrderManager管理类

单例模式的管理类,对外提供一些方法用于操作订单。

成员变量:

  1. private static OrderManager instance 单例的OrderManager 对象。

方法:

  1. public boolean saveOrder(Order order) 将订单保存到数据库中。
  2. public PageModel<Order> getOrdersByUser(int pageNo, int pageSize, User user, boolean lazy) 查找某一用户的全部订单。
  3. private void getOrderItemListById(Connection conn, int id, List<OrderItem> itemList, boolean lazy) throws SQLException 查找一个订单的具体订单项。
  4. private int getTotalRecords(Connection conn, User user) throws SQLException 取得属于某一用户的订单的总记录数。
  5. public double getTotalPrice(Order order) 取得这个订单的总金额。
  6. public List<OrderItem> getOrderItemById(int id, boolean lazy)public List<OrderItem> getOrderItemById(int id, boolean lazy) 取得某一订单的全部订单项。
  7. public PageModel<Order> getOrders(int pageNo, int pageSize, boolean lazy) 取得数据库中的所有订单。
  8. private int getTotalRecords(Connection conn) throws SQLException 取得数据库中全部订单的记录数。
  9. public boolean delOrders(String[] ids) 批量删除订单。
  10. public PageModel<Order> getPendingOrders(int pageNo, int pageSize, boolean lazy) 取得全部的未处理订单。
  11. public Order getOrderByID(int id, boolean lazy) 通过id查找订单。
  12. public boolean dealOrderStatus(int id, int status) 修改订单的状态。
    1. 数据库设计
      1. 数据库设计简要介绍

在前面实体类设计完成之后,其实数据库的设计已经变得简单了,数据库表就是前面实体类的成员变量的对应,这里设计了6张表,分别是:

  1. user 用户表
  2. admin 管理员表
  3. category 商品类别表
  4. product 商品表
  5. salesorder 订单表
  6. salesitem 订单购物项表

这六张表其实分别对应了6个不同的实体类,User、Admin、Category、Product、Order和OrderItem。其中product表将category表的id字段作为外键,salesitem表将salesorder表的id字段作为外键。

下面就具体介绍每张表的具体设计。

      1. 数据库具体设计
        1. user表

user表是用来存放商城会员的信息的表,有7个字段,分别用来存放用户id、用户名、密码、联系电话、送货地址、Email和注册日期,它又和User实体类的成员变量对应,详见表4-1。

表4-1 user表

字段名

字段类型

是否为主键

是否可为空

外键

描述

id

Int(11)

YES

NO

用户id

username

varchar(40)

YES

用户名

password

varchar(20)

YES

密码

phone

varchar(40)

YES

联系电话

addr

varchar(255)

YES

送货地址

email

varchar(50)

YES

电子邮箱

rdate

datetime

YES

注册日期

        1. admin表

admin表用来存放管理员的用户名和密码,有2个字段,分别用来存放管理员的用户名和密码,它和Admin实体类对应。具体请见表4-2。

表4-2 admin表

字段名

字段类型

是否为主键

是否可为空

外键

描述

username

varchar(20)

YES

NO

用户名

password

varchar(40)

YES

密码

        1. category表

category表用来存放商品类别的信息,有6个字段,分别用来存放商品类别的id、其父类别的id、类别的名称、类别的描述、类别的级别和类别是否为叶子节点,详见表4-3。

表4-3 category表

字段名

字段类型

是否为主键

是否可为空

外键

描述

id

Int(11)

YES

NO

类别id

pid

Int(11)

YES

父类别id

name

varchar(255)

YES

类别名称

descr

varchar(255)

YES

类别描述

grade

Int(2)

YES

级别

isleaf

Int(1)

YES

是否为叶子

        1. product表

product表用来保存商品的信息,有9个字段,分别用来保存商品的id、商品的名称、品牌、描述、市场价格、会员价格、上架日期、类别id和图片文件名,详见表4-4。

表4-4 product表

字段名

字段类型

是否为主键

是否可为空

外键

描述

id

Int(11)

YES

NO

商品id

name

varchar(255)

YES

商品名称

brand

varchar(255)

YES

品牌

descr

varchar(255)

YES

描述

normalprice

double

YES

市场价格

memberprice

double

YES

会员价格

pdate

datetime

YES

上架日期

categoryid

Int(11)

NO

category.id

商品类别id

filename

varchar(255)

YES

图片文件名

        1. salesorder表

salesorder表用来存放订单的主信息,有5个字段,分别用来存放订单的id、用户id、送货地址、下单日期和订单状态,当然它会有一个从表,来存放具体的购物信息。详见表4-5。

表4-5 salesorder表

字段名

字段类型

是否为主键

是否可为空

外键

描述

id

Int(11)

YES

NO

订单id

userid

Int(11)

YES

user.id

用户id

addr

varchar(255)

YES

送货地址

odate

datetime

YES

下单日期

status

Int(1)

YES

订单状态

        1. salesitem表

salesitem表用来存放具体的订单项,有5个字段,分别用来存放订单项id、商品id、单价、数量和所属订单id,详见表4-6。

表4-6 salesitem表

字段名

字段类型

是否为主键

是否可为空

外键

描述

id

Int(11)

YES

NO

订单项id

productid

Int(11)

NO

product.id

商品id

unitprice

double

YES

单价

pcount

Int(11)

YES

数量

orderid

Int(11)

NO

salesorder.id

所属订单id

    1. 本章小结

本章非常详细的介绍了网上商城系统的具体设计,从开发工具的选择和环境的搭建,到基础的共用类,到具体的实体类再到数据库的设计。这样就完成了项目具体框架的搭建。

  1. 系统的测试和分析

从这里进入到具体的软件编码阶段,我采用了螺旋递增的方式开发,每个版本都只完成一定的功能,然后进行一定的测试,然后继续进行开发,继续完成和完善功能,直到所有的功能全部完成。

    1. V0.1版本

在这个版本里,做了一些系统共用类的封装,比如对数据库操作的一些常用的方法,将其封装到了DB类中,封装了取得数据库连接Connection的方法,和关闭Connection、Statement和ResultSet的方法。在获得数据库连接Connection的时候需要提供一些信息,第一个是数据连接驱动的名字,第二个是数据库连接字符串,还有用户名和密码,这些信息如果写死在程序里面并不好,如果修改数据库那必须要重新修改程序,因此我将上面那些信息封装到了配置文件中,也就是sys-config.xml文件中,如果配置发生了变化,那只需要在配置文件中改动相应的配置即可。

XML文件目前非常的流行,因为用它来保存配置信息非常的方便,XML文件采用的是标记和值的方式,语法和HTML(超文本标记语言)类似,例如<driver-name>com.mysql.jdbc.Driver</driver-name>,在这条记录里的这对<driver-name></driver-name>标记就相当于名字,当需要找里面的值的时候只需要找到它就行了,XML文件的机构是一颗树形机构,有根节点,然后是一层一层的分支节点,这也称之为DOM树,对XML文件的操作就是对这颗DOM树进行操作,所以这里我用到了开源的第三方组件DOM4J,用它来对XML文件进行操作,把其中的配置信息读取出来,供数据库调用时使用。

在网络编程中,中文乱码问题一直是个比较麻烦的事情,解决的方法就是在JSP页面或者Servlet里设置字符集,但是页面非常多的情况下,设置字符集就变得非常麻烦,而且如果发生变动,就需要将这些页面或Servlet的代码全部改一遍,所以这里引入了一个Filter,Filter是一个过滤器,属于面向切面编程的东西,它就是在原来的调用流程里无缝的切入了一层,来实现一些功能,下面我画图解释一下Filter的工作原理和调用流程,如图4-1。

图4-1 普通调用流程

在没有加入Filter之前,一个请求到达时,Tomcat会帮忙调用相应的JSP或者Servlet,如果加入了Filter则变成了图4-2所示的样子。

图4-2 加入Filter之后的调用流程

如果加入了一个Filter,则会变成这个样子,也就是在原先的Tomcat调用Servlet之间又切入了一层,正因为切入了这么一层,所以在这一层就可以做一些事情,在这里我设置了字符集,之后又通过doFilter()方法继续调用Servlet,这种切入是无缝的,不会影响之前的任何东西。

在这个版本里,我还建立了User实体类和UserManager管理类,User类封装了会员的信息,UserManager则提供了一系列的管理方法,有了这两个类接下来就完成了用户的注册和登录功能,在用户注册的时候采用了AJAX来验证用户名是否已经被注册过了,如果已经被注册过了就会在用户名的输入框后面显示一行红字,说用户名已经存在了,如果没有被注册过则显示一行绿字,说可以使用这个用户名注册,在注册页面还使用了JavaScript来验证用户的输入,比如密码长度不能小于6位,两次密码输入的是否一致,如果输入了电话和Email则验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值