欢迎添加微信互相交流学习哦!

项目源码:https://gitee.com/oklongmm/biye2

摘 要
JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言,本文描述了JAVA和JSP技术的特点以及在互联网上的使用情况,介绍这两种技术的重要编程方法和两者之关的联系,并完成一个基于这种技术的网上书店系统。
【关键字】JAVA, JavaBeans, Servlet, JSP, 网络编程, 电子商务, 网上书店
目 录
TOC 1-3 摘 要 2
目 录 2
第一章 概 述 3
(一) JSP简介和运行原理 3
(二) 开发背景 4
第二章 需求分析 4
(一) 系统组成 4
(二) 角色识别 5
第三章 系统设计 7
(一) 数据库设计 8
1. 数据库需求分析 8
2. 数据库逻辑结构设计 10
第四章 详细设计 12
(一) 实现bookshop.run包 12
1. login.java 12
(二) 客户界面设计与实现 18
1. 界面头和界面尾设计 18
2. 老用户登录 18
3. 新用户注册 21
4. 在线购书功能模块设计 26
6. 读者留言功能模块设计 32
7. 管理员身份验证功能模块设计 37
8. 订单处理功能模块设计 39
第五章 系统测试 41
(一) 数据库连接 41
(二) 检测网站运行速度 42
第六章 总 结 43
第七章 参考文献 44
第八章 致 谢 44
第1章 概 述
(1)JSP简介和运行原理
  JSP(Java Server Pages)是由Sun Microsystems 公司倡导、许多公司参与一起建立的一种动态网页技术标准,JSP技术在Servlet技术基础上发展起来的,它正在飞速发展中,现已成为Java服务器编程的重要组成部分。它虽然还未成型,但是它必将和J2EE(Java 2 Enterprise Edition)一起发展。
JSP是结合markup(HTML和XML)和Java代码来处理一种动态页面。每一页第一次被调用时,通过JSP引擎自动被编译成Servlet,然后被执行,以后每次调用时,执行编译过的Servlet。JSP提供了多种方式访问Java class、Servlet、Applets和Web Server,因此,Web应用的功能可以分成多个明确定义公用接口的组件,通过JSP将它们结合在一起。
在JSP第一次获得来自于客户端浏览器的请求时,JSP文件将被JSP引擎(JSP engine)转换成一个Servlet,即将”.jsp”文件编译成Java Class文件。当Servlet引擎接收到请求后,如果设置了使用最新的JSP,它就会去找JSP文件,检查该文件在上次编译后是否改动过。如果改动过,就会重新编译生成新的Servlet,最终将请求转交给编译好的Servlet引擎执行。
(2)开发背景
我国的网上书店虽然从数量上取得了一定的进展,但从售量而言却不尽人意,目前,国内尚无一家在网上零售领域形成绝对领先优势的网上书店。发展比较好的寥寥无几,比较成功的有当当书店。
伴随着电子商务技术的不断成熟,电子商务的功能也越来越强大,注册用户可以在网上搜索购买到自己想要的各种商品,初步让人们体会到了足不出户,便可随意购物的快感。我的毕业设计也就正是一个电子商务系统的开发---网上商品销售系统。
第2章 需求分析
本系统是一个中小型的电子商务系统----网上书店,可以为各类用户提供方便的在线买书环境,符合目前国内流行的电子商务模式。用户可以在系统中实现注册、浏览商品、搜索查询商品、下定单、处理定单等功能;管理员可以通过用户管理、定单管理、商品管理等管理功能来对系统进行维护更新。
(1)系统组成
1.客户界面部分
图书选购(可按分类查找图书,或者通过关键字进行查询)。
购物车功能。
查看图书详细信息。
用户注册。
用户登录。
查看用户的订单信息。
修改用户个人信息。
2.管理界面部分
现有图书管理:修改,删除,查看。
用户管理:查看,修改,删除。
订单管理:查看订单清单,更新订单付款,出货状态,删除订单。
留言管理。
职工管理。
出版社管理。
(2)角色识别
角色识别的任务是找出所有可能与系统发生交互行为的外部实体,对象和系统。他们的行为不受系统的控制,但是可以提供输入给系统(即使用系统的功能,或者能够响应系统的服务请求,为系统提供服务的接口)。
在前面的描述中可知,用户在访问系统时,可以浏览书籍和查询书籍,并使用购物车筛选自己中意的书籍,购物完之后到服务台进行结帐,并保留订单以便收到货物时进行核对,很显然系统存在这样的主要角色,我们定义该角色为前台客户。同样在系统的后台,也需要人员管理货物,查询,处理订单,管理注册用户,我们定义该角色为系统管理员。
综上所述,本系统实际只包含两个角色:前端用户,系统管理员。
前台用户的行为:管理个人信息,前台订单处理,购物,浏览信息。
管理个人信息的操作:用户注册,用户信息修改,用户登录,用户信息查看。
前台订单处理的操作:结帐,查看订单状态,取消订单。
购物操作:浏览购物车,将商品放入购物车,取消购物车中的商品,修改购物车中商品的数量, 清空购物车。
浏览信息:查看图书详细信息,查找图书。
系统管理员的行为:用户管理,后台订单管理,商品管理。
用户管理的操作:管理员登录,后台验证,查看/修改用户信息,添加/删除用户。
后台订单管理的操作:查看订单,确认订单,修改订单状态,删除订单。
商品管理:查看图书列表,查看图书详细信息,添加图书,修改图书,删除图书,添加图书分类,删除图书分类,浏览图书分类列表。
为了更好的理解我画出了前台用户模型图和系统管理员模型图:
前台用户模型:
图2-1 前台用户模型
图2-2 系统管理员模型
表2.1 模块功能列表
序号 功能模块类型 功能模块 备注
1 前台用户 管理个人信息 用户注册,用户信息修改,用户登录,用户信息查看
2 前台用户 前台订单处理 结帐,查看订单状态,取消订单
3 前台用户 购物 浏览购物车,将商品放入购物车,取消购物车中的商品,修改购物车中商品的数量,清空购物车
4 前台用户 浏览信息 查看图书详细信息,查找图书
5 系统管理员 用户管理 管理员登录,后台验证,查看用户信息,修改用户信息,添加用户,删除用户
6 系统管理员 后台订单管理 查看订单,确认订单,修改订单状态,删除订单
7 系统管理员 商品管理 查看图书列表,查看图书详细信息,添加图书,修改图书,删除图书,添加图书分类,删除图书分类,浏览图书分类列表
表2.1是根据模块完成任务的不同进行划分的,一共包括7大模块,其中与前台相关的共有4个,与后台相关的有3个。这些功能模块是建立在我们对系统的需求分析和设计的基础上的。当然这是从大的方向对系统进行的很粗糙的划分,进入系统设计阶段我们将会对系统进行更加精细的划分设计。
任何系统的功能的实现都离不开角色的参与,为了赋予不同的角色不同的功能和权限,也为了一定程度上确保系统交易的安全性和顺利进行,我们必须对系统的各种用户进行管理,从表2.1可以看出,系统提供用户登录,用户注册,用户信息查看,用户信息修改的功能。用户登录后是为了从后端数据库中核实用户的登录名和密码,防止非法用户下订单,确保系统的安全性和秩序。其他的功能也是最大限度的保证系统的顺利进行和安全性。这里就不一一说明了。
第3章 系统设计
本系统采用三层架构设计,它的工作原理如图3-1所示。
图3-1三层架构模型
采用三层构架以后,用户界面层通过统一的接口向业务层发送请求,业务层按自己的逻辑规则将请求处理之后进行数据库操作,然后将数据库返回的数据封装成类的形式返回给用户界面层。
(1)数据库设计
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率,以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。
1. 数据库需求分析
针对一般在线书店的需求,得出如下需求信息。
 用户分为游客和已注册用户。
 订单分为单张详细订单和总订单。
 一个用户可以购买多本图书。
 一个用户对应一张订单。
 一个列表对应多张订单。
针对本系统功能分析,总结出如下的需求信息。
 用户,包括数据项:用户ID、用户名、密码。
 图书,包括数据项:图书编号、图书名、价格、图书介绍。
 订单列表,包括数据项:订单编号、图书编号、购书数量。
 订单,包括数据项:订单编号、用户编号、下单时间。
从本系统中规划出的实体有:用户实体、图书实体、订单实体、订单列表实体。

1 1 N
N
图3-5实体关系E-R图
图3-6 图书实体E-R图
图3-7 用户实体E-R图
图3-8 订单实体E-R图
图3-9 订单列表实体E-R图
2. 数据库逻辑结构设计
网上书店数据库中各个表的设计结果如下所示。
表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
字段名 数据类型 长度 允许空 说明
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
字段名 数据类型 长度 允许空 说明
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 备注
isPayoff int 11 yes 是否付款
isSale int 11 yes 是否发货
表3.4 订单列表allorder
字段名 数据类型 长度 允许空 说明
ID int 4 自动编号,卡类型编号
orderID int 11 yes 订单号
BookNo int 11 yes 书号
Amount int 11 yes 数量
表3.5 管理员信息表bookadmin
字段名 数据类型 长度 允许空 说明
AdminUser varchar 20 管理员用户名
AdminPass varchar 50 yes 管理员密码
表3.6 图书分类表 bookclass
字段名 数据类型 长度 允许空 说明
ID int 4 自动编号,卡类型编号
Classname varchar 30 yes 图书类别
第4章 详细设计
(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()方法
功能:负责从页面接受表单数据并分解,设置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()方法:
功能:负责向购物车中添加一条新记录。
参数设计:页面传递的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;}
(2) 客户界面设计与实现
1. 界面头和界面尾设计
为了提高代码的重用性,我把客户界面部分相同的头和尾作成两个独立的块,效果如下图:
图4-1 界面头和界面尾效果图
2. 老用户登录
1.用户登录界面login.jsp代码如下:
<%@ page contentType=text/html;charset=GB2312%>


.

<%
int i_totalnum=0;
double d_totalamount=0.0;
Collection c_cart=(Collection)session.getAttribute(cart);
Iterator it=null;
if(c_cart!=null&&c_cart.size()>0){%>

<%
it=c_cart.iterator();
while(it.hasNext()){
cartBean cbean=(cartBean)(it.next());
i_totalnum+=cbean.ordernum;
d_totalmount+=cbean.subtotal;
%>

<%
}// while%>

<%
d_totalamount=Math.round(d_totalamount * 100)/100.00;
%>

<%}else{%>

购物车

书号 书名 出版社 单价 数量(本) 合价 操作

target=_blank><%=cbean.bookid%>
<%=cbean.bookname%> <%=cbeanpublish%> <%=cbean.unitprice%>
size=5 readonly> 
bookid=<%=cbean.bookid%>);return document.MM_returnValue value=+> 
bookid=<%=cbean.bookid%>);return document.MM_returnValue value=->
¥<%=cbean.subtotal%> >取消
合计
<%=i_totalnum%>(本) ¥<%=d_totalamount%>

return document.MM_returnValue value=清空购物车>  
return document.MM_returnValue value=继续购书>  
return document.MM_returnValue value=去收银台>
您的购物车为空!

<%}//else%>

<%@ include file=bottom.jsp%>

图4-5 购物车效果图
6. 读者留言功能模块设计
读者留言leaveword.jsp代码:
<%@ page content Type=text/html; charset=GB2312%>
<%@ page import=java.util.*,java.sql.*%>
<%
request.setCharacterEncoding(GB2312);
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
Connection conn=DriverManager.getConnection(jdbc:odbc:bookshoplk,sa,);
Statement stmt=conn.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=null;
String s_userid=(String)session.getAttribute(userid);
int i_totalnum=0; int i_pagenum=5; int i_totalpage=0;
int i_currentpage=1;
String s_createid=;
String s_subject=;
String s_datel=;
String s_context=;
String s_employeeid=;
String s_date2=;
String s_advice=;
rs=stmt.executeQuery(select count(*)from notes );
rs.next();
i_totalnum=rs.getInt(1);
i_totalpage=i_totalnum/i_pagenum;
if(i_totalnum%i_pagenum!=0)
i_totalpage++;
String op=request.getParameter(op);
if(op!=null&&op.equals(show)){
String s_currentpage=request.getParameter(currentpage);
i_currentpage=Integer.parseInt(s_currentpage); }
if(op!=null&&op.equals(previous)) {
String s_currentpage=request.getParameter(currentpage);
i_currentpage=Integer.parseInt(s_currentpage)-1; }
if(op!=null&&op.equals(next)) {
String s_currentpage=request.getParameter(currentpage)+1;
i_currentpage=Integer.parseInt(s_currentpage); }
if(op!=null&&op.equals(firstpage)) { i_currentpage=1;}
if(op!=null&&op.equals(lastpage)) { i_currentpage=i_totalpage;}
%>

<%@include file=top.jsp%>

<%if(i_totalnum!=0){%>

<%
rs=stmt.executeQuery(select*from notes order by id desc);
if(i_currentpage>i_totalpage)
i_currentpage=i_totalpage;
int i_position=(i_currentpage-1)*pagenum;
if(i_position==0)
rs.beforeFirst();
else
rs.absolute(i_position);
for(int i=0;i if(!rs.isLast()){
rs.next();
s_createid=(rs.getString(userid)!=null?rs.getString(userid):);
s_subject=(rs.getString(subject)!=null?rs.getString(subject):);
s_datel=(rs.getString(datel)!=null?rs.getString(datel).substring(0,10):);
s_context=(rs.getString(context)!=null?rs.getString(context):); s_employeeid=(rs.getString(employeeid)!=null?rs.getString(employeeid):); s_date2=(rs.getString(date2)!=null?rs.getString(date2).substring(0,10):);
s_advice=(rs.getString(advice)!=null?rs.getString(advice):[请等待工作人员处理]);%>;i++){

<% }//if }//for %>
<% if(s_userid!=null){%>

<%}else{%>

<%}%>

读者留言

最近的留言共<%=i_totalnum%>条,分<%=i_totalpage%>页显示,每页显示<%=i_pagenum%>条

第<%=i_currentpage%>页 
<%if(i_currentpage>1){%>
首页
<%}else{%>首页<%}%> 
<%if(i_currentpage>1){%>
>上一页
<%}else{%>上一页%}%> 
<%if(i_currentpage!=i_totalpage){%>
>下一页
<%}else{%>上一页%}%> 
<%if(i_currentpage!=i_totalpage){%>
末页
<%}else{%>末页%}%>
 
留言日期 留言人 主题 内容 处理日期 处理意见
<%=s_datel%> <%=s_createid%> <%=s_subject%> <%=s_context%> <%=s_date2%> <%=s_advice%>
主题  
留言  
type=hiddenvalue=<%=s_userid%>>
 
您还没有登录,登录用户可以发表留言!
<%@include file=bottom.jsp%>

图4-6 读者留言
7. 管理员身份验证功能模块设计
a.管理员身份验证bookshop/admin/index.jsp代码:
<%@ page contentType=text/html;charset=GB2312%>
<%@ page import=java.util.*,java.sql.*%>
<%
request.setCharacterEncoding(GB2312);
Class.forName(sun.jbdc.odbcObdcDriver);
Connection conn=DriverManager.getConnection(jdbc:odbc:bookshoplk,sa,);
Statement stmt=conn.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=null;
String op=request.getParameter(op);
if(op!=null&&op.equals(login)){
String s_employeeid=request.getParameter(employeeid);
String s_password=request.getaparameter(password);
rs=stmt.executeQuery(select*from employee where employeeid=+s_employeeidand password++s_password);
if(rs.next()){
session.setAttribute(admin,s_employeeid);
reponse.sendRedirect(booklist.jsp); }
else{response.sendRedirect(../error.jsp?error=+用户名或密码不正确!);}}
%>

>%

 
用户名  
密码  

图4-7 管理员身份验证
8. 订单处理功能模块设计
a.订单处理orderdit.jsp代码:
<%@ page contenttype=text/html;charset=GB2312%>
<%@ page import=java.util.*,java.sql. *%>
<%
Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
Connection conn=DriverManager. getConnection(jdbc:odbc:bookshoplk,sa,);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_
READ_ONLY);
ResultSet rs=null;
String s_admin=(String)session.getAttribute(admin);
if(s_admin==null)( response.sendRedirect(checklogin.jsp); )
String s_currentpage-request.getParameter(currentpage);
String s_orderid-request.getParameter(orderid);
String s_state=request.getParameter(state);
stmt.executeUpdate(update orderform set state=+s_state+ where orderid=+s_orderid+);
rs=stmt.executeQuery(select * from orderdetail where orderid=+s_orderid+ );
while(rs.next()){
String s_bookid=rs.getString(bookid);
int i_ordernum-rs.getInt(ordernum);
Statement stmt2=conn.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
stmt2.executeUpdate(update book set quantity=quantity-+i_ordernum+where bookid =+s_bookid+); }
response.sendRedirect(orderlist.jsp? op=show¤tpage=+s_currentpage);
%>
第5章 系统测试
(1) 数据库连接
在系统的整个开发工程中,我们最容易碰到的难题是数据库连接这个模块。在JavaBean中连接数据库注意的一些事项有:
1 首先要下载Microsoft SQL Server 2000 Driver for JDBC 这个包,并安装。
2把Microsoft SQL Server 2000 Driver for JDBC 的 lib文件夹下的:msbase.jar,mssqlserver.jar,msutil.jar 三个文件拷贝到Tomcat安装目录下的commen/lib文件夹下。
3 把msbase.jar,mssqlserver.jar,msutil.jar 三个文件的路径添加到CLASSPATH中。
4 如果使用的操作系统是Windows xp 在安装 SQL Server2000 后必须下载SP3补丁并安装,否则打不开1433端口号。
在数据库连接中出现问题将会出现异常提示信息:
org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NullPointerException
bookshop.run.login.execute(login.java:83)
org.apache.jsp.bookshop.admin.adm_005flogin_jsp._jspService(adm_005flogin_jsp.java:72)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
如图5-1所示:
图5-1数据库连接异常
这个时候可能出现的问题是数据库服务器没有开启,或者是没有安装Microsoft SQL Server 2000 Driver for JDBC 这个包。
(2)检测网站运行速度
一、用Ajax提高用户体验
由于我的网站上链接字体的大小是根据点击次数决定,所以每次点击都要提交到服务器端并记录次数,再在客户端打开网站链接。这在localhost测试的时候没有发现问题,但是部署到服务器上,会感到明显的等待。解决办法就是用Ajax。用户点击网站链接后就直接打开,再通过Ajax将点击的事件提交到服务器端记录。这样用户感觉不到任何延时。
二、将逻辑移到客户端的javascript中
在开始的时候,网站标签高亮”和手气不错”的功能都是提交到服务器端操作,然后返回结果的。后来,我发现其实很多逻辑是可以移到客户端,由 javascript来实现的。Javascript非常强大,可以完成很多复杂的逻辑。将逻辑移到客户端的javascript中,可以很有效的减少和服务器通讯的次数,获得更好的访问速度。
三、解决进程的
由于采用的是fastCGI的方式,我配置了django.fcgi。可是,我发现系统进程中,有大量的django.fcgi进程被标记为 < defunct>(失去功能)。这些进程会导致服务器有时无法正常访问。我开始尝试用命令来kill掉这些进程,但是很快发现这无法从根本上解决问题。后来,我看到一个老外在blog上提到一个解决方案,将django.fcgi改名为dispatch.fcgi。原来,dispatch.fcgi是一个dreamhost的系统进程,它的健壮性是可以得到保障的。果然,我将django.fcgi改名为 dispatch.fcgi后,的现象再没有出现。
四、优化SQL语句
SQL语句的执行通常也是一个很花费时间的操作。经过检查,我发现我的一条SQL语句,是一个嵌套三层的子表查询。而这条SQL还必须是一个Raw SQL,即不能采用django的OR Maping。这意味着不能被cache缓存,每次都是真刀真枪的执行。更失败的是,经过我的分析,这条SQL完全可以不执行。这是一次设计上的失误,标准的over design(过渡设计)。当时,我是想通过数据库得到一个最精确的统计值。后来发现,这个值完全可以用一个近似的常量代替。优化SQL,尤其是避免不必要的SQL执行,带来的效果是非常明显的。
第6章 总 结
本文论述了一个基于WEB的网上商品销售系统,基本上体现了电子商务各方面的优点。我所设计的网上书店,主要是熟悉和掌握JSP的技术以及对电子商务进行初步的探讨和设计。
在软件开发编码阶段我才用原型法,先设计出个一个实现简单功能的系统在更具需求一步步完善系统的功能。由于是才采用面向对象的设计所以系统中由很多类和方法,我将他们归类将经常使用的方法放在单独的类文件中,在以后的编码中只要通过对名称空间的引用就能调用他们。本系统在实现传统的网上书店功能基础上对增强系统的安全性进行了初步的尝试,但是由于这方面研究的不深所以实现的与需求还有一定的差距。
在设计和制作网上书店这一个整体项目的过程中,也培养了自己的综合能力和从全局考虑的思想。将复杂的问题简单化,作为电子商务应用的一个缩影,我所涉及的模块项目完成了其后台具有的基本功能,使自己对于电子商务的了解更加深入和明了。
当然,其中也遗留下了一些待解决的问题,但出于自己水平有限,作为一个网上书店系统,该项目上有一些不完善和函待改进之处,特别是在网站信息的安全性上需要进一步加强。
第7章 参考文献
[1]汪孝宜主编.JSP数据库开发实例精粹[M].电子工业出版社,2005,27-36.
[2] Bruce Eckel著,陈昊鹏 饶若楠等译.JAVA编程思想[M].机械工业出版社,2005,1-43.
[3]Dejan sunderic 等著.SQL server 2000高级编程技术[M].清华大学出版社,2002,50-127.
[4]四维科技主编.JSP网络编程与实例[M].人民邮电出版社,2005,3-17,192-199.
[5]张海潘编著.软件工程导论[M].清华大学出版社,2003,165-166.
[6]徐建波,周新莲.Web设计原理于编程技术[M].中南大学出版社,2005,172-238.
[7]廖疆星等著.中文Dreamweaver网页设计教程[M].冶金工业出版社,2003,14-128.
第8章 致 谢
经过两个多星期的课程设计,基本开发完成了网上书店。本系统功能还不是十分的完善,但基本上能完成用户在网上购买书籍。其主要功能有用户登录,书籍查询,购物车,以及订单处理等功能。
通过课程设计我学到了很多新知识,个人能力也有了很大的提高。在设计中经常遇到种种困难与挫折,几次陷入停顿状态。在这种情况下,感谢同学在设计上提出的很多正确的建议和善意的批评。
不过对我们来说,由于时间有限,也包括我们的知识水平有限,系统中有不足之处,还请旷老师指导指正。
前台用户
管理个人信息
前台订单处理
浏览信息
购物
用户管理
后台订单
管理
商品管理
系统管理员
订购
用户
订单列表
订单
图书
图书
图书编号
图书名称
分类编号
封面
用户
用户名
密码
用户编号
E-mail
订单
订单编号
用户编号
图书编号
订购数量
订单列表
订单号
用户编号
图书编号
是否付款

基于JSP网上书店系统的设计与实现相关推荐

  1. [内附完整源码和文档] 基于JSP网上招聘系统的设计与实现

    摘 要 随着时代的发展,中国的互联网技术愈加成熟,已经有越来越多的社会群体开始学会使用互联网技术,整个社会正在朝着智能化.信息化的方向前进.有了互联网,用户便可以足不出户地利用互联网技术使得自己的生活 ...

  2. 基于JSP网上饰品系统的设计

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye2 摘 要 JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言, ...

  3. php js毕业论文,基于JS网上购物系统的设计与实现毕业论文.doc

    基于JS网上购物系统的设计与实现毕业论文 存档编号: 毕业论文(设计) 题目: 基于JSP网上购物系统的设计与实现 专 业: 计算机科学与技术 院 系: 计算机学院 年 级: 2011 学 号: 07 ...

  4. JSP网上书店系统用myeclipse定制开发mysql数据库B/S模式java编程计算机网页

    一.源码特点     JSP 网上书店系统 是一套完善的系统源码,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发.研究的基本内容是基于网上书店系 ...

  5. java开发网页调查问卷_基于jsp(java)问卷调查系统的设计和开发

    基于jsp(java)问卷调查系统的设计和开发 毕业设计(论文)基于 jsp(java)问卷调查系统的设计和开发姓 名系 别 . 专 业导 师 姓 名 . 职 称完 成 时 间独创性说明作者郑重声明: ...

  6. 基于hibernate和struts的网上书店系统的设计与实现

    技术:Java.JSP等 摘要: 在互联网快速发展的带动下,电子商务也得到了快速发展.本设计实现的是一个简单的B2C网上书店系统即卖书的电子商务网站,本论文就此网上书店系统进行详细全面的论述. 本设计 ...

  7. Java、JSP网上书店系统

    技术:Java.JSP等 摘要: 随着全球经济一体化的发展和电子商务的兴起,各行业之间的竞争将越来越激烈.网络及电子商务的迅猛发展突破了时间.空间的局限性,给企业带来了更多的发展机会,同时也增大了公司 ...

  8. 【计算机毕业设计】基于jsp网上书店(源代码+论文)

    网上书店系统 1.需求分析. 参考设计要求,及可行性的分析,我们确定了如下的需求: 1.数据库设计科学合理. 2.网站主页面简洁美观,可以天蓝色为主色调. 3.网站主页显示各个分类的及总的畅销表.新书 ...

  9. Java、JSP网上商城系统的设计

    技术:Java.JSP等 摘要: 1.1课题背景 全球网络销售的盛行,互联网的兴起已经完全改变了商品市场,当国内各大型互联网公司出现,就衍生出互联网产品的销售,并通过网络进行管理.随着全社会的进步,实 ...

最新文章

  1. c++ softmax sigmoid
  2. python中关键字参数含义_python中接受任意关键字的参数
  3. 蛋花花简单阐述HTML5和Web前端的区别
  4. clone下来的代码push到自己的远程仓库中
  5. IBM收购Clearleap,提供云视频服务
  6. MB1A MB1B MB1C MB11 MIGO的区别解析
  7. 每天学一点儿shell:xargs 命令
  8. VS 2010 开发 ActiveX 开始篇
  9. css hack的使用
  10. python新手入门代码-Python的初学者你现在可以自己quot;看”到代码的运行了!
  11. 微信取消分享后还是执行成功函数
  12. 为什么用户在注册时需要使用邮箱或手机号作为注册名?
  13. java语法正则表达式_详解Java正则表达式语法
  14. 使用Qt做一个简单计算器
  15. 【已解决】LaTeX 调整段落之间的间距 (包含:只调整某一个section或者subsection中的段落间距)
  16. NVIDIA Jetson之远程控制软件NoMachine安装使用
  17. MySQL练习题全部
  18. BP神经网络以及python实现
  19. 用Java模拟一个银行ATM系统
  20. 基于vue-cli快速构建

热门文章

  1. mongodb pymongo
  2. 220413数据分析总结
  3. 2022-08-15 第六小组 瞒春 学习笔记
  4. ArcFace[2019-CVPR]
  5. call apply bind 的作用和区别
  6. 【内外网映射】通过外网ip来访问虚拟机服务器【原创】
  7. 精英主义 遗传算法 matlab,遗传算法优化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 如何在微信里使用计算机,怎么用电脑上微信?教你用电脑如何玩转微信
  9. 数字人民币来了,它到底是什么?
  10. 基于kmeans聚类算法的微博舆情热点事件分析系统