基于Java的在线购物系统的设计与实现

  1. 引言
    1. 课题背景

随着Internet国际互联网的发展,越来越多的企业开始建造自己的网站。基于Internet的信息服务,商务服务已经成为现代企业一项不可缺少的内容。很多企业都已不满足于建立一个简单的仅仅能够发布信息的静态网站。现代企业需要的是一个功能强大的,能提供完善的电子商务服务的动态商务网站。

JSPSun公司推出的一种网站开发技术,Sun公司借助自己在Java上的不凡造诣,又把人们引进JSP时代,JSPJava Server Page,它可以在ServletJavaBean的支持下,完成功能强大的Web应用程序。JSP网站架设将成为未来网站架设的趋势,而国内电子购物网站多数是用ASP,PHP技术实现的,而基于JSP的优秀网站较少。所以,在我的毕业设计中,我采用了JSP作为开发工具,构建了一个能实现简单的电子商务的小型动态商务网站——网上图书超市销售系统。该系统能实现用户的注册、登录功能;能够实现商品的查询,订购等功能。该系统基本上具备一个网上商品销售系统应该具备的功能,该设计项目基本上体现了构建一个动态商务网站所需要的技术,可以说,目前的大型商务网站也就是我们这个小型网站在内容上的扩充和重复。

    1. 国内外研究现状

伴随着Internet向我们大踏步走来,国内外网上交易已开始逐步普及,电子商务将成为21世纪主流的商业模式。网上图书超市作为电子商务中的一种,是随着这些网络技术的发展而出现的一种新型图书销售渠道。它通过人与电子通信方式的结合,依靠计算机网络,以通讯技术为基础,实现图书销售的网上交易。网上图书超市同传统的店面书店相比,网上图书超市的经营方式和销售渠道是全新的;它24小时的全天候和全方位服务是店面书店所不能比及的;成本低廉更是开设网上图书超市的主要原因。而与其他商品相比,书籍运送几乎不怕碰撞碎裂,不具时效性;同时书本具有功能单一,形式简单,易于判断和选择而独具优势,最适合于网上交易;再次是单价低,降低了消费者第一次在网络购物的门槛,所以网上图书超市成了电子商务的先锋。现在这一切正在朝着更人性化的方向发展。

随着Internet技术的迅速发展和日益普及,市场竞争日益激烈,利用网络进行服务和管理已经成为一种趋势.网络的发展给用户带来了很大的方便, 风起云涌的网站在炒足了"概念"之后,都纷纷转向了"务实",而"务实"比较鲜明的特点之一:是绝大多数的网站都在试图做实实在在的"网上交易",所谓网上交易就是利用计算机技术、网络技术和远程通信技术,实现整个商务(买卖)过程中的电子化、数字化和网络化,它具有如下优势:

(1)更广阔的环境:人们不受时间的限制,不受空间的限制,不受传统购物的诸多限制,可以随时随地在网上交易。

(2)更广阔的市场:在网上这个世界将会变得很小,一个商家可以面对全球的消费者,而一个消费者可以在全球的任何一家超市购物。  

(3)更快速的流通和低廉的价格:网上超市减少了商品流通的中间环节,节省了大量的开支,从而也大大降低了商品流通和交易的成本。

(4)更符合时代的要求:如今人们越来越追求时尚、讲究个性,注重购物的环境, 网上购物,更能体现个性化的购物过程。

    1. 本课题的研究方法

本次毕业设计应首先分析淘宝网、易趣网等购物网站的相关功能,结合本次毕业设计的相关要求写出需求分析;其次,综合运用以前所学的相关知识(包括计算机网络技术、相关协议、信息安全、JSP等相关知识等),选择所熟悉的开发工具进行本毕业设计的开发;在设计中以需求分析为基础,写出系统开发计划、实现流程及相关问题的实现方法。

  1. 关于JSP
    1. JSP简介

JSP(Java Server Pages)是一种建立在Servlet规范提供的功能之上的动态网页技术,和ASP类似,它们都是在通常的网页文件中嵌入脚本代码,用于产生动态内容,不过JSP文件中嵌入的是JAVA代码和JSP标记。

JSP文件在用户第一次请求时,会被编译成Servlet,然后由这个Servlet处理用户的请求,所以JSP也可以看成是运行时的Servlet。

  1. Servlet是JAVA对CGI的回应。它们在服务器上执行和解释浏览器的请求,承担客户端和其他应用程序之间的中间层的角色。Servlet主要是把动态的内容混合到静态的内容中以产生HTML。
  2. JSP页面在HTML元素中潜入JAVA脚本代码和JSP标记,使得文件长度变短,格式更加清晰。另一方面,JSP把静态和动态的内容分离开来,实现了内容和表示的分离。
  3. 使用JSP,不需要单独配置每一个文件,只要扩展名是.jsp,JSP容器(也是Servlet容器)就会自动识别,将其转换为Servlet为客户端服务。术语WEB容器和JSP容器是同义的。
    1. JSP的运行原理

在JSP第一次获得来自于客户端浏览器的请求时,JSP文件将被JSP引擎(JSP engine)转换成一个Servlet,即将”.jsp”文件编译成Java Class文件。当Servlet引擎接收到请求后,如果设置了使用最新的JSP,它就会去找JSP文件,检查该文件在上次编译后是否改动过。如果改动过,就会重新编译生成新的Servlet,最终将请求转交给编译好的Servlet引擎执行。

在编译时如果发现JSP文件有任何语法错误,转换过程将中断,并向客户端发出出错信息;如果编译成功,则所转换产生的Servlet代码被编译,然后该Servlet被JSP引擎加载到内存中。此时JSP引擎还请求了jspInit()方法的执行,并对此Servlet初始化。JspInit()方法在Servlet的生命周期中只被请求一次,然后将被调用来处理客户端的请求和回复操作。对于所有随后对该JSP文件的请求,服务器将检查该JSP文件自最后一次被存取后是否经过修改。如果没有修改,则将请求交还给还在内存中的Servlet的jspService()方法,执行回复操作。由于Servlet始终驻于内存,所以响应是非常快的。Jsp页面在第一次访问时由于要转化和编译,运行速度较慢,但是当第二次访问该页时,由于文件已经被编译成字节码文件了,所以速度非常得快。

    1. JSP页面的组成

JSP页面看上去像标准的HTML和XML页面,并附带有JSP引擎能够处理和解析执行的代码与组件。通常,JSP代码和组件用于创建在最终页面上显示的文本。通常来说,JSP页面包括编译指令,声明,表达式等内容。

(1)编译指令:使用JSP编译指令(〈%@ 和 %〉内的)来指定所使用的脚本语言,Servlet实现的接口,Servlet扩展的类,Servlet导入的软件包。JSP指令的一般语法形式为:<%@ 指令名=“值”%>。

 (2)声明:用于声明合法的变量和方法。与任何语言相同,JSP语言使用变量来保存数据。这些变量用declaration元素声明,声明的语法为<%! declaration(s) %>。当页面被初始化的时候,JSP页面中的所有声明都被初始化。除了简单的变量,方法也能被声明。声明不对当前的输出流产生任何影响。

(3)表达式:通过计算表达式所得到的结果来表示某个值。表达式的形式为:<%=expression>。表达式求值的结果被强制转换为一个字符串,并插入到当前的输出流中。

    1. JSP的运行环境

要运行Jsp(注意,不是浏览Jsp页面),需要有支持Jsp的服务器。这里分2种情况:一种是自身就支持Jsp的服务器,如Jrun,Weblogic,JSWDK等;而另一种则是在不支持Jsp的服务器上安装Jsp引擎的插件,如在IIS,Apache等服务器上安装WebSphere,tomcat,Resin等插件。其中主流服务器是Weblogic和tomcat.

Tomcat服务器是Apache Group Jakarta小组开发的一个免费服务器软件,适合于嵌入Apache中使用,而且,它的源代码可以免费获得,你可以自由地对它进行扩充。访问的地址 http://jakarta. apache.org/tomacat/index.html, Tomcat服务器的兼容性很好,如WebLogic服务器采用其为Web服务器引擎,Jbuilder将其作为标准的测试服务器,Sun公司也将其作为JSP技术应用的示例服务器。不足之处是它的配置比较麻烦,而且有一些安全性的问题没有解决。但是Tomcat服务器有众多大软件公司的支持,而且服务器的性能稳定,其发展前景很好。

    1. JavaBean技术介绍

JavaBean技术是一种基于Java的组件技术,JavaBean组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据的提取等,是解决代码重用问题的一种策略。

以前的组件无法实现真正的代码重用,其主要原因就是它们对于处理平台的依赖和对开发语言的依赖过重。由于Java语言在这些方面所具有的特点和优势,使得基于它的软件JavaBean组件技术倍受人们的关注。它的任务就是:一次编写,可以在任何地方执行,可以在任何地方重用。JavaBean组件可以在任何地方冲用包括了可以在应用程序、其他组件、文档、Web站点和应用程序构造器工具等多种方案中再利用。

为了创建和使用Java软件组件,JavaBean被实现为一种独立于平台和结构的应用程序接口,它的实现可忽略内部的结构及细节问题,只需要定义其外部的特征及对外功能就行。其中,属性、方法和事件三种接口可以独立对外进行开发。

JavaBean的实质就是一个.class文件,也可以成为类文件。JavaBean以binary格式保存,可以保护Java源代码不容易被他人抄袭。

  1. 需求分析
    1. 系统说明

本系统是一个中小型的电子商务系统----网上图书超市,可以为各类用户提供方便的在线买书环境,符合目前国内流行的电子商务模式。用户可以在系统中实现注册、浏览图书、搜索查询图书、下订单、处理订单等功能;管理员可以通过用户管理、订单管理、图书管理、公告管理、投票管理等管理功能来对系统进行维护更新。

    1. 系统功能简介

网上图书超市系统是一个典型的JSP数据库开发应用程序,由前台商品展示及销售、后台管理2部分组成。

  1. 前台商品展示及销售

该部分主要包括新书上架、重点推荐、销售排行、购物车、会员管理、收银台及订单查询、商品查询等。

  1. 后台管理

该部分主要对商城内的一些基础数据进行有效管理,包括图书管理、用户管理、订单管理、公告管理等。

  1. 系统设计
    1. 功能模块

网上图书超市的前台功能结构如图1所示

图1前台功能结构图

网上图书超市的后台功能结构如图2所示

 

图2 后台功能结构图

    1. 系统设计思想

本系统采用三层架构设计,它的工作原理如图3所示。

图3三层架构拓扑图

采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求处理之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。这样用户界面层甚至可以不知道数据库的结构,它只要维护与业务层之间的接口即可。

    1. 系统总体流程

图4 用户流程图

由于后台管理流程图与用户流程图基本相同,因此只例出如图4用户流程图

    1. 网站架设

4.4.1开发环境

硬件平台:

  1. CPU:P41.8GHz;
  2. 内存:256MB以上。

软件平台:

  1. 操作系统:Windows 2000 Server;
  2. 数据库:SQL Server 2000;
  3. 开发工具包:JDK Version1.5
  4. JSP服务器:Tomcat 5.5
  5. 浏览器:IE5.0及以上版本,推荐使用IE6.0;
  6. 分辨率:最佳效果1024×768。
  7. JDBC驱动: JDBC—ODBC Driver

4.4.2建立站点

在Tomcat 5.5\webapps文件夹下以网上图书超市系统的名称BookSupermarket建立文件夹,然后在BookSupermarket下建立WEB-INF(注意全部是大写)文件夹,最后在WEB-INF下建立classes文件夹,lib文件夹及web.xml保存类文件,需要的包保存储信息及站点的信息。

    1. 数据库设计

本系统数据库采用SQL Server 2005数据库,系统数据库名称为db_bookmanage,共包含8张表,根据项目的需求建立相应的数据表的设计结果如下面所示:

表1图书信息表tb_bookinfo

字段名

数据类型

长度

允许空

说明

ISBN

varchar

15

图书ISBN号,主键

BookName

varchar

200

图书名

Type

varchar

50

图书类别名称

publisher

varchar

100

出版社名称

Writer

varchar

100

作者

Introduce

text

16

yes

图书简介

Price

money

8

价格

pDate

varchar

50

yes

出版日期

cover

varchar

100

yes

图书的封面文件名称

INTime

datetime

8

图书信息录入时间

newbook

int

4

标志是否为新书

commend

int

4

yes

标志是否推荐该图书,1为推荐,默认值为0表不推荐

表2用户信息表tb_Member

字段名

数据类型

长度

允许空

说明

ID

int

4

主键自动编号,用户ID号

username

varchar

4

no

用户名

TrueName

varchar

20

no

用户的真实姓名

PassWord

varchar

20

用户密码

city

varchar

20

所在城市

address

varchar

100

联系地址

Postcode

varchar

6

邮政编码

CardNO

varchar

24

yes

证件号码

CardType

varchar

20

yes

证件类型

grade

int

4

yes

用户等级

Amount  

money

8

yes

消费金额

Tel

varchar

20

yes

联系电话

Email

varchar

100

Email地址

freeze

int

4

yes

是否被冻结,为1表示被冻结,为0表示未被冻结

表3订单信息主表tb_Order

字段名

数据类型

长度

允许空

说明

Order ID

bigint

8

自动编号,订单编号

bnumber

smallint

2

品种数

username

varchar

15

用户名

Truename

varchar

15

用户真实姓名

address

varchar

100

联系地址

postcode

varchar

10

邮政编码

tel

varchar

20

联系电话

email

varchar

100

E-mail地址

pay

varchar

20

付款方式

carry

varchar

20

运送方式

rebate

float

8

折扣

OrderDate

smalldatetin

4

订单日期

bz

varchar

200

yes

备注信息

enforce

int

4

yes

标志是否被执行,值1表示已被执行,为0表示未被执行

表4订单信息明细表tb_order_detail

字段名

数据类型

长度

允许空

说明

ID

bigint

8

订单信息明细的自动编号

orderID

bigint

8

订单号

ISBN

varchar

20

图书ISBN号

price

money

8

单价

numer

int

4

购买数量

表5折扣信息表tb_rebate

字段名

数据类型

长度

允许空

说明

grade

varchar

20

自动编号,等级

Amount

money

8

消费金额

rebate

float

8

打折比率

表6管理员信息表tb_manager

字段名

数据类型

长度

允许空

说明

ID

int

4

自动编号

manager

varchar

30

管理员名称

PWD

varchar

30

密码

表7公告信息表tb_BBS

字段名

数据类型

长度

允许空

说明

ID

int

4

自动编号

content

varchar

4000

公告内容

INTime

datetime

8

 yes

公告的内容,默认值为getdate()

表8投票信息表tb_Poll

字段名

数据类型

长度

允许空

说明

ID

int

4

自动编号

optionName

varchar

50

投票项目

poll

int

4

票数,默认为0

  1. 系统实现
    1. 编写JavaBean

根据系统的需求编写需要的JavaBean。下面将给出网上图书超市需要的JavaBean的编写过程。

5.1.1数据库操作的JavaBean的实现

在系统开发过程中经常需要对数据库操作,这就需要连接数据库和操作数据库(包括数据的插入,更新,删除和查询等),数据库操作的JavaBean是一个公共类,通常包括连接数据库的方法getConnection、执行查询语句的方法executeQuery、执行更新操作的方法executeUpdate、关闭数据库连接的方法close。因此程序开发就可以将连接数据库和操作数据库的代码写成了一个JavaBean “connDB.java”,编写完成后将其源代码放到Tomcat 5.5\webapps\BookSupermarket\WEB-INF\src\beans文件夹中。

(1)指定JavaBean“connDB”保存的包,并导入所需的类包,并将其保存到“beans”包中。

(2)在构造方法connDB中定义该类中所需的变量。通常将方法中常用的变量均放在构造方法中。

(3)创建执行查询语句的方法executeQuery,返回值为ResultSet结果集。

(4)创建执行更新操作的方法executeUpdate,返回值为int型的整数,代表更新的行数。

(5)创建执行更新操作,并返回该操作中自动编号字段的自动编号的方法executeUpdate_id。

(6)创建关闭数据库连接的方法close。

(7)编译connDB.java,用“javac connDB.java”,生成connDB.class,将其放到Tomcat 5.5\webapps\BookSupermarket\WEB-INF\classes\beans文件夹中。

5.1.2字符串处理的JavaBean的实现

字符串处理的JavaBean是解决程序中经常出现的有关字符串处理问题的方法的类。包括将数据库中及页面中有中文问题的字符串进行正确的显示和存储的方法chStr和将字符串中的回车换行、空格及HTML标记符正确显示的方法convertStr两个方法。下面是编写网上图书超市的字符串处理的JavaBean“chStr”的详细过程。

(1)编写解决输出中文乱码问题的方法chStr。

(2)接着编写显示文本中的回车换行、空格及保证HTML标记的正常输出的方法convertStr。

5.1.3保存购物信息的JavaBean的实现

在购物车程序中需要使用一个bookelement对象保存所选图书信息,生成该对象的JavaBean “bookelenent.java”程序代码。

    1. 网站前台主要功能模块实现

5.2.1网站前台首页设计

根据前期的分析及客户的要求,网上图书超市的前台主要包括重点推荐展台,新书上架,图书分类,图书查询,用户管理,购物车,订单生成,订单查询和销售排行等模块。在网上超市前台首页的运行结果如下图5所示

图5首页

5.2.2重点推荐展台的实现过程

(1)在网站前台的居中位置,分栏列出了超市推荐的图书信息,主要包括图书封面,名称,出版社,作者及定价等信息。同时列置了“添加至购物车”按钮和“查看”按钮,分别用于将图书添加至购物车和查看图书的详细信息。重点推荐图书信息同图书基本信息同时保存在图书信息表tb_bookinfo中,以字段commend标识,当commend字段的值为1时,代表该图书为重点推荐图书。查询重点推荐图书的代码如下:

<%

ResultSet rs_book=connDB.executeQuery("select * from tb_bookinfo where commend=1");

%>

这里需要注意的是,“添加购物车”按钮只有在用户登录后才可以显示,即是只有登录的用户才可以购买图书。

(2)根据图书的ISBN号查询图书的详细信息,图书详细页面的运行结果如图6所示:

图6图书简介

在book_detail.jsp页面中首先查询符合ISBN值的图书信息,关键代码如下:

<%

ResultSet rs=connDB.executeQuery("select * from tb_bookinfo where ISBN='"+request.getParameter("ISBN")+"'");

%>

将查询结果显示到页面中,此时需要对“图书简介”进行处理,以便正确显示回车换行和空格符。关键代码如下:

<%

  if(rs.next()){

  //注意:此处只能按照字段的顺序读取

   String ISBN=rs.getString("ISBN");

   String bookname=rs.getString("BookName");

String publisher=rs.getString("publisher");

String writer=rs.getString("writer");

String Introduce=chStr.convertStr(rs.getString("Introduce"));

int price=rs.getInt("Price");

String pDate=rs.getString("pDate");

String cover=rs.getString("cover");

  %>

  …… //此处省略了显示图书信息的HTML代码

 <%}%>

5.2.3新书上架实现过程

在前台首页中,单击“新书上架”超链接可以进入到新书上架页面newbook.jsp,运行结果如图7

图7新书上架

上架新书消息保存在图书信息表tb_bookinfo中,以字段newbook标志,当newbook字段的值为1时,代表该图书为上架新书。上架新书页面关键代码:

<%

ResultSet rs_newbook=connDB.executeQuery("select * from tb_bookinfo where newbook=1 order by INTime desc");

%>

5.2.4图书分类实现过程

为了方便用户查询所需图书信息,在网站中设置了图书分类显示模块。单击导航条中的“图书分类”超链接即可进入图书分类显示页面,在该页面左的“图书分类列表”中列出数据库中的全部图书类别,用户单击即可在右显示该图书信息列表,单击书名可以查看相应图书的详细信息,如果用户已经登录,还可以直接将图书信息添加到购物车中,图书分类显示页面的运行结果如图8

图8图书分类

在图书分类页面BookSort.jsp左的“图书分类列表”中列出了数据库中的全部图书类别,查询图书类别主要通过Select语句的Group By字句实现,具体过程:

<%

ResultSet rs_Type=connDB.executeQuery("select Type from tb_bookinfo group by Type");%>

显示图书分类信息时,需要注意的是,不能再使用while语句,而应该使用do…while语句,否则少一条记录,这是因为在指定图书默认类别时,已经应用rs_Type.next()语句将记录指针移动到下一条记录了,显示图书分类信息的关键代码:

<%rs_Type.first();

do{//此处必须用do...while,否则会少一条记录

String Type=rs_Type.getString("Type");

%>

……   //此处省略填写订单信息代码

<%}while (rs_Type.next());%>

在图书分类页面BookSort.jsp的右侧的图书列表中将显示指定类别的图书信息。当用户没有选择类别,可以通过获取类别结果集rs_Type中的第一条记录的值指定默认类别,否则应用request对象的getParameter方法来获取选择的类别并查询,部分代码:

String PType="";

if (request.getParameter("Type")!=null){

PType=chStr.chStr(request.getParameter("Type"));

}else{

if(rs_Type.next()){

PType=rs_Type.getString("Type");

}else{response.sendRedirect("index.jsp");

}}

ResultSet rs_book=connDB.executeQuery("select * from tb_bookinfo where Type='"+PType+"'");

%>

5.2.5用户管理实现过程

用户管理主要包括用户注册,用户登录,用户个人资料修改,由于用户个人资料修改比较简单,不多做说明。

  1. 用户注册

为了统一管理,系统规定只有会员才能购买图书,所以要购买图书的新用户必须先进行用户注册。用户注册的入口位置在网站首页的左侧。用户点击“注册”即可进入用户注册页面,如图9

图9用户注册

网站要求用户名必须唯一,用户可以先看自己的用户名是否被注册。由于是网络程序,所以注册后在保存用户信息时候,还需要再次对注册用户进行检测。如果不存在,则保存该用户信息。否则提示该名用户已经被注册,请重新注册。保存用户注册信息页面register_deal.jsp。

  1. 用户登录

用户登录窗口如图10

图10用户登录

如果用户输入的用户名存在,并且冻结字段的值不为1,则判断用户输入的密码是否正确,如果密码也正确,则成功登录,否则提示登录失败。

5.2.6购物车实现过程

购物车主要包括所选图书的添加,查看购物车,单件图书购买数量的修改,清空购物车4部分。

  1. 添加到购物车cart_Add.jsp

主要采用Vector类型的变量cart来存储购物数据的,被保存在Session中,然后将图书信息保存到cart中,主要代码:

String ISBN=chStr.chStr(request.getParameter("ISBN"));

String sql="select * from tb_bookinfo where ISBN='"+ISBN+"'";

ResultSet rs=connDB.executeQuery(sql);

float price=0;

if(rs.next()){price=rs.getInt("price");}

bookelement mybookelement=new bookelement();

mybookelement.ISBN=ISBN;

mybookelement.price=price;

mybookelement.number=1;

boolean Flag=true;

Vector cart=(Vector)session.getAttribute("cart");

if(cart==null){

cart=new Vector();}else{

for(int i=0;i<cart.size();i++){

bookelement bookitem=(bookelement)cart.elementAt(i);

//当cart中已经存在所添加的图书信息时,只将数量加1

if(bookitem.ISBN.equals(mybookelement.ISBN)){  //此处必须用equals方法,不能用==

bookitem.number++;

cart.setElementAt(bookitem,i);

Flag=false;

}}}if(Flag)cart.addElement(mybookelement);

session.setAttribute("cart",cart);//将cart保存到session中

rs.close();

response.sendRedirect("cart_see.jsp");

%>
  1. 查看购物车

查看购物车页面cart_see.jsp的顶部首先需要判断购物车是否为空,如果为空将页面直接跳转到购物车为空页面cart_null.jsp,否则显示购物车信息。显示购物车信息主要是将保存在Session中的数据利用for语句输出到IE中,同时根据图书的定价,购买数量自动计算每种图书的金额和购物车中的全部图书的合计金额。代码如下:

Vector cart=(Vector)session.getAttribute("cart");

if(cart==null || cart.size()==0){

response.sendRedirect("cart_null.jsp");

}else{

//此处插入显示购物车信息的代码,将在下面给出

}%>

……   //此处省略填写订单信息代码

<%

float sum=0;

float pric=0;

String ISBN="";

String bookname="";

String publisher="";

for(int i=0;i<cart.size();i++){

//此处获取购物车中的一条图书信息

bookelement bookitem=(bookelement)cart.elementAt(i);

sum=sum+bookitem.number*bookitem.price;

ISBN=(String)bookitem.ISBN;

if (ISBN!=""){

ResultSet rs_book=connDB.executeQuery("select * from tb_bookinfo where ISBN='"+ISBN+"'");

if (rs_book.next()){

bookname=rs_book.getString("Bookname");

}}

%>

      ……   //此处省略填写订单信息代码

        <script language="javascript">

<!--

function check(){

if(isNaN(form1.num<%=i%>.value)){

alert("请不要输入非法字符");

return false;

history.back();}

if(form1.num<%=i%>.value==""){

alert("请输入修改的数量");

return false;

history.back();

}}

-->

图11 购物车

如图11由于在购物车中并没有保存图书的名称,所以在获取图书信息时,还需根据图书的ISBN号重新到数据表中查图书名称,代码如下:

 ResultSet rs_newbook=connDB.executeQuery("select * from tb_bookinfo where ISBN=‘“+ ISBN+”’”);

If(re_book.next()){

Bookname=re_book.getString(“Bookname”);
  1. 从购物车中移去指定图书

实现从购物车中移去指定图书可以通过Vector类的removeElementAt(int index)方法实现,非常方便。页面cart_move.jsp代码为:

Vector cart=(Vector)session.getAttribute("cart");

try{

String ID=request.getParameter("ID");

int id=Integer.parseInt(ID);

cart.removeElementAt(id);//移去指定图书信息

session.setAttribute("cart",cart);

response.sendRedirect("cart_see.jsp");

}catch(Exception e){

}

%>
  1. 清空购物车

实现的方法很简单,只需要将保存在Session中的购物信息清空即可,清空购物车页面cart_clear.jsp代码为:

session.removeAttribute("cart");

response.sendRedirect("cart_null.jsp");

5.2.7生成订单实现过程

生成订单时,不但要保存用户订单中所购买的图书信息和订单信息,同时还需要返回一个可供用户随时查询的唯一订单号。

用户查看购物车页面中的“去收银台结帐”超连接即可进入到收银台页面填写订单信息,在该页面中系统会根据用户登录的用户名自动填写用户基本信息,除用户名不可更改外,其他的均可修改,收银台页面的运行结果如图12

图12收银台

在收银台页面cart_checkout.jsp中,首先应用判断用户是否已经购物,然后再判断用户是否登录,如果用户没有购物或是没有登录都将给予提示并返回到网站首页。关键代码为:

<%if(session.getAttribute("cart")==""){

out.println("<script language='javascript'>alert('您还没有购物!');window.location.href='index.jsp';</script>");

}

String Username="";

Username=(String)session.getAttribute("UserName");

if (Username!=""){

try{

ResultSet rs_user=connDB.executeQuery("select * from tb_Member where username='"+Username+"'");

if(!rs_user.next()){

session.invalidate();

out.println("<script language='javascript'>alert('请先登录后,再进行购物!');window.location.href='index.jsp';</script>");

return;

}else{

String Truename=rs_user.getString("Truename");

String address=rs_user.getString("address");

String postcode=rs_user.getString("postcode");

String tel=rs_user.getString("tel");

String email=rs_user.getString("email");

%>

5.2.8订单查询实现过程

订单查询实现页面是为用户查询订单信息执行状态而设计的,用户成功登录后,单击网站中的“订单查询”,即可进入到订单查询页面,该页面列出当前用户的全部订单概要信息列表。查询订单概要信息主要从订单主表tb_order中根据当前登录的用户名获取订单信息,关键代码如下:

ResultSet rs=connDB.executeQuery("select * from tb_Order where username='"+(String)session.getAttribute("UserName")+"'");

并根据订单编号查看订单的详细信息。

5.2.9销售排行实现过程

该页面运行结果如图13所示

图13销售排行

销售排行数据主要是将销售明细表中的数量ISBN字段分组并统计销售数量再应用子查询获取销售数量最高的前10本图书,最后再使用连接查询获取相应的图书信息,关键代码如下:

ResultSet rs_sort=connDB.executeQuery("select * from (select top 10 * from ( select sum(number) as amount,ISBN from tb_Order_detail group by ISBN )as tab order by amount desc) o inner join tb_bookinfo b on o.ISBN=b.ISBN order by o.amount desc");

    1. 网站后台主要功能模块设计

在后台设计中主要有7个模块,分别是:后台登录,图书管理,用户管理,订单管理。公告管理,投票管理,退出。

5.3.1后台登录实现过程

后台登录页面运行结果如图14

图14后台登录

为了网站的安全,防止一些不法分子蓄意破坏,需要为网站后台设计用于验证用户身份的文件safe.jsp,完整代码如下:

<%if (session.getAttribute("UserName")==null){

out.println("<script language='javascript'>alert('您还没有登录!');window.location.href='index.jsp';</script>");

}%>

然后,在网站首页后的每个页面都加入以下代码:

<jsp:include page="safe.jsp"/>

这样当用户没有正常登录时,即可弹出“您还没有登录”的提示对话框,确定后将退出后台页面,返回网站首页。

5.3.2图书管理页面实现过程

图书管理模块主要实现对图书信息的管理,包括分页显示图书信息,添加图书信息,修改图书信息,删除图书信息等功能。

  1. 分页显示图书信息

分页显示图书信息页面,主要是数据表中的图书信息以列表的方式显示,并为之添加修改和删除的超链接,方便以后对图书信息进行修改和删除。分页显示图书信息页面的运行结果如图15

图15图书管理

在分页显示图书信息页面中主要显示图书的ISBN号,图书名称,出版社,是否为新书,是否推荐等信息,至于图书的其他信息,可以单击图书名称超链接进入图书详细信息页面查询实现图书查询的代码比较简单,只需使用JavaBean的executeQuery方法和一条SQL语句即可实现,代码如下:

<%

ResultSet rs=connDB.executeQuery("select * from tb_bookinfo order by INTime Desc");

%>

对网页中的数据进行分页显示的实现方法如下:

  1. 确定记录跨度,即是每页显示的记录数,这可以根据页面的实际情况由自己规定,例如本系统设置为10
  2. 确认记录的总条数,这可以通过结果集的getRow()方法获得,此时需要读者注意,使用getRow()方式时必须先使用结果集的last()方法。
  3. 根据公式“总页数=总记录数/跨度”计算总页数,如果得出的总页数有余数,则舍去令其等于1
  4. 获取传递的当前页数参数(Page),并把它转换成整型数据,如果该页数小于1,则令其等于1,如果大于最大页数,则令其等于最大页数。
  5. 计算当前记录数,当前记录数=(获取的页数—1)*跨度+1
  6. 通过for循环分页显示图书信息
  1. 添加图书信息

添加图书信息页面主要用于向数据库中添加新的图书信息。添加图书信息页面的运行结果如图16

图16图书添加

为了保证图书信息在数据表中的唯一性,根据用户输入的图书ISBN号判断图书信息是否存在,如果存在则给予提示信息并返回,否则将图书信息保存到数据表中。

  1. 删除图书信息

根据参数ISBN来删除指定的图书信息。

5.3.3用户管理实现过程

系统管理员查看用户基本信息,并对于经常失信的用户予以冻结或解冻。用户信息管理页面的运行结果如图17

图17用户管理

  在介绍如何冻结用户和对已经被冻结的用户进行解冻之前,首先让我们对用户数据表进行简要的分析,在用户信息表tb_member中,除了包括用户基本信息字段外,还包括一个标记用户信息是否被冻结的字段freeze,该字段为int型,默认值为0,在设计程序时候规定该字段的值只有0和1两个,0代表未冻结,1代表已经被冻结。由此可见,实现冻结用户只需将该用户的freeze字段值设置为1即可,实现解冻只需将freeze字段设置为0即可。

实现冻结用户页面member_freeze.jsp的关键代码如下:

if(request.getParameter("ID")!=""){

int ID=Integer.parseInt(request.getParameter("ID"));

String sql="update tb_member set freeze=1 where ID="+ID;

int ret=0;

ret=connDB.executeUpdate(sql);

if (ret!=0){

out.println("<script language='javascript'>alert('该会员信息已经被冻结!');window.location.href='memberManage.jsp';</script>");

}else{

out.println("<script language='javascript'>alert('操作失败!');window.location.href='memberManage.jsp';</script>");

}

}

说明:实现对已经被冻结的用户进行解冻的方法同冻结用户类似,只需将freeze字段的值修改为0即可。

5.3.4订单管理实现过程

订单管理主要是执行订单和查看订单的详细信息,但不能修改订单信息。订单管理页面的运行结果如图18

图18订单管理

订单信息管理首页主要实现分页显示订单概要信息,执行订单和查看订单详细信息的接口。分页显示订单概要信息的实现过程同分页显示图书信息的实现类似,所不同的是在订单列表的执行列中需要根据订单的状态显示不同的信息,如果订单已被执行,则显示“已执行“文字,否则提供执行订单的图标。实现该功能的关键代码如下:

<%if(enforce==0){%><a href="order_enforce.jsp?ID=<%=orderID%>"><img src="../Images/enforce.gif" width="16" height="16"></a><%}else{%>已执行<%}%>

显示订单详细信息页面order_detail.jsp的实现,主要通过订单管理首页传递的订单编号在订单表中tb_order中查询订单的基本信息,再通过试图V_order_detail查询订单的详细信息并显示即可。

5.3.5公告管理实现过程

公告管理主要是查看公告信息,添加公告信息和删除公告信息,由于公告信息涉及到发布公告的时间,首页要能修改公告信息。公告管理页面的运行结果如图19

图19公告管理

显示公告信息时,需要调用JavaBean”chStr”中的convertStr方法显示公告信息中的回车换行和空格。

5.3.6退出系统实现过程

网站后台对于整个网站的正常运行起着至关重要的作用。当管理员对网站维护工作完成后,必须退出系统,否则万一被不发分子乘机进入,后果十分严重,实现退出网站后台的方法十分简单,只需要单击“退出“超链接时,连接logout.jsp页面即可。Logout.jsp页面主要是将保存有管理信息的Session变量清空,并将页面重定向到网站首页即可。关键代码如下:

Session.invalidate();

Response.sendRedirect(“index.jsp”);
  1. 系统测试
    1. 测试环境

为了保证系统运行的效率和可靠性,系统服务器端应具有较高的软硬件配置,客户端的要求不是很高。此应用程序可广泛运行于国际互联网即Internet,也可适用于内部的局域网。其运行要求如下:

(1) 软件环境:

客户端:Windows98/2000/XP,Internet Explorer(IE)5.0等

服务器端:Windows NT/ Windows2000 Sever,JDK Version1.5,SQL Server 2000,Tomcat 5.5,JDBC—ODBC Driver,IE5.0以上

(2)硬件环境:

服务器 CPU:P41.8GHz以上,内存:256M以上

客户端 CPU:P41.8GHz以上,内存:128M以上

    1. 测试结果

在系统的各个模块设计完成之后,需要对整个系统进行全面的测试。目的是让整个系统能够快速、稳定、安全的运行。

表9测试结果

功能

操作

预期结果

显示

测试结果

图书查询

输入要查询图书名点击搜索

显示图书信息,输入要查询图书名点击搜索后显示图书信息

显示图书信息,输入要查询图书名点击搜索后显示图书信息

显示图书信息,输入要查询图书名点击搜索后显示图书信息

图书资料修改

输入要修改的图书信息点击保存

显示“修改成功”返回图书管理页面

显示“修改成功”返回图书管理页面

显示“修改成功”返回图书管理页面

图书添加

输入要添加的图书信息点击保存

显示“添加成功”返回图书管理页面

显示“添加成功”返回图书管理页面

显示“添加成功”返回图书管理页面

图书删除

点击确认

显示“删除成功”返回图书管理页面

显示“删除成功”返回图书管理页面

显示“删除成功”返回图书管理页面

用户注册

输入要注册的用户资料点击确定保存

显示“注册成功”返回首页

显示“注册成功”返回返回首页

显示“这册成功”返回返回首页

用户资料修改

输入要修改的用户资料点击确定保存

显示“修改成功”返回首页

显示“修改成功”返回首页

显示“修改成功”返回首页

系统在上述软硬件环境下分别对所有的详细设计功能作出测试,结果能够达到预期功能

总    结

本系统的实现基本上成功的运用了设计思想中用JSP+JavaBean实现业务逻辑的处理的想法,达到了定制一个小型电子商务平台的目的。但要想将其作为一个能够真正用于商业目的的应用,有好多功能需要进一步的扩充与完善。从开发中我体会到本设计中虽然用了JavaBean,但JSP页面中仍然有很多地方要加入Java程序片段(Java代码),很不利如页面的显示控制。尽管在页面显示与业务逻辑的分离方面,使用也许有它不利的一面,但作为一个小的项目的开发使用它却是一种有效的方法。因为它原理简单,而且所使用的思想和技术也很容易掌握。通过这次设计,我设计的网上书店基本完成了要求的诸项基本功能,实现了一个简单的不同部分以数据为中心的模型,在方案的各部分在实际运作中能够解决相应的问题。

在设计和制作网上书店这一个整体项目的过程中,也培养了自己的综合能力和从全局考虑的思想。将复杂的问题简单化,作为电子商务应用的一个缩影,我所涉及的模块项目完成了其后台具有的基本功能,使自己对于电子商务的了解更加深入和明了。

当然,其中也遗留下了一些待解决的问题,但出于自己水平有限,作为一个网上书店系统,该项目上有一些不完善和函待改进之处,特别是在网站信息的安全性上需要进一步加强。

参考文献

[1]周光明,曾建华,沈翠新,徐琳.在线购物系统的设计与实现[J].电脑学习.2004,(02):40-46

[2]常晓燕,李家武.用J2EE实现网上购物系统[J].微机发展.2003,(09):22-30

[3]MENG Xi-fen.在线购物代理原型系统设计[J]. 苏州丝绸工学院学报.2001,(01):18-31

[4]陈世强,谢坤武,Chen,Shiqiang,Xie.大型购物超市仓库管理系统的设计与实现[J].微计算机信息.2006,(03):56-59

[5]蒋文学,王平,JIANG Wen-xue,WANG Ping.网上购物车系统的设计和实现[J].现代计算机(专业版).2000,(01):66-72

[6]武延军,黄飞跃.精通JSP编程技术[M].北京:人民邮电出版社,2003

[7]姜晓铭,刘晨.Java编程语言[M].北京:冶金工业出版社,2000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 5.0应用开发——全局自定义弹出框openCustomDialog

【高心星出品】 文章目录 全局自定义弹出框openCustomDialog案例开发步骤完整代码 全局自定义弹出框openCustomDialog CustomDialog是自定义弹出框&#xff0c;可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹出框…

CSS基本语法和常用属性

目录 一、CSS二、CSS基本语法三、CSS的三种形式1、行内样式2、内部样式3、外部样式4、三者的优先级问题5、代码演示 四、选择器1 基础选择器1.1标签选择器1.2 ID选择器1.3 Class选择器1.4 属性选择器 2. 组合选择器2.1 层次选择器4.2.2 并列选择器 3. 伪类选择器4、选择器的优先…

白嫖RTX 4090?Stable Diffusion:如何给线稿人物快速上色?

大家都知道&#xff0c;在设计的初期&#xff0c;我们通常会先绘制草图&#xff0c;然后再进行上色处理&#xff0c;最终才开始进行最终的设计工作。在这个上色的过程中&#xff0c;配色是至关重要的一环。这不仅方便了内部同事的评审&#xff0c;也让产品方和客户可以直观地了…

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…

2025年知识竞赛活动怎样办才有新意

2025年的知识竞赛活动要怎样举办才有新意。首先&#xff0c;我们需要理解用户的需求。他们可能是在策划一个活动&#xff0c;想要区别于传统的知识竞赛&#xff0c;吸引更多人参与&#xff0c;尤其是在2025年这样的未来时间点&#xff0c;科技发展可能更快&#xff0c;所以需要…

Chirpy3D:用于创意 3D 鸟类生成的连续部分潜在特征

Chirpy3D框架可以将细粒度的2D图像理解提升至3D生成的全新境界。当前的3D生成方法往往只关注于重构简单的对象&#xff0c;缺乏细致的特征和创造性。Chirpy3D通过结合多视角扩散模型和连续的部件潜在空间&#xff0c;能够生成全新且合理的3D鸟类模型。该系统不仅能够保持细致的…

【Git】ssh如何配置gitlab+github

当我们工作项目在gitlab上&#xff0c;又希望同时能更新自己个人的github项目时&#xff0c;可能因为隐私问题&#xff0c;不能使用同一′密钥。就需要在本地电脑上分别配置两次ssh。 1、分别创建ssh key 在用户主目录下&#xff0c;查询是否存在“.ssh”文件&#xff1a; 如…

用python获取AH股股票列表并且输出-附源代码

用python 获取在A股和香港上市的公司和在A股和香港上市的公司股票代码和名称 import akshare as akdef get_ah_stocks():# 获取A股股票列表a_stock_list ak.stock_zh_a_spot_em()a_stock_list a_stock_list[["代码", "名称"]]# 获取港股股票列表h_stock…

继承QLineEdit类实现自动补全功能

QlineEdit类本身是没有自动补全功能的&#xff0c;可以使用QCompleter配合实现功能。 但是在开发过程中发现&#xff0c;输入的字符串如果匹配那么QCompleter类会弹窗显示匹配项&#xff0c;如果输入的字符串不匹配则QCompleter类会关闭弹出(这点我也倒是能理解&#xff0c;没有…

VMware Workstation Pro 免注册下载链接

VMware Workstation Prohttps://softwareupdate.vmware.com/cds/vmw-desktop/ws/https://softwareupdate.vmware.com/cds/vmw-desktop/ws/ 访问不了或下载速度慢挂VNP

【如何掌握CSP-J 信奥赛中的深搜算法】

CSP-J 信奥赛中的深搜&#xff08;深度优先搜索&#xff09;算法是一个重要知识点&#xff0c;以下是一些学习深搜算法的建议&#xff1a; 理解基础概念 定义与原理&#xff1a;深度优先搜索是一种用于遍历或搜索图、树等数据结构的算法。它从起始节点开始&#xff0c;沿着一条…

BFS解决拓扑排序(3题)

目录 拓扑排序 1.如何排序&#xff1f; 2.如何形成拓扑排序 3.如何建图 1.看数据稠密度 2. 根据算法流程灵活建图 1.课程表 2.课程表2 3.火星词典 拓扑排序 找到做事情的先后顺序&#xff0c;拓扑排序的结果可能不是唯一的 1.如何排序&#xff1f; 1.找出图中入度为…

区块链技术:Facebook 重塑社交媒体信任的新篇章

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着社交平台的快速发展&#xff0c;隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据&#xff0c;这种模…

机器学习-关于线性回归的表示方式和矩阵的基本运算规则

最近在学习机器学习的过程中&#xff0c;发现关于线性回归的表示和矩阵的运算容易费解&#xff0c;而且随着学习的深入容易搞混&#xff0c;因此特意做了一些研究&#xff0c;并且记录下来和大家分享。 一、线性模型有哪些表示方式&#xff1f; 器学习中&#xff0c;线性模型…

安宝特方案 | AR助力制造业安全巡检智能化革命!

引言&#xff1a; 在制造业中&#xff0c;传统巡检常面临流程繁琐、质量波动、数据难以追溯等问题。安宝特AR工作流程标准化解决方案&#xff0c;通过增强现实AR技术&#xff0c;重塑制造业安全巡检模式&#xff0c;以标准化作业流程为核心&#xff0c;全面提升效率、质量与…

【deepseek】利用deepseek+cherry构建高效本地知识库

项目简介 本项目旨在开发一个高效、准确且用户友好的智能问答系统。该系统利用先进的向量化技术和深度学习模型来理解和回答用户的提问。通过整合多个模块的功能&#xff0c;系统能够从大量结构化或非结构化的数据中快速找到相关信息&#xff0c;并以自然语言的形式提供答案。…

小程序实现消息订阅通知完整实践及踩坑记录

1. 实现效果预览 2. 实现步骤 2.1 模版配置 进入小程序后端,选用一次性订阅模版,没有关键字的需要进行2-5天审核,提前进行 2.2 后端核心代码实现 import com.alibaba.fastjson2.JSONObject

vue学习4

1.自定义创建项目 2.ESlint代码规范 正规的团队需要统一的编码风格 JavaScript Standard Style 规范说明&#xff1a;https://standardjs.com/rules-zhcn.html 规则中的一部分&#xff1a; (1)字符串使用单引号 ‘aabc’ (2)无分号 const name ‘zs’ (3)关键字后加空格 if(n…

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容&#xff1a; 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法&#xff0c;模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性&#xff0c;比如容易陷入局部最优&#xff0c;收敛速度慢等&#xff0c;所以改进型的GWO可能通过不同的策略来优化这些…