随着Internet国际互联网的发展,越来越多的企业开始建造自己的网站。基于Internet的信息服务,商务服务已经成为现代企业一项不可缺少的内容。很多企业都已不满足于建立一个简单的仅仅能够发布信息的静态网站。现代企业需要的是一个功能强大的,能提供完善的电子商务服务的动态商务网站。
JSP是Sun公司推出的一种网站开发技术,Sun公司借助自己在Java上的不凡造诣,又把人们引进JSP时代,JSP即Java Server Page,它可以在Servlet和JavaBean的支持下,完成功能强大的Web应用程序。JSP网站架设将成为未来网站架设的趋势,而国内电子购物网站多数是用ASP,PHP技术实现的,而基于JSP的优秀网站较少。所以,在我的毕业设计中,我采用了JSP作为开发工具,构建了一个能实现简单的电子商务的小型动态商务网站——网上图书超市销售系统。该系统能实现用户的注册、登录功能;能够实现商品的查询,订购等功能。该系统基本上具备一个网上商品销售系统应该具备的功能,该设计项目基本上体现了构建一个动态商务网站所需要的技术,可以说,目前的大型商务网站也就是我们这个小型网站在内容上的扩充和重复。
伴随着Internet向我们大踏步走来,国内外网上交易已开始逐步普及,电子商务将成为21世纪主流的商业模式。网上图书超市作为电子商务中的一种,是随着这些网络技术的发展而出现的一种新型图书销售渠道。它通过人与电子通信方式的结合,依靠计算机网络,以通讯技术为基础,实现图书销售的网上交易。网上图书超市同传统的店面书店相比,网上图书超市的经营方式和销售渠道是全新的;它24小时的全天候和全方位服务是店面书店所不能比及的;成本低廉更是开设网上图书超市的主要原因。而与其他商品相比,书籍运送几乎不怕碰撞碎裂,不具时效性;同时书本具有功能单一,形式简单,易于判断和选择而独具优势,最适合于网上交易;再次是单价低,降低了消费者第一次在网络购物的门槛,所以网上图书超市成了电子商务的先锋。现在这一切正在朝着更人性化的方向发展。
随着Internet技术的迅速发展和日益普及,市场竞争日益激烈,利用网络进行服务和管理已经成为一种趋势.网络的发展给用户带来了很大的方便, 风起云涌的网站在炒足了"概念"之后,都纷纷转向了"务实",而"务实"比较鲜明的特点之一:是绝大多数的网站都在试图做实实在在的"网上交易",所谓网上交易就是利用计算机技术、网络技术和远程通信技术,实现整个商务(买卖)过程中的电子化、数字化和网络化,它具有如下优势:
(1)更广阔的环境:人们不受时间的限制,不受空间的限制,不受传统购物的诸多限制,可以随时随地在网上交易。
(2)更广阔的市场:在网上这个世界将会变得很小,一个商家可以面对全球的消费者,而一个消费者可以在全球的任何一家超市购物。
(3)更快速的流通和低廉的价格:网上超市减少了商品流通的中间环节,节省了大量的开支,从而也大大降低了商品流通和交易的成本。
(4)更符合时代的要求:如今人们越来越追求时尚、讲究个性,注重购物的环境, 网上购物,更能体现个性化的购物过程。
本次毕业设计应首先分析淘宝网、易趣网等购物网站的相关功能,结合本次毕业设计的相关要求写出需求分析;其次,综合运用以前所学的相关知识(包括计算机网络技术、相关协议、信息安全、JSP等相关知识等),选择所熟悉的开发工具进行本毕业设计的开发;在设计中以需求分析为基础,写出系统开发计划、实现流程及相关问题的实现方法。
JSP(Java Server Pages)是一种建立在Servlet规范提供的功能之上的动态网页技术,和ASP类似,它们都是在通常的网页文件中嵌入脚本代码,用于产生动态内容,不过JSP文件中嵌入的是JAVA代码和JSP标记。
JSP文件在用户第一次请求时,会被编译成Servlet,然后由这个Servlet处理用户的请求,所以JSP也可以看成是运行时的Servlet。
- Servlet是JAVA对CGI的回应。它们在服务器上执行和解释浏览器的请求,承担客户端和其他应用程序之间的中间层的角色。Servlet主要是把动态的内容混合到静态的内容中以产生HTML。
- JSP页面在HTML元素中潜入JAVA脚本代码和JSP标记,使得文件长度变短,格式更加清晰。另一方面,JSP把静态和动态的内容分离开来,实现了内容和表示的分离。
- 使用JSP,不需要单独配置每一个文件,只要扩展名是.jsp,JSP容器(也是Servlet容器)就会自动识别,将其转换为Servlet为客户端服务。术语WEB容器和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页面在第一次访问时由于要转化和编译,运行速度较慢,但是当第二次访问该页时,由于文件已经被编译成字节码文件了,所以速度非常得快。
JSP页面看上去像标准的HTML和XML页面,并附带有JSP引擎能够处理和解析执行的代码与组件。通常,JSP代码和组件用于创建在最终页面上显示的文本。通常来说,JSP页面包括编译指令,声明,表达式等内容。
(1)编译指令:使用JSP编译指令(〈%@ 和 %〉内的)来指定所使用的脚本语言,Servlet实现的接口,Servlet扩展的类,Servlet导入的软件包。JSP指令的一般语法形式为:<%@ 指令名=“值”%>。
(2)声明:用于声明合法的变量和方法。与任何语言相同,JSP语言使用变量来保存数据。这些变量用declaration元素声明,声明的语法为<%! declaration(s) %>。当页面被初始化的时候,JSP页面中的所有声明都被初始化。除了简单的变量,方法也能被声明。声明不对当前的输出流产生任何影响。
(3)表达式:通过计算表达式所得到的结果来表示某个值。表达式的形式为:<%=expression>。表达式求值的结果被强制转换为一个字符串,并插入到当前的输出流中。
要运行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服务器有众多大软件公司的支持,而且服务器的性能稳定,其发展前景很好。
JavaBean技术是一种基于Java的组件技术,JavaBean组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据的提取等,是解决代码重用问题的一种策略。
以前的组件无法实现真正的代码重用,其主要原因就是它们对于处理平台的依赖和对开发语言的依赖过重。由于Java语言在这些方面所具有的特点和优势,使得基于它的软件JavaBean组件技术倍受人们的关注。它的任务就是:一次编写,可以在任何地方执行,可以在任何地方重用。JavaBean组件可以在任何地方冲用包括了可以在应用程序、其他组件、文档、Web站点和应用程序构造器工具等多种方案中再利用。
为了创建和使用Java软件组件,JavaBean被实现为一种独立于平台和结构的应用程序接口,它的实现可忽略内部的结构及细节问题,只需要定义其外部的特征及对外功能就行。其中,属性、方法和事件三种接口可以独立对外进行开发。
JavaBean的实质就是一个.class文件,也可以成为类文件。JavaBean以binary格式保存,可以保护Java源代码不容易被他人抄袭。
本系统是一个中小型的电子商务系统----网上图书超市,可以为各类用户提供方便的在线买书环境,符合目前国内流行的电子商务模式。用户可以在系统中实现注册、浏览图书、搜索查询图书、下订单、处理订单等功能;管理员可以通过用户管理、订单管理、图书管理、公告管理、投票管理等管理功能来对系统进行维护更新。
网上图书超市系统是一个典型的JSP数据库开发应用程序,由前台商品展示及销售、后台管理2部分组成。
- 前台商品展示及销售
该部分主要包括新书上架、重点推荐、销售排行、购物车、会员管理、收银台及订单查询、商品查询等。
- 后台管理
该部分主要对商城内的一些基础数据进行有效管理,包括图书管理、用户管理、订单管理、公告管理等。
网上图书超市的前台功能结构如图1所示
图1前台功能结构图
网上图书超市的后台功能结构如图2所示
图2 后台功能结构图
本系统采用三层架构设计,它的工作原理如图3所示。
图3三层架构拓扑图
采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求处理之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。这样用户界面层甚至可以不知道数据库的结构,它只要维护与业务层之间的接口即可。
图4 用户流程图
由于后台管理流程图与用户流程图基本相同,因此只例出如图4用户流程图
4.4.1开发环境
硬件平台:
- CPU:P41.8GHz;
- 内存:256MB以上。
软件平台:
- 操作系统:Windows 2000 Server;
- 数据库:SQL Server 2000;
- 开发工具包:JDK Version1.5
- JSP服务器:Tomcat 5.5
- 浏览器:IE5.0及以上版本,推荐使用IE6.0;
- 分辨率:最佳效果1024×768。
- JDBC驱动: JDBC—ODBC Driver
4.4.2建立站点
在Tomcat 5.5\webapps文件夹下以网上图书超市系统的名称BookSupermarket建立文件夹,然后在BookSupermarket下建立WEB-INF(注意全部是大写)文件夹,最后在WEB-INF下建立classes文件夹,lib文件夹及web.xml保存类文件,需要的包保存储信息及站点的信息。
本系统数据库采用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 | 联系电话 |
| 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 | 联系电话 | |
| 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 |
根据系统的需求编写需要的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”程序代码。
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用户管理实现过程
用户管理主要包括用户注册,用户登录,用户个人资料修改,由于用户个人资料修改比较简单,不多做说明。
- 用户注册
为了统一管理,系统规定只有会员才能购买图书,所以要购买图书的新用户必须先进行用户注册。用户注册的入口位置在网站首页的左侧。用户点击“注册”即可进入用户注册页面,如图9
图9用户注册
网站要求用户名必须唯一,用户可以先看自己的用户名是否被注册。由于是网络程序,所以注册后在保存用户信息时候,还需要再次对注册用户进行检测。如果不存在,则保存该用户信息。否则提示该名用户已经被注册,请重新注册。保存用户注册信息页面register_deal.jsp。
- 用户登录
用户登录窗口如图10
图10用户登录
如果用户输入的用户名存在,并且冻结字段的值不为1,则判断用户输入的密码是否正确,如果密码也正确,则成功登录,否则提示登录失败。
5.2.6购物车实现过程
购物车主要包括所选图书的添加,查看购物车,单件图书购买数量的修改,清空购物车4部分。
- 添加到购物车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");
%>
- 查看购物车
查看购物车页面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”);
- 从购物车中移去指定图书
实现从购物车中移去指定图书可以通过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){
}
%>
- 清空购物车
实现的方法很简单,只需要将保存在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");
在后台设计中主要有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图书管理页面实现过程
图书管理模块主要实现对图书信息的管理,包括分页显示图书信息,添加图书信息,修改图书信息,删除图书信息等功能。
- 分页显示图书信息
分页显示图书信息页面,主要是数据表中的图书信息以列表的方式显示,并为之添加修改和删除的超链接,方便以后对图书信息进行修改和删除。分页显示图书信息页面的运行结果如图15
图15图书管理
在分页显示图书信息页面中主要显示图书的ISBN号,图书名称,出版社,是否为新书,是否推荐等信息,至于图书的其他信息,可以单击图书名称超链接进入图书详细信息页面查询实现图书查询的代码比较简单,只需使用JavaBean的executeQuery方法和一条SQL语句即可实现,代码如下:
<%
ResultSet rs=connDB.executeQuery("select * from tb_bookinfo order by INTime Desc");
%>
对网页中的数据进行分页显示的实现方法如下:
- 确定记录跨度,即是每页显示的记录数,这可以根据页面的实际情况由自己规定,例如本系统设置为10
- 确认记录的总条数,这可以通过结果集的getRow()方法获得,此时需要读者注意,使用getRow()方式时必须先使用结果集的last()方法。
- 根据公式“总页数=总记录数/跨度”计算总页数,如果得出的总页数有余数,则舍去令其等于1
- 获取传递的当前页数参数(Page),并把它转换成整型数据,如果该页数小于1,则令其等于1,如果大于最大页数,则令其等于最大页数。
- 计算当前记录数,当前记录数=(获取的页数—1)*跨度+1
- 通过for循环分页显示图书信息
- 添加图书信息
添加图书信息页面主要用于向数据库中添加新的图书信息。添加图书信息页面的运行结果如图16
图16图书添加
为了保证图书信息在数据表中的唯一性,根据用户输入的图书ISBN号判断图书信息是否存在,如果存在则给予提示信息并返回,否则将图书信息保存到数据表中。
- 删除图书信息
根据参数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”);
为了保证系统运行的效率和可靠性,系统服务器端应具有较高的软硬件配置,客户端的要求不是很高。此应用程序可广泛运行于国际互联网即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以上
在系统的各个模块设计完成之后,需要对整个系统进行全面的测试。目的是让整个系统能够快速、稳定、安全的运行。
表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。