购物车shop
前台
包括用户注册,登录
Html +js+jsp考虑自动登录(cookie实现 登录页面)
进入购物页面购物(数据均来自数据库),商品展示页面shop.jsp显示如下(大概显示效果如下,为了界面美观,可以加入相应的商品图片 )(该页面相当于游客页面)
1.点击”加入购物车” 的同时,要将数据(订单项的集合)保存到session中,再转入下图购物车页面cart.jsp(必须登录才能进)(大概效果如下)[从session中取出订单项集合]
其中商品数量可以在修改数量以后点击【修改】按钮进行修改
删除按钮则可以删除该购买商品(必须有提示)
点击继续购物后应该转入购物页面继续购物
点击结算后应该转入结账页面,提示用户当前购物车总金额,并清空购买信息。
订单项组成:商品基本信息Goods 数量num 单个商品的总价sumprice
后台
包括对商品的管理(考虑删除的真正含义)以及 分页 下架 状态列0 1
包括对用户的管理(考虑删除的真正含义)以及 分页
**思考订单&订单项(一个订单可以包含多个订单项)的概念
解决两个问题:订单项覆盖问题 加同一个商品重复问题
涉及的技术点:JDBC
Entity:
--Goods
--User
Session:购物车(增删改查)
二、JSP 页面实现(临时性购物车项目) 第一部分:images(图片)
第二部分:SQL代码
--数据库设计 CartDB
--创建商品表
create table goods
(
gid --商品编号
gname --商品名称
gprice --商品单价
ginfo --商品描述信息
gpath --商品图片路径
)
--插入具体的数据
insert into goods values(1,'mp31',100,'mp31','images/1.jpg') ;
insert into goods values(2,'mp32',1200,'mp32','images/2.jpg') ;
insert into goods values(3,'mp33',100,'mp33','images/3.jpg') ;
insert into goods values(4,'mp34',1600,'mp34','images/4.jpg') ;
insert into goods values(5,'mp35',1500,'mp35','images/5.jpg') ;
insert into goods values(6,'mp36',1400,'mp36','images/6.jpg') ;
insert into goods values(7,'mp37',1700,'mp37','images/7.jpg') ;
insert into goods values(8,'mp38',1300,'mp38','images/8.jpg') ;
insert into goods values(9,'mp39',1500,'mp39','images/9.jpg') ;
insert into goods values(10,'mp310',1600,'mp310','images/10.jpg') ;
insert into goods values(11,'mp311',1600,'mp311','images/11.jpg');
第三部分:代码
实体层(entity):
1.entity 包 (package com.zking.goods.entity;)
1.1 Users.java (用户实体类)
package com.zking.goods.entity;
public class Users {
private int cid;
private String cname;
private String cpwd;
private int urole;
private float cmoney;
public Users() {
// TODO Auto-generated constructor stub
}
public Users(int cid, String cname, String cpwd, int urole, float cmoney) {
super();
this.cid = cid;
this.cname = cname;
this.cpwd = cpwd;
this.urole = urole;
this.cmoney = cmoney;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getCpwd() {
return cpwd;
}
public void setCpwd(String cpwd) {
this.cpwd = cpwd;
}
public int getUrole() {
return urole;
}
public void setUrole(int urole) {
this.urole = urole;
}
public float getCmoney() {
return cmoney;
}
public void setCmoney(float cmoney) {
this.cmoney = cmoney;
}
@Override
public String toString() {
return "Users [cid=" + cid + ", cname=" + cname + ", cpwd=" + cpwd + ", urole=" + urole + ", cmoney=" + cmoney
+ "]";
}
}
1.2 Goods.java (商品实体类)
package com.zking.goods.entity;
public class Goods {
private int gid;
private String gname;
private float gprice;
private String ginfo;
private String gpath;
public Goods() {
// TODO Auto-generated constructor stub
}
public Goods(String gname, float gprice, String ginfo, String gpath) {
super();
this.gname = gname;
this.gprice = gprice;
this.ginfo = ginfo;
this.gpath = gpath;
}
public Goods(int gid, String gname, float gprice, String ginfo, String gpath) {
super();
this.gid = gid;
this.gname = gname;
this.gprice = gprice;
this.ginfo = ginfo;
this.gpath = gpath;
}
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public float getGprice() {
return gprice;
}
public void setGprice(float gprice) {
this.gprice = gprice;
}
public String getGinfo() {
return ginfo;
}
public void setGinfo(String ginfo) {
this.ginfo = ginfo;
}
public String getGpath() {
return gpath;
}
public void setGpath(String gpath) {
this.gpath = gpath;
}
@Override
public String toString() {
return "Goods [gid=" + gid + ", gname=" + gname + ", gprice=" + gprice + ", ginfo=" + ginfo + ", gpath=" + gpath
+ "]";
}
}
1.3 Cart.java (购物车实现类)
package com.zking.goods.entity;
public class Cart {
private Goods goods;//对象:包含商品所有属性
private int ccount;//数量 单个商品的数量
private float ctotal;//单个商品的总价格
public Cart() {
// TODO Auto-generated constructor stub
}
public Cart(Goods goods, int ccount, float ctotal) {
super();
this.goods = goods;
this.ccount = ccount;
this.ctotal = ctotal;
}
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
public int getCcount() {
return ccount;
}
public void setCcount(int ccount) {
this.ccount = ccount;
}
public float getCtotal() {
return ctotal;
}
//计算总价格
public void setCtotal() {
this.ctotal = this.getGoods().getGprice() * this.getCcount();
}
@Override
public String toString() {
return "Cart [goods=" + goods + ", ccount=" + ccount + ", ctotal=" + ctotal + "]";
}
}
数据库访问包utils (package com.zking.goods.utils;)
1.1 BaseDao.java 万能增删改查方法(简易)实现类
package com.zking.goods.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
//protected 访问控制符 受保护的
protected Connection conn =null;
protected PreparedStatement ps = null;
protected ResultSet rs = null;
/**
* 方法功能:通用增删改方法
*/
public int executeUpdate(Connection conn,String sql,Object...x) {
int n = 0;
try {
// a.获取数据库连接
conn = DBHelper.getConn();
// b.sql传入方法返回执行对象
ps = conn.prepareStatement(sql);
//新增的sql语句 有占位符
if(null!=x) {
//拿到可变参数中的2个值
for(int i = 0;i
1.2 DBHelper.java 数据库帮助类
package com.zking.goods.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* 数据库帮助类
*
* @author Administrator
*
*/
public class DBHelper {
private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
// 1.加载驱动 静态代码块进行封装 优先级别最高(静态代码块>普通代码块>构造函数)
static {
try {
// OracleDriver
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
e.printStackTrace();
}
}
// 2.建立数据库连接
public static Connection getConn() {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, "scott", "123");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
// System.out.println(DBHelper.getConn());
}
// 3.关闭服务
/**
* 方法功能:数据库服务关闭
*
* @param conn
* 连接对象
* @param ps
* 执行对象
* @param rs
* 结果集对象
*/
public static void myClose(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (null != conn && !conn.isClosed()) {
conn.close();
}
if (null != ps) {
ps.close();
}
if (null != rs) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
业务逻辑层 BBL(biz|services): 1.biz包代码 (package com.zking.goods.biz;) IGoodsBiz.java (商品方法定义接口)
package com.zking.goods.biz;
import java.util.List;
import com.zking.goods.entity.Goods;
public interface IGoodsBiz {
List queryGoodsAll();
/**
* 根据商品编号获取对应的信息
*/
Goods getGoodsByCid(int nid);
}
2.biz包中的impl包代码 (package com.zking.goods.biz.impl;) GoodsBizImpl.java (商品方法实现类命名)
package com.zking.goods.biz.impl;
import java.util.List;
import com.zking.goods.biz.IGoodsBiz;
import com.zking.goods.dao.IGoodsDao;
import com.zking.goods.dao.impl.GoodsDaoImpl;
import com.zking.goods.entity.Goods;
public class GoodsBizImpl implements IGoodsBiz {
//实例化数据访问层的dao
IGoodsDao igd = new GoodsDaoImpl();
@Override
public List queryGoodsAll() {
return igd.queryGoodsAll();
}
@Override
public Goods getGoodsByCid(int cid) {
return igd.getGoodsByCid(cid);
}
}
数据访问层 DAL (dao):
1.dao包代码(package com.zking.goods.dao;)
1.1 IGoodsDao.java (商品方法定义接口)
package com.zking.goods.dao;
import java.util.List;
import com.zking.goods.entity.Goods;
public interface IGoodsDao {
List queryGoodsAll();
/**
* 根据商品编号获取对应的信息
*/
Goods getGoodsByCid(int cid);
}
1.2.dao包中的impl包(package com.zking.goods.dao.impl;) GoodsDaoImpl.java (商品方法实现类)
package com.zking.goods.dao.impl;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zking.goods.dao.IGoodsDao;
import com.zking.goods.entity.Goods;
import com.zking.goods.utils.BaseDao;
public class GoodsDaoImpl extends BaseDao implements IGoodsDao {
@Override
public List queryGoodsAll() {
// 集合
List list = new ArrayList();
// 查看所有的sql语句
String sql = "select * from goods";
// 通过继承的方式 来到通用查询方法
ResultSet rs = this.executeQuery(sql);
try {
while (rs.next()) {
list.add(new Goods(rs.getInt(1), rs.getString(2), rs.getFloat(3), rs.getString(4), rs.getString(5)));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public static void main(String[] args) {
// List queryGoodsAll = new GoodsDaoImpl().queryGoodsAll();
// for (Goods goods : queryGoodsAll) {
//
// System.out.println(goods);
// }
Goods goods = new GoodsDaoImpl().getGoodsByCid(1);
System.out.println(goods);
}
@Override
public Goods getGoodsByCid(int gid) {
Goods goods = null;
// 查看所有的sql语句
String sql = "select * from goods where gid = "+gid;
// 通过继承的方式 来到通用查询方法
ResultSet rs = this.executeQuery(sql);
try {
if (rs.next()) {
goods = new Goods(rs.getInt(1), rs.getString(2), rs.getFloat(3), rs.getString(4), rs.getString(5));
}
} catch (Exception e) {
e.printStackTrace();
}
return goods;
}
}
第四部分:JSP 代码 1.index.jsp 商品信息显示页面当以上这些功能都实现的时候,就可以进行以下的界面 *** 作以及界面处理的 *** 作。
<%@page import="com.zking.goods.entity.Goods"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.goods.biz.IGoodsBiz"%>
<%@page import="com.zking.goods.biz.impl.GoodsBizImpl"%>
<%@page import="com.zking.goods.entity.Users"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
Users users = new Users(1,"zz","123",1,1000);
//存储到session
session.setAttribute("users", users);
%>
zz购物商城首页
<% Users u = (Users)session.getAttribute("users"); %>
欢迎您!<%=u.getCname() %>
编号
名称
价格
描述
图片
*** 作
<%
//调用biz层显示所有的数据
IGoodsBiz igb = new GoodsBizImpl();
//调用查询所有的方法
List listGoods = igb.queryGoodsAll();
for(Goods goods:listGoods){
%>
<%=goods.getGid() %>
<%=goods.getGname() %>
<%=goods.getGprice() %>
<%=goods.getGinfo() %>
"/>
<%
}
%>
2.doShopping.jsp 购物车处理页面
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.goods.entity.Cart"%>
<%@page import="com.zking.goods.entity.Goods"%>
<%@page import="com.zking.goods.biz.impl.GoodsBizImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//将点击的商品存储到购物车容器中(session)
//设置编码
request.setCharacterEncoding("utf-8");
//获取商品编号
String id = request.getParameter("cid");
int cid = 0;
if(null!=id){
cid = Integer.valueOf(id);
}
//拿到cid 根据cid获取商品的其它信息
Goods goods = new GoodsBizImpl().getGoodsByCid(cid);
//数量默认一件
//总价格 商品的单价 * 数量(1件)
//将上面获取的信息封装到Cart实体中
Cart cart = new Cart();
cart.setGoods(goods);
cart.setCcount(1);
cart.setCtotal();
out.println(cart);
//加入购物车的版本1
//点击一个就加入一个
/* session.setAttribute("cart", cart);
response.sendRedirect("cart.jsp"); */
//加入购物车的版本2
/*
List listCarts = new ArrayList();
listCarts.add(cart);
session.setAttribute("listCarts", listCarts);
response.sendRedirect("cart.jsp");
*/
//加入购物车的版本3
//将商品加入购物车之前,先要获取购物车
//假设 假设购物车的标记 listCarts
//1.获取购物车
//session.getAttribute("listCarts"); 如果不存在 结果:null
/* List listCarts = (List )session.getAttribute("listCarts");
//List listCarts = null;
//2.判断 如果购物车为null 则创建一个
if(listCarts == null){
//创建一个购物车容器
listCarts = new ArrayList();
}
listCarts.add(cart);
session.setAttribute("listCarts", listCarts);
response.sendRedirect("cart.jsp"); */
//问题:当点击同一件商品时,如果购物车中存在,不会修改数量,只会重新添加
//解决这个问题
//版本4
//1.获取购物车
List listCarts = (List )session.getAttribute("listCarts");
//2.判断非空
boolean flag = true;
if(null == listCarts){//说明用户时第一次将商品加入购物车
//创建购物车
listCarts = new ArrayList();
}else{//否则 购物车中存在商品
//遍历所有的购物车中的商品 看该购物车中是否存在刚才点击的cart实体封装
for(Cart c : listCarts){
//判断传递的cid与当前listCarts中的每一个cid进行匹配
if(cid == c.getGoods().getGid()){//说明购物车中存在该商品
flag = false;
//修改数量
c.setCcount(c.getCcount()+1);
//修改总价格
c.setCtotal();
}
}
}
//判断flag标记
if(flag == true){//说明购物车中没有该商品
listCarts.add(cart);
}
//重新保存购物车
session.setAttribute("listCarts", listCarts);
response.sendRedirect("cart.jsp");
%>
3.cart.jsp 实现购物车界面
<%@page import="java.util.List"%>
<%@page import="com.zking.goods.entity.Cart"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
我的购物车
返回首页
编号
名称
价格
图片
数量
总价格
*** 作
<%
//java代码
//获取购物车
//Cart cart = (Cart)session.getAttribute("cart");
List listCarts = (List)session.getAttribute("listCarts");
//定义一个页码
int pageIndex = 1;
//定义一个变量存储每页显示的条数
int pageSize = 4;
//当用户点击了下一页 获取到下一页超链接上的参数
String pIndex= request.getParameter("pageIndex");
if(pIndex!=null){
pageIndex = Integer.valueOf(pIndex);
}
//定义一个变量存储总记录数
int pageCount = listCarts.size();
System.out.println("总记录数: "+pageCount);
//pageIndex = 1 0-3 0 1 2 3
//pageIndex = 2 4-7 4 5 6 7
int start = (pageIndex-1)*pageSize;
//sublist 参数end 没有等于
int end = pageIndex*pageSize;
if(end > pageCount){
end = pageCount;
}
int pageMax = pageCount/pageSize;
if(pageCount%pageSize!=0){
pageMax++;
}
//调用伪分页的方法 subList(start,end);
listCarts = listCarts.subList(start,end);
for(Cart cart : listCarts){
%>
<%=cart.getGoods().getGid() %>
<%=cart.getGoods().getGname() %>
<%=cart.getGoods().getGprice() %>
"/>
<%=cart.getCtotal() %>
<%
}
%>
[<%=pageIndex %>/<%=pageMax %>]
首页
">上一页
pageMax?pageMax:pageIndex+1%>">下一页
">尾页
4.doDel.jsp 购物车删除处理页面
<%@page import="java.util.Iterator"%>
<%@page import="com.zking.goods.entity.Cart"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String id = request.getParameter("gid");
int cid = 0;
if(null!=id){
cid = Integer.valueOf(id);
}
//获取购物车
List listCarts = (List )session.getAttribute("listCarts");
System.out.println(listCarts);
/* for(int i = 0;i its = listCarts.iterator();
while(its.hasNext()){
Cart cc = its.next();
//its.remove();
if(cc.getGoods().getGid() == cid){
its.remove();
}
}
session.setAttribute("listCarts", listCarts);
response.sendRedirect("cart.jsp");
%>
5.doUpdate.jsp (修改购物车信息的处理页面)
<%@page import="com.zking.goods.entity.Cart"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String id1 = request.getParameter("gid");
String id2 = request.getParameter("ccount");
int gid = 0;
if(id1!=null){
gid = Integer.valueOf(id1);
}
int ccount = 0;
if(id2!=null){
ccount = Integer.valueOf(id2);
}
//获取购物车
List listCarts = (List )session.getAttribute("listCarts");
for(Cart c:listCarts){
if(c.getGoods().getGid() == gid){
c.setCcount(ccount);
c.setCtotal();
}
}
session.setAttribute("listCarts", listCarts);
response.sendRedirect("cart.jsp");
%>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)