胡康秀 王兵贤
[摘 要]本文以MYSQL为数据库开发平台,以Tomcat网络信息服务作为应用服务器,采用JSP(Java Server Pages)技术开发了一个网上书店销售系统,该系统是一个动态的、交互式的、具有商品提供功能和系统管理功能的电子商务系统。
[关键词]JSP;Tomcat;网上书店销售系统
[中图分类号]F724.6;TP393
[文献标识码]A
[文章编号]1673-0194(2009)05-0106-04
伴随着电子商务技术的不断成熟,电子商务的功能也越来越强大,注册用户可以在网上搜索购买到自己想要的各种商品,初步让人们体会到了足不出户,便可随意购物的快感。网上购物系统是一种具有交互功能的商业信息系统,它向用户提供静态和动态两类信息资源,当今比较流行的网上购物系统,国外有“淘宝网”,国内有“当当网”。本文以MYSQL为数据库开发平台,以Tomcat网络信息服务作为应用服务器,采用基于服务器端的JSP、Java的组件JavaBean,以及网页编程语言HTML,构建了一个小型动态商务网站——网上书店系统。该系统能实现用户的注册、登录功能;能够实现图书的查询,订购等功能,基本上具备一个网上商品销售系统应具备的功能,可以说,目前的大型商务网站也就是这个小型网站在内容上的扩充和重复。
1 JSP语言及其特点
在传统的网页HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给用户。程序片段可以操作数据库、重新定向网页以及发送E-mail等[1]。JSP基于强大的Java语言[2-4],具有良好的伸缩性,在网络数据库应用开发领域具有得天独厚的优势,而且它在多方面加速了动态Web页面的开发,譬如,将内容的生成和显示进行分离;强调可重用的、跨平台的组件来执行应用程序所要求的更为复杂的处理;采用标识简化页面开发;拥有Java语言“一次编写,各处运行”的特点等。
2 系统需求分析及总体设计
2.1 需求分析
本系统是一个中小型的电子商务系统——网上书店,可以为各类用户提供方便的在线买书环境。用户可以在系统中实现注册、浏览书籍、搜索查询书籍、处理订单等功能;管理员可以通过用户管理、订单管理、图书管理等管理功能来对系统进行维护更新。
2.2 系统功能模块设计
网上购物系统可以分为前台和后台两个部分(如图1所示),前台部分由用户使用(如图2所示),主要包括用户注册、生成订单、购物车管理、查看购物车订购产品、订单查询、搜索引擎等模块;后台部分由管理员使用,主要包括管理员身份验证、图书管理、处理订单、用户信息管理等模块。
图上书店系统前台功能用户管理购物车管理订单管理个人资料管理搜索引擎后台功能管理员身份验证商品管理处理订单用户信息管理……
3 系统设计
3.1 数据库实现
创建数据表的脚本,代码如下:
create database if not exists ′bookstore′;
use ′bookstore′;
/*
Table structure for allorder
*/
drop table if exists ′allorder′;
CREATE TABLE ′allorder′ (
′Id′ int(11) NOT NULL auto_increment,
′orderId′ varchar(20) NOT NULL default ″,
′BookNo′ int(11) NOT NULL default ′0′,
′Amount′ int(11) default NULL,
PRIMARY KEY (′Id′)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*
Table structure for book
*/
drop table if exists ′book′;
CREATE TABLE ′book′ (
′Id′ int(11) NOT NULL auto_increment,
用户登录在线购书在线
购书查看
购物车修改购买数量删除已经购的图书提交购物车清空购物车继续购书查看订
单信息查看订单详细信息图书
查询购买购买查看图书详细信息查看图书
详细信息购买
′BookName′ varchar(40) NOT NULL default ″,
′BookClass′ int(11) NOT NULL default ′0′,
′Author′ varchar(25) default NULL,
′Publish′ varchar(150) default NULL,
′BookNo′ varchar(30) default NULL,
′Content′ text,
′Prince′ float default NULL,
′Amount′ int(11) default NULL,
′Leav_number′ int(11) default NULL,
′RegTime′ datetime NOT NULL default ′0000-00-00 00:00:00′,
′picture′ varchar(200) default NULL,
PRIMARY KEY (′Id′)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*
Table structure for bookadmin
*/
drop table if exists ′bookadmin′;
CREATE TABLE ′bookadmin′ (
′AdminUser′ varchar(20) default NULL,
′AdminPass′ varchar(50) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*
Table structure for bookclass
*/
drop table if exists ′bookclass′;
CREATE TABLE ′bookclass′ (
′Id′ int(11) NOT NULL auto_increment,
′ClassName′ varchar(30) NOT NULL default ″,
PRIMARY KEY (′Id′)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*
Table structure for orders
*/
drop table if exists ′orders′;
CREATE TABLE ′orders′ (
′Id′ int(11) NOT NULL auto_increment,
′orderId′ varchar(20) NOT NULL default ″,
′UserId′ int(11) NOT NULL default '0',
′SubmitTime′ datetime NOT NULL default ′0000-00-00 00:00:00′,
′ConsignmentTime′ datetime default NULL,
′TotalPrice′ float default NULL,
′content′ text,
′IPAddress′ varchar(20) default NULL,
′IsPayoff′ int(11) default NULL,
′IsSales′ int(11) default NULL,
PRIMARY KEY (′Id′)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*
Table structure for sequence
*/
drop table if exists ′sequence′;
CREATE TABLE ′sequence′ (
′id′ int(11) NOT NULL default ′0′
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*
Table structure for shop_user
*/
drop table if exists ′shop_user′;
CREATE TABLE ′shop_user′ (
′Id′ int(11) NOT NULL auto_increment,
′UserName′ varchar(20) NOT NULL default ″,
′PassWord′ varchar(50) NOT NULL default ″,
′Names′ varchar(20) default NULL,
′Sex′ char(2) default NULL,
′Address′ varchar(150) default NULL,
′Phone′ varchar(25) default NULL,
′Post′ varchar(8) default NULL,
′Email′ varchar(50) default NULL,
′RegTime′ datetime default NULL,
′RegIpAddress′ varchar(20) default NULL,
PRIMARY KEY (′Id′)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
3.2 用JSP连接数据库
在本系统中,需要多次连接数据库,而且这种连接是一项很消耗资源的操作,因此,在本系统中将数据库连接的部分写成了一个JavaBean。文件名为DataBase.java,关键代码如下:
public class DataBase {
public Connection conn;
public Statement stmt;
public ResultSet rs=null;
public String sqlStr="";
public DataBase() {
this.connect();
}
public boolean connect(){
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url ="jdbc:mysql://localhost/bookstore?useUnicode=true&characterEncoding=gb2312";
conn=DriverManager.getConnection(url,"root","123456");
stmt = conn.createStatement ();
}catch(Exception ee){
System.out.println("connect db error:"+ee.getMessage());
return false;
}
return true;
}
public static void main(String args) {
try{
DataBase db = new DataBase();
db.connect();
}catch(Exception e){
e.printStackTrace();
}
}
}
4 系统详细设计
4.1 前台部分
4.1.1 前台总体框架
前台部分由用户使用,包括用户注册、购物车管理、订单管理、图书查询等几个部分。网站前台首页的运行结果如图3所示。用户管理模块主要包括用户注册、登录两个部分。
(1)用户注册:当用户第一次登录时首先要注册,成为会员后,才可以购买物品.用户可以通过单击首页的注册按键来打开注册页面进行会员注册操作,用户注册页面的运行结果如图4所示。
为了便于管理网站对用户的管理,在index.jsp用户注册页接收到的注册信息要经过严格的过滤,保证注册用户的唯一性,在提交表单后需要对数据表中的数据进行查询,如果没有找到,则在插入数据表时提示注册成功,否则提示用户已被占用,请重新注册,关键代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page session="true" %>
<jsp:useBean id="user" scope="page" class="bookshop.run.op_user" />
<%
String mesg = "";
String submit = request.getParameter("Submit");
if (submit!=null && !submit.equals("")) {
boolean isAdd=false;
try{
isAdd=user.add(request) ;
}catch(Exception ex){ex.printStackTrace();}
if(isAdd){
String username=user.getUserName();
session.setAttribute("username",new String(username.getBytes("ISO8859-1")));
session.setAttribute( "userid", Long.toString( user.getUserid() ) );
response.sendRedirect("info.jsp?action=regok");
} else if (!user.getMessage().equals("")) {
mesg = user.getMessage();
} else
mesg = "注册时出现错误,请稍后再试";
}
%>
function openScript(url,name, width, height){
var Win = window.open(url,name,'width=' + width + ',height=' + height + ',
resizable=1,scrollbars=yes,menubar=no,status=yes' );
}
function checkform() {
if (document.form1.username.value==""){
alert("用户名不能为空");
document.form1.username.focus();
return false;
}
if (document.form1.passwd.value==""){
alert("用户密码不能为空");
document.form1.passwd.focus();
return false;
}
if (document.form1.passwd.value!=document.form1.passconfirm.value){
alert("确认密码不相符!");
document.form1.passconfirm.focus();
return false;
}
return true;
}
</script>
用户登录窗口设置在首页上,主要用来接收用户输入的用户名和密码,并更新用户在网站中的状态信息,运行结果如图5所示。首页主要是根据保存用户名信息的Session参数来判断用户是否已经登录,在会员登录窗口中单击登录按钮后,系统将对用户名和密码进行验证。
4.1.3 购物车模块
在超市购物,可以根据自己的需要将很多的物品挑选到购物车(篮)中。而在网上虚拟的购物商城中,通常都会采用一种被称作“购物车”的技术来模拟现实生活。这种技术用起来十分方便,不但可以随时添加,查看,修改,清空购物车中的内容,还可以随时去收银台结账。
(1)添加购物车。添加购物车就是把用户选中的图书放在购物车中。当用户在前台首页中单击图书展示区的“购买”按钮时,系统会将该图书的详细信息展示在查看物品清单页中(如图6所示),用户在单击物品清单页面下方的“放入购物车”链接,便可将图书放入购物车。
(2)查看购物车。为了方便用户随时查看购物情况,在网站的首页加入了查看购物车链接,通过它可以将所选物品信息放入购物车中显示出来。在程序中使用一组文本框记录用户购买的图书数量,用户可以在文本框中输入想要购买的数量然后单击修改按钮。如果要删除物品,可以在数量文本框里输入“0”,并单击修改按钮来更新购物车中图书的数量。
(3)生成订单。生成订单是网上购物商城的最终目的,前面的所有的功能的实现都是为最后生成一个用户满意的订单作基础,在此要生成一个可以供用户随时查询的订单号,还要保存用户订单中所购买的图书信息。当用户确认对购物车不再改变后,就可以到收银台结账并生成订单。结账的流程是:从购物车中读取图书名称、图书数量、图书价格信息,生成唯一的一个订单号,同时也把用户注册的基本信息读取出来,形成一个完整的订单写入数据库中。
4.1.4 订单查询模块
用户提交订单后,通常产生的订单号查询信息及执行状态。用户在网站首页中单击“订单信息”,系统将转到订单查询显示页面,如图7所示。
4.2 后台总体框架
后台功能只允许具有管理员权限的用户使用,它是实现前台功能的基础。主要由管理员身份验证、订单信息管理模块、添加图书模块、查询用户信息管理模块等组成。网站后台首页运行结果,如图8所示。
在前台首页单击管理员入口,将转到管理员登录页面。该页面的功能是对管理员身份验证,用户输入用户名和密码后单击“登录”按键,系统将判断用户名和密码的有效性,如果通过验证则转到后台首页,反之则提示错误。
另外,管理员可以在后台单击导航区的“添加新图书”超链接来添加新的图书信息,为了减少错误,在提交图书信息时,需要对数据的合法性进行验证,输入的图书价格不能是空字符型,而输入的图片只支持Gif格式等,这些任务可以用Bean来实现,也可以用脚本语言Javascript编写。为了确保信息在数据表中的唯一性,在用户提交表单时,需要先根据用户输入的图书名称对数据表进行查询,确保此图书在数据表中不存在后,方可进行添加操作。
值得一提的是,用户在前台购物所产生的订单不能立即执行,需要系统管理员在后台订单信息管理中审核确认其可执行性。用户单击导航栏中的“订单管理”超链接进入用户订单处理页面,该页面显示近期未被处理的订单,用户订单处理页面显示的是用户的基本信息。要知道订单中所涉及的图书,需要单击对应的订单号的超链接打开图书订购详单页才行。图书订购详单主要通过提交的订单号从tb-shop表中查询出对应的图书显示在页面中,管理员审核后可通过复选框来设置订单是否执行。管理员可以在用户信息模块完成对注册用户的浏览及删除功能。如果用户蓄意性注册或在很长的时间内没有订单生成,管理员就可以将该用户删除。单击导航栏中的“查询用户信息”超链接进入用户信息页面,对于一些失信的用户只需要单击右侧的“删除”超链接,即可转到删除页面中做删除处理。
5 结束语
本文所设计的网上书店系统基本完成了要求的各项基本功能,但也有一些不完善和亟待改进之处,如安全性能还不完善,缺少必要的数据加密系统等,这些功能与技术将另文讨论。网上购物系统无论是在开发过程中,还是建成后的日常维护过程中,都需要进行严格的检测,以保证购物系统的服务质量。随着网上购物系统技术的日趋成熟,网上购物的优势日趋明显,会有更多的人参与到网上购物的浪潮中来。
主要参考文献
[1]Phil Hanna.JSP技术大全[M].北京:机械工业出版社,2002.
[2]Steven Holzner.Java技术内幕[M].北京:机械工业出版社,2002.
[3]Karl Moss.Java Servlet开发人员指南[M].北京:清华大学出版社,2002.
[4]Herbert Schildt,James Holmes.Java编程艺术[M].邓劲生,译.北京:清华大学出版社,2004.