购物车项目开发(上)

昨天给大家讲到要讲解购物车的制作,今天我们就来浅浅的讲解一下吧

目录

一、数据库代码

1.用户表

2.商品表

二、购物车案例

1.项目目录展示

2.项目的编写 

💖数据库帮助类:DBHelper

💖用户的实体类:User

💖商品的实体类:Goods

💖user的数据库访问层

💖user的业务逻辑层

💖goods的数据库访问层

💖goods的业务逻辑层

💖登录界面:login.jsp

💖登录处理界面:doLogin.jsp

💖主界面:index.jsp

💖加入购物车:doAddCar.jsp


一、数据库代码

1.用户表

create table shop_user(
       s_id number primary key,
       s_account varchar2(30) not null,
       s_password varchar2(30) not null
)

2.商品表

create table shop_goods(
       g_id number primary key,
       g_name varchar2(30) not null,
       g_price number default 0.0,
       g_info varchar2(255) default '三无产品' not null 
)

二、购物车案例

1.购物车并不是一直放在数据库
2.选择使用的技术:
    session:
        好处:快(放在内存中),可以存对象
        坏处:占用内存,服务器意外宕机数据会丢失
     cookie:
        好处:不占用内存,存储很久.....
        坏处:存在客户端上,只能存String,数据有泄漏的风险

今天这个案例我是把购物车存储在session中的

1.项目目录展示

2.项目的编写 

💖数据库帮助类:DBHelper

package com.xyz.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.jdbc.driver.OracleDriver;

public class DBHelper {
	
	//1.加载驱动
	static {
		//OracleDriver
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//2.定义连接字符串
	private static final String URL="jdbc:oracle:thin:@localhost:1521:orcl";
	
	//3.获得连接
	public static Connection getCon() {
		try {
			return DriverManager.getConnection(URL,"scott","zkingedu");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	//4.关闭资源
	public static void close(Connection con,PreparedStatement ps,ResultSet rs) {
		try {
			if(con!=null&&!con.isClosed()) {
				con.close();
			}
			if(ps!=null) {
				ps.close();
			}
			if(rs!=null) {
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		System.out.println(DBHelper.getCon());
	}
	
}

💖用户的实体类:User

package com.xyz.pojo;

public class User {
	
	private Integer id;
	private String account;
	private String password;
	
	public User() {
		// TODO Auto-generated constructor stub
	}

	public User(Integer id, String account, String password) {
		super();
		this.id = id;
		this.account = account;
		this.password = password;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getAccount() {
		return account;
	}

	public void setAccount(String account) {
		this.account = account;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", account=" + account + ", password=" + password + "]";
	}
	
	

}

💖商品的实体类:Goods

package com.xyz.pojo;

public class Goods {
	
	private Integer id;
	private String name;
	private Integer price;
	private String info;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getPrice() {
		return price;
	}
	public void setPrice(Integer price) {
		this.price = price;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	
	public Goods() {
		// TODO Auto-generated constructor stub
	}
	
	public Goods(Integer id, String name, Integer price, String info) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
		this.info = info;
	}
	
	@Override
	public String toString() {
		return "Goods [id=" + id + ", name=" + name + ", price=" + price + ", info=" + info + "]";
	}

}

💖user的数据库访问层

💕IUserDao接口的编写

package com.xyz.dao;

import com.xyz.pojo.User;

public interface IUserDao {
	
	User login(User user);

}

💕接口的实现:UserDaoImpl

package com.xyz.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.xyz.dao.IUserDao;
import com.xyz.pojo.User;
import com.xyz.util.DBHelper;

public class UserDaoImpl implements IUserDao{
	
	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;
	
	@Override
	public User login(User user) {
	
		try {
			con=DBHelper.getCon();
			ps=con.prepareStatement("select * from shop_user where s_account=?");
			ps.setString(1, user.getAccount());
			rs=ps.executeQuery();
			if(rs.next()) {
				User u=new User();
				u.setId(rs.getInt(1));
				u.setAccount(rs.getString(2));
				u.setPassword(rs.getString(3));
				return u;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.close(con, ps, rs);
		}
		return null;
	}

}

💖user的业务逻辑层

💕IUserBiz接口的编写

package com.xyz.biz;

import com.xyz.pojo.User;

public interface IUserBiz {
	
	User login(User user);

}

💕接口的实现:UserBizImpl

package com.xyz.biz.impl;

import com.xyz.biz.IUserBiz;
import com.xyz.dao.IUserDao;
import com.xyz.dao.impl.UserDaoImpl;
import com.xyz.pojo.User;

public class UserBizImpl implements IUserBiz{

	private IUserDao userDao=new UserDaoImpl();
	
	@Override
	public User login(User user) {
		User u=userDao.login(user);
		if(u!=null) {
			//u.getPassword()是数据库的字段
			if(u.getPassword().equals(user.getPassword())){
				
				return u;
			}
		}
		return null;
	}

}

💖goods的数据库访问层

💕IGoodsDao接口的编写

package com.xyz.dao;

import java.util.List;

import com.xyz.pojo.Goods;

public interface IGoodsDao {

	//查询所有
	List<Goods> getAll();
	
	//根据id查询
	Goods getOne(Integer id);
}

💕接口的实现:GoodsDaoImpl

package com.xyz.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.xyz.dao.IGoodsDao;
import com.xyz.pojo.Goods;
import com.xyz.pojo.User;
import com.xyz.util.DBHelper;

public class GoodsDaoImpl implements IGoodsDao{
	
	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;
	
	//查询所有
	@Override
	public List<Goods> getAll() {
		List<Goods> list=new ArrayList<Goods>();
		try {
			con=DBHelper.getCon();
			ps=con.prepareStatement("select * from shop_goods");
			rs=ps.executeQuery();
			while(rs.next()) {
				Goods goods=new Goods();
				goods.setId(rs.getInt(1));
				goods.setName(rs.getString(2));
				goods.setPrice(rs.getInt(3));
				goods.setInfo(rs.getString(4));
				list.add(goods);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.close(con, ps, rs);
		}
		return list;
	}
	
	//根据id查询
	@Override
	public Goods getOne(Integer id) {
		try {
			con=DBHelper.getCon();
			ps=con.prepareStatement("select * from shop_goods where g_id=?");
			ps.setInt(1, id);
			rs=ps.executeQuery();
			if(rs.next()) {
				Goods goods=new Goods();
				goods.setId(rs.getInt(1));
				goods.setName(rs.getString(2));
				goods.setPrice(rs.getInt(3));
				goods.setInfo(rs.getString(4));
				return goods;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBHelper.close(con, ps, rs);
		}
		return null;
	}

}

💖goods的业务逻辑层

💕IGoodsBiz接口的编写

package com.xyz.biz;

import java.util.List;

import com.xyz.pojo.Goods;

public interface IGoodsBiz {
	
	//查询全部
	List<Goods> getAll();
	
	//根据id查询
	Goods getOne(Integer id);

}

💕接口的实现:GoodsBizImpl

package com.xyz.biz.impl;

import java.util.List;

import com.xyz.biz.IGoodsBiz;
import com.xyz.dao.IGoodsDao;
import com.xyz.dao.impl.GoodsDaoImpl;
import com.xyz.pojo.Goods;

public class GoodsBizImpl implements IGoodsBiz{
	
	private IGoodsDao goodsDao=new GoodsDaoImpl();
	
	@Override
	public List<Goods> getAll() {
		return goodsDao.getAll();
	}

	@Override
	public Goods getOne(Integer id) {
		return goodsDao.getOne(id);
	}
	
}

💖登录界面:login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
    <style>
        * {
            outline: none !important;
        }

        html,
        body {
            background: #1abe9c;
        }

        form {
            width: 300px;
            background: #ebeff2;
            box-shadow: 0px 0px 50px rgba(0, 0, 0, .5);
            border-radius: 5px;
            padding: 20px;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
        }

        .btn-group {
            width: 100%;
        }

        .btn-group button {
            width: 50%;
        }
    </style>
</head>

<body>
    <form action="doLogin.jsp" method="post">
        <h3 class="text-center" style="text-shadow: 2px 2px 1px #ed3f3f;">欢迎光临胡阿玛超市</h3>
        <div class="form-group">
            <input name="account" type="text" class="form-control" placeholder="请输入您的用户名">
        </div>
        <div class="form-group">
            <input name="password" type="password" class="form-control" placeholder="请输入您的密码">
        </div>
        <div class="btn-group">
            <button type="submit" class="btn btn-primary">登录</button>
            <button type="button" class="btn btn-danger">没有账号?</button>
        </div>
    </form>
</body>
</html>

💖登录处理界面:doLogin.jsp

<%@page import="com.xyz.vo.CarItem"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.xyz.pojo.User"%>
<%@page import="com.xyz.biz.impl.UserBizImpl"%>
<%@page import="com.xyz.biz.IUserBiz"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String account=request.getParameter("account");
	String password=request.getParameter("password");
		
	IUserBiz userBiz=new UserBizImpl();
	User user=userBiz.login(new User(0,account,password));
	
	if(user==null){
		response.sendRedirect("login.jsp");
	}else{
		//首页需要登录数据
		session.setAttribute("user", user);
		
		//分配购物车
		List<CarItem> car=new ArrayList<>();
		//放到session中
		session.setAttribute("car", car);
		
		response.sendRedirect("index.jsp");
	}
%>

💖主界面:index.jsp

<%@page import="com.xyz.pojo.Goods"%>
<%@page import="com.xyz.biz.impl.GoodsBizImpl"%>
<%@page import="com.xyz.biz.IGoodsBiz"%>
<%@page import="com.xyz.pojo.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
    <style>

        td:nth-child(3)::before{
            content: "$";
        }

    </style>
</head>

<body>
<%
	Object obj=session.getAttribute("user");
	if(obj==null){
		response.sendRedirect("/login.jsp");
		return;
	}
%>
    <div class="jumbotron">
        <div class="container">
            <h1>欢迎光临胡阿玛SuperMarket</h1>
            <p>尊贵的<%=((User)obj).getAccount() %></p>
        </div>
    </div>
    <!-- 打印一下购物车数据 -->
    <%=session.getAttribute("car") %>
    
    <div class="container">
    	<table class="table">
        <tr>
            <th>商品序号</th>
            <th>商品名称</th>
            <th>商品单价</th>
            <th>商品描述</th>
            <th>操作</th>
        </tr>

<%
	IGoodsBiz goodsBiz=new GoodsBizImpl();
	for(Goods goods : goodsBiz.getAll()){
%>
        <tr>
            <td><%=goods.getId() %></td>
            <td><%=goods.getName() %></td>
            <td><%=goods.getPrice() %></td>
            <td><%=goods.getInfo() %></td>
            <td>
                <div class="btn-group btn-group-xs">
                    <a href="doAddCar.jsp?id=<%=goods.getId() %>" class="btn btn-primary">添加购物车</a>
                </div>
            </td>
        </tr>
<%
	}
%>
    </table>
    </div>
</body>
</html>

💖加入购物车:doAddCar.jsp

<%@page import="java.util.List"%>
<%@page import="com.xyz.biz.impl.GoodsBizImpl"%>
<%@page import="com.xyz.biz.IGoodsBiz"%>
<%@page import="com.xyz.vo.CarItem"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//拿购物车
	List<CarItem> car=(List<CarItem>)session.getAttribute("car");
	
	IGoodsBiz goodsBiz=new GoodsBizImpl();

	//添加购物车的页面
	
	//1.得知是哪件商品
	String str=request.getParameter("id");
	int id=-1;
	if(str!=null){
		id=Integer.parseInt(str);
	}
	
	//2-1. 判断该商品是否存在
	boolean f=true;
	for(CarItem item : car){
		//item.getGoods().getId() 条目的id
		if(id==item.getGoods().getId()){
			//该商品是已经添加进购物车的[购物车中某个条目的商品id和我添加的商品id是相同的]
			item.setCount(item.getCount()+1);
			item.setSum(item.getCount()*item.getGoods().getPrice());
			f=false;
			break;
		}
		
	}
	
	//判断f为true
	if(f){
		// 2-2.生成一个CarItem [如果购物车中没有改商品]
		CarItem carItem=new CarItem();
		//设置对应的商品数据
		carItem.setGoods(goodsBiz.getOne(id));
		//数量
		carItem.setCount(1);
		//总价
		//carItem.getCount() 商品数量
		//carItem.getGoods().getPrice() 商品的单价
		carItem.setSum(carItem.getCount()*carItem.getGoods().getPrice());
		
		//将购物条目[carItem] 绑定到 购物车[car] 中
		car.add(carItem);
	}
	
	//更新购物车
	session.setAttribute("car", car);
	
	//跳回首页
	response.sendRedirect("index.jsp");
%>

今天就讲解到这啦,下次给大家分享优化购物车

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值