您的当前位置:首页正文

基于jsp的购物车系统

2020-05-22 来源:个人技术集锦


Web系统开发与设计期末报告

班 级 10金融信息 学 号 ********** 姓 名 褚腾燕 指导教师 张琼妮

浙江财经学院东方学院教务部制

Web论文

摘要:本文基于Web技术下,研究并实现了网上购物功能以及后台管理功能。并对购物车系统进行设计的总体规划,同时详细地分析了基于 Web平台的购物车的系统结构及功能划分 ,进而对各子系统进行了具体设计 。 关键词:购物车;Web ;数据库

一、需求分析

网络购物车是现在广泛用于网上购物的工具之一。购物车主要提供了基本的用户注册,用户登录,增删物品,统计价格等功能。用户在使用购物车时,可以方便的使用这些简易的功能。

1.功能需求

从部署的位置来看,本项目可以分为服务器端和客户端。

服务器端的应用主要是起管理作用,用户端发送的所有消息都将被发送到服务器端,经过服务器端的出来后,服务器端可以选择将消息丢弃或者转发。 用户端的应用分成三种。第一种是提供基本的登录界面,在登录界面中应该有服务器地址选择、服务器端口选择以及用户登录昵称等信息;第二种是想服务器发送消息,比如用户注册,用户登录、用户退出、添加物品,删除物品,统计价格等消息;第三种是响应服务器的消息,即当接收到服务器端方式的消息后,采取响应的动作。比如当用户端收到服务器端发送的添加物品的消息后,用户端应该从消息中提取添加物品的信息,并将信息按要求添加到适当的位置。 综上所述,本系统需要提供一下的界面和功能:

(1)用户注册。当用户第一次使用购物车时,提供用户注册界面,以便后期进行各种购物车功能

(2)在用户端提供登录界面,支持服务器的选择,并提供所选择服务器的端口号,以及基本的登录昵称的输入。

(3)提供一个完整的网络消息协议的设计以及实现。该消息协议应包括登录消息、添加物品、删除物品、统计价格等。每一种网络消息都应该有响应处理以及回复的方法。

(4)在客户端提供购物车页面。用户在购物车页面可以进行添加、删除等

操作,并可以实时统计价格。

(5)在服务器端提供消息出来机制。对客户端发送的各种消息,服务器端应该在进行分析后,进行响应的处理。

2.系统结构设计

系统结构图如下所示:

网上购物 一般用户 网站布局 管理员进入 一般用户登录 用户注册 用户注销 商品管理 用户管理 商品搜索 我的购物车 添加到购物车 进入结算 3用户信息查维护

系统的后台程序会自动记录每个用户在登录网站后进行的所有操作,包括查询和订购信息。这些信息对以系统的管理员都是珍贵的数据,系统分析程序可以根据用户的查询记录判断该客户的喜好,可以根据用户的购买情况判断该用户的经济情况。系统后台程序可以根据分析的结果自动得出给该用户的推荐商品,在用户登录时显示在醒目的位置。

4.开发及运行环境

(1) 硬件平台

CPU: Pentium 4 2.0GHz以上

内存:512MB以上容量

显卡:32MB或以上显存之AGP接口显卡

(2) 软件要求

操作系统:Microsoft Windows XP 运行环境:Tomcat/ jdk1.6 开发工具:MyEclipse ,MySQL-Front

二、数据流程图

显示所有商品: 将某商品添加到购物车:

V(视图) index.jsp getAllGoods.js p M(模型)V(视图)M(模型)请求调用GetAllGoodsS返回结果ervletgetAllGoods.jsp请求调用返回结果GoodsBeanGoodsBeanAddToCartServlet调用返回CartManager返回调用显示结果cart.jsp显示购物车ItemBean

生成订单: 图片的上传和显示:

V(视图)M(模型)V(视图)M(模型)cart.jspc_add.jsp请求AddGoodsServlet调用返回GoodsBeanbyinfo.jsp请求BuyServlet调用返回OrderBean否成功否?是c_manager.jspuserinfo.jsp是成功否?发出请求ShowGoodsServlet显示信息调用返回cart.jsp否showgoods.jsp付款 下单(查询、修改订) 订单管理 1. 一般用户 2. 网上购物系统 订单反馈 3. 管理员 系统管理 发货

2.1.1 网上购物系统顶层图

1.1未登录 注册注册失败验证失败 登录 1.3登录验证 验证成功 查询、修改订单 下订单 订单反馈 1.4注册验证 注册成功 1.2已登录 注册成功 1.5个人信息查询、修改 一般用户信息记录

2.1.2 网上购物系统(会员)

订单 查询、修改订单 2.1 订单管理系统 2.2 界面管理系统 管理员 2.3 注册用户管理系统

2.1.3 网上购物系统图(购物系统)

2.3.1 浏览、修改用户信息 2.3.2 浏览、修改普通管理员信息 用户信息记录文件 管理员信息记录文件

2.1.4 网上购物系统图(注册会员管理系统)

订单记录文件 管理员信息记录文件 3.2 个人信息修改 3.1管理员 已无库存 3.2 管理员 订单管理系统 注册会员管理系统

2.15 网上购物系统图(管理员系统)

三、ER图

3.1 用户ER图

3.2 商品ER图

3.3 用户和商品、订单之间的局部ER图

图3.3 用户和商品、订单之间的局部ER图

3.4 各实体之间总体ER图

图3.2 各实体之间总体ER图

四.数据库模块设计

根据需求分析以及功能需求,我们得出我们的购物网站的总体框架以及程序的实际运用流程.

4.1基于MVC的应用开发模型

在传统的基于Web的应用系统中,例如ASP,CGI等,通常开发者将业务逻辑,数据逻辑、展示逻辑等混杂在一起,在同一个界面面里既进行后台数据库的访问和操作,同时还包含业务流程和页面表示。这样编写出来的程序,既不利于程序员对业务代码的调试,同时也不利于编辑人员进行交互页面的设计。同时系统也不具备可扩展性,当我们要在现有业务上进行扩展的时候,通常无法借助于现有的资源和应用,而只能够重新编写,大大增加了投资,延长了系统上线的时间,失去了竞争市场的优势。

在本网上购物系统中,将采用通行的MVC模式来构建应用。这种结构解决了前面所述的所有问题,在我们的应用集成网络中,通过企业级高端J2EE应用服务器实现MVC开发模型。

输入请求 Control 服务控制 输出 View 显示方式 Html Model 业务逻辑模型 其他

通过这种方案,我们可以迅速地实现整个业务,其优势和特点如下: Model(模型)层:由JavaBean组件来实现,JavaBean将具体的业务封装在组件内部,具备安全、高性能、可重用等优秀的特征。

View(视图)层:由JSP组成。这一层次的特点是能够真实地展示和客户交

互的界面,具备可描绘的功能。同时能够嵌套动态数据,可以进行动态页面的展示。同时可以方便地进行客户端的个性化定制。根据每个客户的需求来展示不同风格的界面。

Controller(控制器)层:是非常重要的一层,这一层是连接View和Model的纽带,同时也是将这两层进行最大限度分离的工具。通常由Servlet来实现,Servlet和JSP虽然同样都属于页面展示工具,但分属两层。主要在于JSP以脚本语言的形式存在, 它的主要优势是进行动态数据的Web展示,而Servlet是一个完整的Java程序,进行业务的调用和流程的处理是它的长处。

4.2平台功能模块的设计分析

平台功能的分析基础上,我认为购物车应该有两个平台的设计,即前台用户设计与后台的管理者设计,由此得到本平台的功能模块图如图3-1所示:

网上购物系统 前台功能 后台功能 用户管理 订 单 管 理 购物车管理 管理员身份验证 商品管理 用户信息管理

前台设计:用户进入网上购物平台,用户可以注册,然后登录后可以进行个人信息修改与注销,用户可以通过商品搜索,找到自己想要产品,然后添加到购物车,

后台设计:管理员可以通过后台登录进去进行用户管理,商品管理,在用户管理中,可以对用户进行添加删除,在商品管理中可以对商品进行添加修改。

五.数据库表结构设计

5.1manage(管理员表) 功能 用户id 用户名 性别 生日 籍贯 字段名 id username gender birthday nativeplace 字段类型 varchar varchar char date varchar char 用户类型 type

5.2 Goods(商品表)

功能 商品id 商品名称 商品价格 商品数量 商品介绍 图片存储位置 商品图片 cpic blob 字段名 cid cname cprice cnumber cintro cimage 字段类型 varchar varchar float int text varchar 5.3 orderstable(订单表) 功能 字段名 字段类型 收货人姓名 receivename varchar 电话号码 邮编 付款方式 tele zipcode paymode char char char 功能 订单id 用户名 订单日期 订单状态 地址

字段名 orderid username 字段类型 varchar varchar orderdate date orderstate char address varchar 5.4 orderlist(订单信息表) 功能 订单id 商品id 数量 字段名 orderid cid quantity 字段类型 varchar varchar int 5.5 users(用户信息表) 功能 用户id 字段名 userrid 字段类型 int varchar varchar char Date varchar 用户姓名 Username 密码 性别 Userpass Gender 出生日期 Birthdate 籍贯

Nativeplace

六.各模块的运行界面与实现代码

6.1注册设计

如果用户还不是会员则提示用户进行注册,用户提交信息之后,系统开始判断用户的注册信息是否有效,首先是用户名是否为空,(该处存在用户名命名规

则的问题,后面问题中会详细解决)用户输入的两次密码是否一致,然后依次往后判断用户所填写的各项信息是否符合要求,直到所有信息均正确无误,系统将该用户注册信息写入用户表即user并提示用户注册成功,2秒跳转到个人主页,就可以进行有效的购物了。

注册页面的效果图如下图5-1所示:

系统对用户的注册详细代码实现如下:

 

用户注册

用户名
密码
重置密码class=\"style2\"/>
性别

出生日期
籍贯

提交\" />
S
<%

if(session.getAttribute(\"reg_msg\")!=null) out.println(session.getAttribute(\"reg_msg\")); %>

返回首页

这一请求通过regservlet进行接收,并对信息验证,对用户进行响应:

public void doGet(HttpServletRequest request, HttpServletResponse

throws ServletException, IOException {

response)

String

System.out.println(username);

String userpass=request.getParameter(\"userpass\"); String

String birthdate=request.getParameter(\"birthdate\"); String

String url=\"jdbc:mysql://localhost:3306/mytest\"; String user=\"root\"; String password=\"123456\";

String sql=\"select * from users where username='\"+username+\"'\"; //创建各个对象

Connection conn=null; //建立数据库连接的对象

Statement stmt=null; //创建用于执行SQL语句的Statement对象 ResultSet rs=null; //创建结果集对象

HttpSession session=request.getSession(); try{

//建立连接并执行语句

conn=DriverManager.getConnection(url, user, password); stmt=conn.createStatement(); rs=stmt.executeQuery(sql); //其它操作

if(rs.next()) { } else {

StringBuffer newsql=new StringBuffer();

newsql.append(\"insert into users (username, userpass, newsql.append(username); newsql.append(\"','\"); newsql.append(userpass);

session.setAttribute(\"reg_msg\", \"用户已经存在,请重新注册!\"); response.sendRedirect(\"reg.jsp\");

username=Tools.CodeToString(request.getParameter(\"username\"));

gender=Tools.CodeToString(request.getParameter(\"gender\"));

nativeplace=Tools.CodeToString(request.getParameter(\"nativeplace\"));

//省略号表示要输入具体的sql语句

gender,birthdate,nativeplace) values ('\");

}

newsql.append(\"','\"); newsql.append(gender); newsql.append(\"','\"); newsql.append(birthdate); newsql.append(\"','\"); newsql.append(nativeplace); newsql.append(\"')\");

stmt.executeUpdate(newsql.toString()); session.setAttribute(\"msg\", \"用户注册成功!\"); session.setAttribute(\"username\",username); response.sendRedirect(\"regMsg.jsp\");

}catch(SQLException se){

throw new ServletException(se); }finally{

try{rs.close();}catch(SQLException se){} try{stmt.close();}catch(SQLException se){} try{conn.close();}catch(SQLException se){} } }

6.2登陆设计

用户登陆模块是防止非法用户登陆的第一道防线,通过它可以保护后台数据库的安全性,当用户要进行定购时,首先要进入的就是身份验证界面,只有在密码正确的情况下才能进行以后的购物,如果输入的密码不正确,则不能进入购物界面。如果用户以浏览者的身份进入网站,则只能进行一般的商品浏览,而不能进行选购,在点击任一按钮后,系统会判断该用户是否是登陆用户,如果不是则弹出提示页面,提示用户必须先登陆才能购物。

登陆的具体实现要通过一个全程变量,即Session变量来实现,在系统中则单独的一个loginservlet页面来放置该session。用户登录的界面login.jsp,从user表查得用户提交的帐户名和密码正确后,用一个全局变量,即Session变量保存这一消息(该变量名称为Session(“username”))。示意图如图5-2所示

由于首页中包含了不止登陆界面一个模块,便于理解期间,就显示登陆的具体代码如下:

用户名:


密  码:

 

   

注册 注销

管理员登录

而loginservlet响应信息代码为:

if(rs.next()){

session.setAttribute(\"username\",username); session.setAttribute(\"msg\",\"登录成功!\");

}else{

session.setAttribute(\"msg\",\"用户名或密码错误!\"); }

response.sendRedirect(\"regMsg.jsp\");

}catch(SQLException se){

}

throw new ServletException(se);

try{rs.close();}catch(SQLException se){} try{stmt.close();}catch(SQLException se){} try{conn.close();}catch(SQLException se){}

}finally{

6.3购物车设计

6.3.1 商品显示实现

当用户登陆成功以后,如果想进入购物,就进入所有商品界面,在点击物品右边的添加到购物车,系统会弹出一个新的页面,显示该物品已经添加进购物车,然后用户需要选择定购的数量。其中所有商品页面效果如图5-3所示:

主要代码如下:

所有商品

第一页

上一页

下一页

最后一页


GetallGoods显示商品信息主要代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)

}

String pageNo=request.getParameter(\"pageNo\"); int iPageNo=1; if(pageNo!=null) {

iPageNo=Integer.parseInt(pageNo); }

Goods g=new Goods(); ArrayList goods=null;

goods=g.getGoodsByPage(iPageNo); int pageCount=g.getPageCount(); request.setAttribute(\"goods\",goods);

request.setAttribute(\"pageNo\",new Integer(iPageNo)); request.setAttribute(\"pageCount\",new Integer(pageCount)); String forward=\"goodslist.jsp\";

RequestDispatcher rd=request.getRequestDispatcher(forward); rd.forward(request,response);

throws ServletException, IOException {

对于在数据库中添加购物车,通过addtocart来实现:

try{

String cid=request.getParameter(\"cid\");

CartManager cartManager=new CartManager(); HttpSession session=request.getSession(true);

ArrayList cart=(ArrayList)session.getAttribute(\"cart\"); cartManager.setCart(cart); Goods g=new Goods(); g=g.findGoodsById(cid); cartManager.addToCart(g,1);

session.setAttribute(\"cart\",cartManager.getCart()); }catch(Exception e) { }

response.sendRedirect(\"cart.jsp\");

6.3.2 购物车实现

点击添加到购物车后,页面跳转到购物车,该物品信息被后台添加到购物车表即

goods表中,如果用户需要继续购物,可以继续选择,不断添加,系统会自动将所有信息写入goods表,同时显示用户所购买的物品列表,及价格。如下图5-4:

购物车中的信息

清空购物车 继续购物 进入结算

物品编号 物品名称 物品价格 商品图片 操作

修改购物车商品数量与删除商品则由processcart来实现:

public void doGet(HttpServletRequest request, HttpServletResponse response)

}

if(action.equals(\"修改\")) { { }

response.sendRedirect(\"cart.jsp\");

cartManager.update(cid,Integer.parseInt(quantity)); { }

session.setAttribute(\"cart\",cartManager.getCart());

cartManager.delete(cid);

}else

try{

String cid=request.getParameter(\"cid\"); String action=request.getParameter(\"action\"); action=new String(action.getBytes(\"8859_1\")); String quantity=null; if(action.equals(\"修改\")) {

quantity=request.getParameter(\"quantity\"); }

throws ServletException, IOException {

CartManager cartManager=new CartManager(); HttpSession session=request.getSession(true);

ArrayList cart=(ArrayList)session.getAttribute(\"cart\"); cartManager.setCart(cart);

}catch(Exception e)

6.3.3 订单生成与结算实现

当用户选择进入结算后,系统会自动跳转到生产订单界面,包括姓名、地址、邮编、电话、付款方式在这个界面对收货人信息进行输入。如下图5-5:

添加用户订单信息

物品编号 物品名称 价格 数量操作

class=\"s1\" size=\"22\">

size=\"22\">

class=\"s1\" size=\"22\" >

value=\"货到付款\" checked>货到付款

网上付款

收货人姓名:
电话号码:
地    址:
邮    编:
付款方式:class=\"s1\" size=\"22\">
class=\"s1\" value=\"提交\"/>   

处理收货人信息是用buyservlet来对用户响应如图5-6:

public void doPost(HttpServletRequest request, HttpServletResponse response) );

ob.setPaymode(Tools.CodeToString(request.getParameter(\"paymode\"))ob.setReceivename(Tools.CodeToString(request.getParameter(\"receiv

ob.setTele(request.getParameter(\"tele\")); ob.setZipcode(request.getParameter(\"zipcode\"));

ename\")));

ob.setAddress(Tools.CodeToString(request.getParameter(\"address\"))ob.setUsername(Tools.CodeToString(request.getParameter(\"username\")));

throws ServletException, IOException { response.setContentType(\"text/html\"); OrderBean ob=new OrderBean();

);

java.util.Date day=new java.util.Date();

SimpleDateFormat format=new SimpleDateFormat(\"yyyyMMdd\"); String orderdate=format.format(day);

String now=(String)(day.toLocaleString()); String sql=\"select count (*) from ordertable where orderdate='\"+orderdate+\"'\";

DB db=new DB(); ResultSet rs=null; int i=0; try{

rs=db.executeQuery(sql); if(rs.next()){ } i++;

i=Integer.parseInt(rs.getString(1));

}catch(Exception e){e.printStackTrace();} finally{db.close();}

String str_i=String.valueOf(i); while(str_i.length()<3){ str_i=\"0\"+str_i; }

String orderid=now+str_i;

orderid=orderid.replace(\"-\",\"\"); orderid=orderid.replace(\" \",\"\"); orderid=orderid.replace(\":\",\"\");

PreparedStatement pstmt=null; Connection conn=null; int mark1=0; int mark2=0;

String sql1=\"insert into ordertable

String sql2=\"insert into orderlist values(?,?,?)\"; try{

conn=DriverManager.getConnection

values(?,?,?,?,?,?,?,?,?)\";

6.4后台管理模块的实现

网上购物系统除了能够让用户实现前台的浏览和购物等操作之外,还必须能够使管理人员能够对系统的各种信息进行维护,比如商品的增加、删除、修改,用户的管理等等。管

理功能是网上购物系统相当重要的一部分功能。

管理员可以通过主页面的“后台管理”进入系统后台进行维护,点击之后,首要的就是进行身份验证,输入正确的帐号,密码之后,方能进入。由于涉及到交易,出于安全性考虑,管理员帐号应尽量少分配,密码也要尽量复杂,经常更换。

这个过程中,点击登录后,将用户名和密码框中的值传递到mlogin.jsp中进行验证,如果用户名和密码同数据库中的一致,那么登录成功,转到c_manage.jsp页面中。具体实现关键代码如下:

try{

String cid=request.getParameter(\"cid\"); CartManager cartManager=new CartManager(); HttpSession session=request.getSession(true);

ArrayList cart=(ArrayList)session.getAttribute(\"cart\"); cartManager.setCart(cart); Goods g=new Goods(); g=g.findGoodsById(cid); cartManager.addToCart(g,1);

session.setAttribute(\"cart\",cartManager.getCart()); }catch(Exception e) { }

response.sendRedirect(\"cart.jsp\");

若管理员需要对用户进行管理,则会跳转到showuser.Jsp来显示所有用户,若

想对商品进行管理,可以添加商品到c_add.jsp,如图5-7:

AddGoodsServlet对这一界面进行处理信息,并响应信息:

public void doGet(HttpServletRequest request, HttpServletResponse response) 式

su.upload(); //上传文件

Request req=su.getRequest(); //创建Request对象 String cid=req.getParameter(\"cid\"); String cname=req.getParameter(\"cname\"); String number=req.getParameter(\"cnumber\"); String price=req.getParameter(\"cprice\"); String cintro=req.getParameter(\"cintro\"); //格式转换

int cnumber=Integer.parseInt(number); float cprice=Float.parseFloat(price);

throws ServletException, IOException { PreparedStatement pstmt=null; Connection conn=null;

String ext=\"\",info=\"\",forword=\"\", url=\"upload/\"; SmartUpload su=new SmartUpload(); //创建新的上传对象 long maxsize=200*1024; //设置每个上传文件最大为200KB String forward; try{

su.initialize(this.getServletConfig(), request, response); su.setMaxFileSize(maxsize); //限制上传文件的大小

su.setAllowedFilesList(\"jpg,JPG,gif,GIF\"); //设定允许上传的格

//初始化

//获取上传的文件,因为只上传了一个文件,所以可直接获取 com.jspsmart.upload.File myfile=su.getFiles().getFile(0);

if(!myfile.isMissing()){

ext=myfile.getFileExt(); //取得扩展名 Calendar cal=Calendar.getInstance();

String filename=String.valueOf(cal.getTimeInMillis()); String saveurl=request.getRealPath(\"/\")+url;

saveurl+=filename+\".\"+ext; //saveurl为保存图片的绝对路径 String cimage=url+filename+\".\"+ext; int cmark=0;

String sql=\"insert into DB db=new DB(); conn=db.createConn(); conn.setAutoCommit(true);

pstmt=conn.prepareStatement(sql); pstmt.setString(1,cid); pstmt.setString(2,cname);

goods(cid,cname,cnumber,cprice,cintro,cimage) values (?,?,?,?,?,?)\";

}

}

pstmt.setInt(3,cnumber); pstmt.setFloat(4,cprice); pstmt.setString(5,cintro); pstmt.setString(6,cimage); cmark=pstmt.executeUpdate(); if(cmark==1){ } }else{ }

info=\"请选择要上传的文件!\"; forward=\"c_add.jsp\";

//将文件保存到指定目录中

myfile.saveAs(saveurl,SmartUpload.SAVE_PHYSICAL); info=\"添加成功!\";

forward=\"goods.jsp\"; info=\"添加失败!\";

forward=\"c_add.jsp\";

}else{

catch(Exception e){ e.printStackTrace(); info=\"添加异常!\"; forward=\"c_add.jsp\"; }finally{

try {pstmt.close();}catch(Exception e){} try {conn.close();}catch(Exception e){} }

request.setAttribute(\"info\",info);

RequestDispatcher rd=request.getRequestDispatcher(forward); rd.forward(request,response);

七、实验总结

通过这两周的WEB购物车设计,使我们从中受到很大的教育和练习,不仅将大学所学的知识进行了实际应用,还学到了很多书本上学不到的知识。开阔了视野,增长了知识,积累了一些经验和教训。充分锻炼了自己的动手和应用能力,真正做到了理论联系实际。

我们设计的购物车系统,功能虽然简单了点,但我们还是很用心的在弄的。由于整个课程设计时间比较仓促,所以该系统还有许多不尽如意的地方,对某些功能的细节设计还缺乏完备性,缺乏对系统整体进行周密的考虑以及界面美化等等多方面问题。这些都有待于进一步的改善。

本次程序我主要负责的是显示所有商品、将某商品添加到购物车、论文中负责需求分析,数据流程图,ER图的设计和美化部分页面。显示所有商品和将某商品添加到购物车中,因为书本中有大部分的程序并且刚开始由老师带着我们一起做,一开始问题比较少,问题主要出现在后期,因为一个个小问题就会导致程序不能运行,代码的编写要非常细致。

最后,我们要感谢老师的关心、指导和教诲。再次向所有关心、帮助、理解、支持我们做好WEB设计的老师和同学们致以深深的谢意,感谢你们的帮助和关爱!

因篇幅问题不能全部显示,请点此查看更多更全内容

Top