资源描述
摘 要
JAVA语言是当前Internet上大型WEB应用程序开发时使用得最热门编程语言,本文描述了JAVA和JSP技术特点以及在互联网上使用状况,简介这两种技术重要编程办法和两者之关联系,并完毕一种基于这种技术网上书店系统。
【核心字】JAVA,JavaBeans,Servlet,JSP,网络编程,电子商务,网上书店
目 录
前 言 3
第1章 概 述 4
1.1 JSP简介和运营原理 4
1.2 开发背景 5
第2章 需求分析 6
2.1 系统构成: 6
2.2 系统规定配备 6
第3章 系统设计 7
3.1 数据库设计 7
3.1.1 数据库需求分析 7
3.1.2 数据库逻辑构造设计 10
第4章 详细设计 12
4.1 系统概述 12
4.1.1顾客界面某些 12
4.1.2 管理界面某些 12
4.2 详细代码及阐明 12
4.2.1实现bookshop.run包 12
4.2.2客户界面设计与实现 20
第5章 系统测试 27
5.1 数据库连接 27
5.2 检测网站运营速度 27
第6章 总结 30
参照文献 31
致 谢 32
前 言
随着计算机、网络 、通信技术发展和日益融合,以及Internet普及应用,涉及电子商务(EC)、视频会议、网上书店等在内某些应用已开始引起社会关注,并逐渐走进人们寻常生活。
JSP是Sun公司推出一种网站开发技术,Sun公司借助自己在Java上不凡造诣,又把人们引进JSP时代,JSP即Java Server Page,它可以在Servlet和JavaBean支持下,完毕功能强大Web应用程序。因此,在我毕业设计中,我采用了JSP作为开发工具,构建了一种能实现简朴电子商务小型动态商务网站——网上书店销售系统。
通过这次毕业设计,我理解了当前流行动态商务网站构成和运作原理,掌握了用JSP构建动态网站有关知识和技术原理,锻炼了自己动手实践能力。
在这次毕业设计过程中,我得到了指引教师杜雪平教师悉心指引。在此,我对你表达衷心感谢!
第1章 概 述
1-1 JAVA语言简介
Java是一种简朴易用、完全面向对象、具备平台无关性且安全可靠重要面向Internet开发工具。自从1995年正式问世以来,Java迅速发展已经让整个Web世界发生了翻天覆地变化。在初期,Java比较多用在浏览器上,插入到网页中(即是Java Applet程序),成为最灵活、最强大网页多媒体载体,但由于Java虚拟机相对于个人电脑而言,有占用资源大,安全性相对较差等缺陷,Applet逐渐被后起之秀Flash所代替,但随着Java Servlet推出,Java在电子商务方面开始崭露头角,最新JSP(Java Server Page)技术推出,更是让Java成为基于Web应用程序首选开发工具,当前Java技术已成为所有大型电子商务项目必然选取。
1-2 开发背景
国内网上书店虽然从数量上获得了一定进展,但从售量而言却不尽人意,当前,国内尚无一家在网上零售领域形成绝对领先优势网上书店。发展比较好寥寥无几,比较成功有当当书店()。
随着着电子商务技术不断成熟,电子商务功能也越来越强大,注册顾客可以在网上搜索购买到自己想要各种商品,初步让人们体会到了足不出户,便可随意购物快感。我毕业设计也就正是一种电子商务系统开发---网上商品销售系统。
第2章 JAVA技术简介
2-1 在Windows平台下配备JSP运营环境
为了使系统可以正常运营JSP和有关程序,必要先配备好可以使用JSPWEB服务器。各种能使用Servlet技术WEB服务器中,运用得最多是Tomcat服务器,如果仅是为了用于测试程序,Tomcat配备则显得太复杂了,本文推荐使用Resin服务器,Resin据称是最快Servlet运营平台,但是限于单站点,对老式某些网关支持不是较好,因而对于商业网站而言,不是最佳选取,但是如果仅是为了测试Servlet,这个Resin安装可谓有点傻瓜化。
Resin比较新版本是3.x,但当前实际用2.x版本比较多,Resin可到官方站点下载:,文献位置:
如果你电脑上已装好JDK,直接把下载resin包解压到D:盘根目录解压后即D:\resin-2.1.13为服务器目录,把本文源程序jspweb文献夹也放在D:盘根目录,即是D:\jspweb为网站根目录,打开D:\resin-2.1.13\conf\ resin.conf(是一份XML形式配备文献),找到doc这里改为D:\jspweb,然后运营D:\resin-2.1.13\bin\httpd.exe,在浏览器输入http://localhost:8080/j1.jsp,看到了“我是JSP!”字样了吧,你Servlet服务器就这样配备成功了,为了能编译Servlet类,还需要做事情是:把D:\resin-2.1.13\lib加入到windowsCLASSPATH环境变量中。
2-2 JSP、ASP和PHP技术之比较
JSP与ASP、PHP技术都是当前网上最流行在服务器端运营脚本技术,JSP能用JavaBeans技术封装,达到商业逻辑目,ASP相应之是COM组件,因而两者都能用于开发商业逻辑,PHP则更像于一种纯脚本,仅适合于普通网站开发,而不能用作商业逻辑而被冠以“Person Home Page”名称,这是最贴切但是了。
JSP与ASP相比,JSP具备跨平台、安全、强大可伸缩性特点,而果硬要挑某些毛病,JSP相对别脚本更加难掌握,由于精通JSP必要精通Java语言,对于中小型项目,咱们要考虑开发人员、开发速度、开发成本等问题,在这方面ASP和PHP会比JSP更容易胜出。
值得一提是,ASP最新版本ASP.NET与本来ASP性质完全是不同,它和JSP同样,都是一种编译性脚本,自身完全与强大Net框架结合,完美支持Xml各种应用,与昔日ASP不可同日而语,但是无论是ASP还是ASP.NET,它都挣脱不了Windows平台自身,这是ASP一种致命缺陷。
2-3 JSP语法基本
2-3-1嵌入了JAVA语言HTML文献
把下面网页保存为:j1.jsp
这就成了一种最简朴JSP页面了,其中
是声明输出文献类型为text/html,字符编码是gb2312,在JSP中里内容表达是JSP编译时某些选项或向客户端发送头信息JSP指令,里内容就是Java语言,如果有必要,更改恰当设定,还可以使用javascript作为脚本,但是实际应用中很少有人这样做。
2-3-2 request、out & response--与访问者交互
接受客户端祈求和向客户端返回信息是动态网页最常做事情,在JSP中,重要通过request、response、out 三大对象实现这些功能。
request 对象作用是接受顾客通过URL或通过表单向发服务器发送祈求信息和与顾客计算机有关某些信息。
response 对象用于网页传回顾客端回应。
out 用于传送回应输出,即向客户端返回信息。
把上面例子稍作修改:
保存为j2.jsp在浏览器上输入:“http://localhost:8080/j1.jps?msg=我是JSP”看一下效果,这和j1.jsp成果同样吧?但它输出是客户端返回信息,这在乎义上完全不同于前者。
2-3-3 session--保持访问者会话状态
会话状态维持是 Web 应用开发者必要面对问题。有各种办法可以用来解决这个问题,如使用 Cookies 、隐藏表单输入域,或直接将状态信息附加到 URL 中。Java Servlet 提供了一种在各种祈求之间持续有效会话对象,该对象容许顾客存储和提取会话状态信息,JSP也内置了这个对象。
Session最基本用法是:
创立一种会话 session.putValue("名称","值");
获得一种会话值session.getValue("名称");
2-3-4 JSP其他基本内置对象
JSP有九大内置对象,除了上述四种以外,还涉及:
pageContext 网页属性是在这里管理
application Servlet正在执行内容
config Servlet构架部件
page JSP网页自身
exception 针对错误网页,未捕获例外
这些基本内置对象是构成JSP页面重要因子。
第3章 系统设计
本系统采用三层架构设计,它工作原理如图3-1所示。
图3-1三层架构模型
采用三层构架后来,顾客界面层通过统一接口向业务层发送祈求,业务层按自己逻辑规则将祈求解决之后进行数据库操作,然后将数据库返回数据封装成类形式返回给顾客界面层。
3.1数据库设计
数据库在一种信息管理系统中占有非常重要地位,数据库构造设计好坏将直接相应用系统效率,以及实现效果产生影响。合理数据库构造设计可以提高数据存储效率,保证数据完整和一致。
3.1.1 数据库需求分析
针对普通在线书店需求,得出如下需求信息。
§ 顾客分为游客和已注册顾客。
§ 订单分为单张详细订单和总订单。
§ 一种顾客可以购买多本图书。
§ 一种顾客相应一张订单。
§ 一种列表相应多张订单。
针对本系统功能分析,总结出如下需求信息。
§ 顾客,涉及数据项:顾客ID、顾客名、密码。
§ 图书,涉及数据项:图书编号、图书名、价格、图书简介。
§ 订单列表,涉及数据项:订单编号、图书编号、购书数量。
§ 订单,涉及数据项:订单编号、顾客编号、下单时间。
从本系统中规划出实体有:顾客实体、图书实体、订单实体、订单列表实体。
订购
顾客
订单列表
订单
图书
实体之间关系E-R图如图3-5所示。
1 1 N
N
图3-5实体关系E-R图
顾客信息实体E-R图如图3-6所示。
图书实体E-R图如图3-7所示。
订单实体E-R图如图3-8所示。
订单列表实体E-R图如图3-9所示。
图书
图书编号
图书名称
分类编号
封面
图3-6 图书实体E-R图
顾客
顾客名
密码
顾客编号
E-mail
图3-7 顾客实体E-R图
订单
订单编号
顾客编号
图书编号
订购数量
图3-8 订单实体E-R图
订单列表
订单号
顾客编号
图书编号
与否付款
图3-9 订单列表实体E-R图
3.1.2 数据库逻辑构造设计
在线书店数据库中各个表设计成果如下面标和所示。
表3.1为图书信息列表book。
表3.1图书信息表book
字段名
数据类型
长度
容许空
阐明
ID
int
4
自动编号,主键
bookname
int
4
书名
bookclass
varchar
255
图书类别
author
varchar
100
yes
图书作者
publish
float
8
yes
出版社
bookNo
varchar
100
yes
书号
Content
text
16
yes
内容简介
price
tinyint
1
yes
价格
Amount
int
4
yes
总数量
Leav_number
int
4
yes
库存量
picture
int
4
yes
封面
reg_time
datetime
8
yes
入库时间
表3.2为顾客信息列表shop_user。
表3.2顾客信息表shop_user
字段名
数据类型
长度
容许空
阐明
ID
int
4
自动编号,会员编号
username
varchar
4
no
顾客名
password
varchar
100
no
密码
Names
int
4
yes
会员级别
Sex
varchar
50
yes
名字
Addr
varchar
50
yes
地址
Phone
varchar
25
yes
电话
Post
varchar
25
yes
邮编
Email
varchar
25
yes
邮箱
Retime
datetime
8
yes
注册时间
RegIpAddr
varchar
20
yes
注册ip
表3.3为订单表,记录订单信息orders。
表3.3订单信息表orders
字段名
数据类型
长度
容许空
阐明
ID
int
4
yes
自动编号,订单编号
order_id
int
4
yes
会员编号
user_id
int
4
yes
图书编号
quantity
int
4
yes
订购数量
submit_time
datetime
8
yes
提交订单时间
consignmentTime
datetime
8
yes
交货时间
totalprice
float
8
yes
总价
content
varchar
20
yes
备注
ipAddr
varchar
20
yes
顾客ip
isPayoff
int
11
yes
与否付款
isSale
int
11
yes
与否发货
表3.4为订单列表,记录订单列表信息allorder。
表3.4 订单列表allorder
字段名
数据类型
长度
容许空
阐明
ID
int
4
自动编号,卡类型编号
orderID
int
11
yes
订单号
BookNo
int
11
yes
书号
Amount
int
11
yes
数量
表3.5书店管理员信息表,记录管理员信息bookadmin。
表3.5 管理员信息表bookadmin
字段名
数据类型
长度
容许空
阐明
AdminUser
varchar
20
管理员顾客名
AdminPass
varchar
50
yes
管理员密码
表3.6图书分类信息表,记录图书分类信息bookclass。
表3.6 图书分类表 bookclass
字段名
数据类型
长度
容许空
阐明
ID
int
4
自动编号,卡类型编号
Classname
varchar
30
yes
图书类别
第4章 详细设计
4.1 系统概述
4.1.1顾客界面某些
图书选购(可按分类查找图书,或者通过核心字进行查询)。
购物车功能。
查看图书详细信息。
顾客注册。
顾客登录。
查看顾客订单信息。
修改顾客个人信息。
4.1.2 管理界面某些
既有图书管理:修改,删除,查看。
顾客管理:查看,修改,删除。
订单管理:查看订单清单,更新订单付款,出货状态,删除订单。
添加新图书。
添加图书分类。
4.2 详细代码及阐明
4.2.1实现bookshop.run包
1:login.java
这是一种以客户为中心交易平台,只有成为了系统合法顾客才可以使用这个系统,因而需要检查每个顾客合法性,管理顾客登录login.java正是要完毕这样功能。
类中定义了个private属性和她们相应setX()/getX()办法和默认构造函数和execute() getSql() 操作。
private属性分别是:
private String username; //登录顾客名
private String passwd; //登录密码
private boolean isadmin; //与否管理员登录
private long userid=0; //顾客ID号
重要操作:重要简介execute()
execute()操作
功能:从数据库中查询顾客信息。
返回值:boolean型,如果取值成功返回true,否则,返回false。
设计思路:获得数据库连接对象Connection 对象,ResultSet对象和Statement对象 ――》调用getSql()办法获得sql语句――》执行sql语句。
程序主干某些代码:
public boolean execute() throws Exception {
………
try{
con=DataBase.getConnection();
stmt=con.createStatement();
rs = stmt.executeQuery(getSql());
}catch(Exception e){
e.printStackTrace();
}
while (rs.next()){
if (!isadmin)
{
userid = rs.getLong("id");
}
flag = true;
}
………}
2:op_book.java
该类重要负责图书管理,涉及图书修改,查询,删除和添加等。
op_book类有如下属性:
private book abooks = new book(); //新图书类
private javax.servlet.http.HttpServletRequest request;//建立页面祈求
private boolean sqlflag = true ; //对接受到数据与否对的
private Vector booklist; //显示图书列表向量数组
private int page = 1; //显示页码
private int pageSize=5; //每页显示图书数
private int pageCount =0; //页面总数
private long recordCount =0; //查询记录总数
public String sqlStr="";
op_book类有如下办法(省去了属性相应getX()/setX()办法):
book_search();完毕图书查询,涉及分类,核心字查询。
delete();负责图书删除。
getOnebook();重要完毕图书单本查询,用于支持页面“查看详细信息”。
insert();负责图书添加。
to_String();把字符串以“ISO 8859-1”编码形式输出,使页面正常显示。
update();负责修改图书信息。
getRequest();负责接受页面传递过来参数,分解并将参数存储到abooks对象中。
重要操作:重要简介getRequest()
getRequest()办法
功能:负责从页面接受表单数据并分解,设立abooks对象相应属性。
参数设计:页面传递Request对象,其中涉及表单数据。
返回值:boolean型,true表达到功,否则返回false。
设计思想:获取页面传递Request对象—》分解Request对象—》获取表单参数值—》把参数值设立成图书对象abooks相相应属性值。
程序主干代码:
public boolean getRequest(javax.servlet.http.HttpServletRequest newrequest) {
………
request = newrequest;
String BookName = request.getParameter("BookName");
abooks.setBookName(to_String(BookName));
String author = request.getParameter("author");
abooks.setAuthor(to_String(author));
String publish = request.getParameter("publish");;
abooks.setPublish(to_String(publish));
String bookclass = request.getParameter("bookclass");
abooks.setBookClass(bc);
String bookno = request.getParameter("bookno");
abooks.setBookNo(to_String(bookno));
String picture = request.getParameter("picture");
abooks.setPicture(to_String(picture));
price =new Float(request.getParameter("price")).floatValue();
abooks.setPrice(price);
amount = new Integer(request.getParameter("amount")).intValue();
abooks.setAmount(amount);
String Content = request.getParameter("Content");
abooks.setContent(to_String(Content));
……..
}
3:op_user.java:
为了使用上以便,咱们把对顾客管理,涉及顾客添加,删除,修改,查询等集合成一种管理类。
该类具备如下属性:
private user user = new user(); //新顾客对象
private javax.servlet.http.HttpServletRequest request; //建立页面祈求
private Vector userlist; //显示顾客列表向量数组
private int page = 1; //显示页码
private int pageSize=8; //每页显示图书数
private int pageCount =0; //页面总数
private long recordCount =0; //查询记录总数
private String message = ""; //出错信息提示
private String username = ""; //注册后返回顾客名
private long userid = 0; //注册后返回顾客ID
该类具备重要办法(省去了属性有关getX()/setX()操作):
add():负责顾客添加。
delete():负责删除指定ID顾客。
get_alluser():取出书店所有顾客信息。
getGbk():返回指定字符串GBK编码。
getUserinfo():负责获得顾客详细信息。
update():负责修改顾客资料。
getRequest():获取表单数据,并分解存储。
4:op_buy.java
咱们把业务逻辑和对订单以及和订单列表管理集成到了该类当中。
该类具备如下属性:
private javax.servlet.http.HttpServletRequest request;//建立页面祈求
private HttpSession session;//页面session;
private boolean sqlflag = true;//对接受到数据与否对的
private Vector purchaselist;//显示图书列表向量数组
private Vector allorder;//订购单列表
private Vector order_list;//订单清单列表
private int booknumber = 0;//购书总数量
private float all_price = 0;//购书总价钱
private boolean isEmpty = false;//库中书数量与否够购买数
private int leaveBook = 0;//库存数量
private String orderId = "";//顾客订单号
private boolean isLogin = true;//顾客与否登录!
private int page = 1;//显示页码
private int pageSize = 15;//每页显示订单数
private int pageCount = 0;//页面总数
private long recordCount = 0;//查询记录总数
该类重要操作(省去了属性有关getX()/setX()操作)
addnew():负责向购物车中添加新购买图书。
delete():负责从数据库中删除指定ID订单。
modiShoper():负责修改购物车中已选图书。
delShoper():负责删除购物车中物品。
getAllorder():负责从数据库中订单列表中查询指定顾客订单列表。
getGbk():获得指定字符串GBK编码。
getOrder():获得单个订单对象。
payout():提交购物车,把订单插入到数据库中。
update():该办法负责当顾客付款后,把数据中相应订单与否付款标记修改成已付状态。
重要操作:重要简介addnew()
addnew()办法
功能:负责向购物车中添加一条新记录。
参数设计:页面传递request对象。
返回值:boolean类型,成功返回true,否则返回false。
设计思路:从页面获得表单数据(request对象中)---》获得图书编号等参数值—》判断购买数量与否合法—》如果是可以操作,否则不能操作—》判断与否第一次购买—》如果是第一次购买,按第一次购买操作—》否则查询购买列表,找与否有相应项,有则直接修改数量—》否则添加新记录。
函数代码:
public boolean addnew(HttpServletRequest newrequest) throws Exception{
…………
request = newrequest;
String ID = request.getParameter("bookid");
String Amount = request.getParameter("amount");
long bookid = 0;
int amount = 0;
try {
bookid = Long.parseLong(ID);
amount = Integer.parseInt(Amount);
}
catch (Exception e) {
return false;
}
if (amount < 1)
return false;
session = request.getSession(false);
if (session == null) {
return false;
}
purchaselist = (Vector) session.getAttribute("shopcar");
String sqlStr = "select leav_number from book where id=" + bookid;
try { con=DataBase.getConnection();
stmt=con.createStatement();
rs = stmt.executeQuery(sqlStr);
if (rs.next()) {
if (amount > rs.getInt(1)) {
leaveBook = rs.getInt(1);
isEmpty = true;
return false;
}
}
DataBase.closeResultSet(rs);
DataBase.closeStatement(stmt);
DataBase.closeConnection(con);
}
catch (SQLException e) {
return false;
}
allorder iList = new allorder();
iList.setBookNo(bookid);
iList.setAmount(amount);
boolean match = false;//与否购买过该图书
if (purchaselist == null) { //第一次购买
purchaselist = new Vector();
purchaselist.addElement(iList);
}
else { // 不是第一次购买
for (int i = 0;i < purchaselist.size();i++) {
allorder itList = (allorder) purchaselist.elementAt(i);
if (iList.getBookNo() == itList.getBookNo()) {
itList.setAmount(itList.getAmount() + iList.getAmount());
purchaselist.setElementAt(itList,i);
match = true;
break;
} //if name matches结束
} // for循环结束
if (!match)
purchaselist.addElement(iList);
}
session.setAttribute("shopcar",purchaselist);
return true;
}
4.2.2客户界面设计与实现
1:界面头和界面尾设计。
为了提高代码重用性,我把客户界面某些相似头和尾作成两个独立块,分别命名为 head.inc和tail.inc。这两个文献是单纯html代码,在jsp页面中只要通过如下语句就可以实现对两个文献调用: <%@include file=’’/bookshop/inc/head.inc”%>
< %@include file=’’/bookshop/inc/head.inc”%>
她们效果如下图4-1:
图4-1界面头和尾某些显示效果
顾客登录界面login.jsp代码如下:
<%@page contentType="text/html;charset=gb2312"%>
<%@ page session="true" %>
<link rel="stylesheet" href="css.css" type="text/css">
<jsp:useBean id="login" scope="page" class="bookshop.run.login" />
<% String mesg = "";
if( request.getParameter("username")!=null && !request.getParameter("username").equals("")){
String username =request.getParameter("username");
String passwd = request.getP
展开阅读全文