servlet版购物车项目(下)

这次我们来完善上次没完成的功能,前部分的功能可查看以下博客

servlet版购物车项目(上)_筱X的博客-CSDN博客servlet购物车项目(上)https://blog.csdn.net/weixin_67235801/article/details/124499606?spm=1001.2014.3001.5502

目录

一、补充:数据库建表语句

二、修改部分

购物车:car.jsp

过滤器:LoginFilter.java

 三、新增部分

1.实体类

订单:Order.java

2.数据库访问层接口

订单:IOrderDao.java

订单项:IOrderItemDao.java

3.实现数据库访问层接口的类

订单:OrderDaoImpl.java

订单项:OrderItemDaoImpl.java

4.业务逻辑层接口

订单:IOrderBiz.java

订单项:IOrderItemBiz.java

5.实现业务逻辑层接口的类

订单:OrderBizImpl.java

订单项:OrderItemBizImpl.java

6.处理功能

订单结算:CalcServlet.java

 订单的servlet:OrderServlet.java

 订单项的servlet:ItemServlet.java

7.web界面

订单:order.jsp

订单项:item.jsp


一、补充:数据库建表语句

--用户表
create table car_user
(
    id number primary key,
    account  varchar2(30) not null,
    password varchar(32)  not null
);

--商品表
create table car_goods
(
    id number primary key,
    name varchar2(20) not null,
    describe varchar2(100) default '此商品暂时没有介绍🤣' not null,
    price number not null
);

--订单表
create table car_order
(
    id number primary key,
    user_id number not null,
    total number not null
);

--订单项表
create table car_order_item
(
    id number primary key,
    order_id number not null,
    goods_id number not null,
    quantity number not null,
    total number not null
);

二、修改部分

购物车:car.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <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>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>购物车界面</title>
</head>
<body>
<div class="container">
    <h1>
        ${user.account},您好, <small>这是购物车</small>
    </h1>
    <h1>
        <a href="index.do" class="btn btn-default">继续购买</a>
        <a href="calc.do" class="btn btn-default">订单结算</a>
        <a href="order.do" class="btn btn-default">查看订单</a>
        <a href="clear.do" class="btn btn-default">清空🛒</a>
    </h1>
    <table class="table table-bordered table-striped">
        <tbody>
        <tr>
            <th>商品编号</th>
            <th>商品名字</th>
            <th>商品数量</th>
            <th>商品总价</th>
            <th>商品操作</th>
        </tr>
        <c:forEach items="${car}" var="item">
            <tr>
                <td>${item.goods.id}</td>
                <td>${item.goods.name}</td>
                <td>${item.quantity}</td>
                <td>${item.total}</td>
                <td>
                    <a href="del.do?id=${item.goods.id}" class="btn btn-default">删除</a>
                    <a href="upd.do?id=${item.goods.id}&type=1" class="btn btn-default">+1</a>
                    <a href="upd.do?id=${item.goods.id}&type=-1" class="btn btn-default">-1</a>
                </td>
            </tr>
        </c:forEach>
        </tbody>
    </table>
    <h1>
        total: ${total}
    </h1>
</div>
</body>
</html>

过滤器:LoginFilter.java

package com.xyz.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 过滤器
 **/

@WebFilter("/*") //所有的请求都会被拦截
public class LoginFilter implements Filter {

	//如果登录了 正常通行
    //如果没登陆 让你回到登录页面
	
	//集合中放需要放行的路径
	List<String> list=new ArrayList<String>();
	{
		list.add("/login.jsp");
		list.add("/login.do");
		list.add(".css");
		list.add(".js");
	}

    //【req.getServletPath()】
    //  localhost:8080/login.jsp -> /login.jsp
    //  localhost:8080/index.jsp -> /index.jsp
    //  localhost:8080/manager.jsp -> /manager.jsp

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //有一些页面需要放行 【login.jsp】
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        //拿的是当前项目之后的路径
        String path = req.getServletPath();
        
        //判断访问路径是否在集合中
        boolean f=false;
        for (String p : list) {
			if(path.endsWith(p)) {
				f=true;
				break;
			}
		}
        if (f) {
            chain.doFilter(request, response);//放行
            return;
        }
        //判断你是否可以通行【有没有登录:session中是否有user属性】
        Object user = req.getSession().getAttribute("user");
        if (user == null) {
            resp.sendRedirect("login.jsp");
            return;
        } else {
            chain.doFilter(request, response);//放行
        }
    }

}

 三、新增部分

1.实体类

订单:Order.java

package com.xyz.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 
 **/

public class Order {

    private Integer id;
    private Integer userId;
    private Integer total;
    
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getUserId() {
		return userId;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public Integer getTotal() {
		return total;
	}
	public void setTotal(Integer total) {
		this.total = total;
	}
    
    public Order() {
		// TODO Auto-generated constructor stub
	}
    
	public Order(Integer id, Integer userId, Integer total) {
		super();
		this.id = id;
		this.userId = userId;
		this.total = total;
	}
	
	@Override
	public String toString() {
		return "Order [id=" + id + ", userId=" + userId + ", total=" + total + "]";
	}
    
}

2.数据库访问层接口

订单:IOrderDao.java

package com.xyz.dao;

import com.xyz.pojo.Order;

import java.util.List;

/**
 * 订单数据访问层的接口
 **/

public interface IOrderDao {

    int maxPK();

    int insert(Order order);

    List<Order> list(int userId);

}

订单项:IOrderItemDao.java

package com.xyz.dao;

import com.xyz.pojo.OrderItem;

import java.util.List;

/**
 * 订单项数据库访问层接口
 **/

public interface IOrderItemDao {

    int maxPK();

    int insert(OrderItem item);

    List<OrderItem> list(Integer id);

}

3.实现数据库访问层接口的类

订单:OrderDaoImpl.java

package com.xyz.dao.impl;

import com.xyz.dao.IOrderDao;
import com.xyz.pojo.Goods;
import com.xyz.pojo.Order;
import com.xyz.util.DBHelper;

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

/**
 * 实现订单数据访问层接口的类
 **/

public class OrderDaoImpl implements IOrderDao {

    //定义资源
    private Connection con;
    private PreparedStatement ps;
    private ResultSet rs;

    /**
     * 查询出最大的id
     */
    @Override
    public int maxPK() {
        try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("select nvl(max(id),0)+1 from car_order");
            rs = ps.executeQuery();
            if (rs.next()) {
               return rs.getInt(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBHelper.close(con, ps, rs);
        }
        return 0;
    }

    /**
     * 订单增加
     */
    @Override
    public int insert(Order order) {
        try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("insert into car_order values(?,?,?)");
            ps.setInt(1,order.getId());
            ps.setInt(2,order.getUserId());
            ps.setInt(3,order.getTotal());
            return ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBHelper.close(con, ps, rs);
        }
        return 0;
    }

    /**
     * 根据用户id查看订单
     */
    @Override
    public List<Order> list(int userId) {
        List<Order> list = new ArrayList<>();
        try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("select * from car_order where user_id=?");
            ps.setInt(1,userId);
            rs=ps.executeQuery();
            while(rs.next()){
                Order order=new Order();
                order.setId(rs.getInt(1));
                order.setUserId(rs.getInt(2));
                order.setTotal(rs.getInt(3));
                list.add(order);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBHelper.close(con, ps, rs);
        }
        return list;
    }
}

订单项:OrderItemDaoImpl.java

package com.xyz.dao.impl;

import com.xyz.dao.IGoodsDao;
import com.xyz.dao.IOrderItemDao;
import com.xyz.pojo.Order;
import com.xyz.pojo.OrderItem;
import com.xyz.util.DBHelper;

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

/**
 * 实现订单项数据库访问层接口的类
 **/

public class OrderItemDaoImpl implements IOrderItemDao {

    private IGoodsDao goodsDao=new GoodsDaoImpl();

    //定义资源
    private Connection con;
    private PreparedStatement ps;
    private ResultSet rs;

    /**
     * 最大的id
     */
    @Override
    public int maxPK() {
        try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("select nvl(max(id),0)+1 from car_order_item");
            rs = ps.executeQuery();
            if (rs.next()) {
                return rs.getInt(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBHelper.close(con, ps, rs);
        }
        return 0;
    }

    /**
     * 订单项的增加
     */
    @Override
    public int insert(OrderItem item) {
        try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("insert into car_order_item values(?,?,?,?,?)");
            ps.setInt(1, item.getId());
            ps.setInt(2, item.getOrderId());
            ps.setInt(3, item.getGoods().getId());
            ps.setInt(4, item.getQuantity());
            ps.setInt(5, item.getTotal());
            return ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBHelper.close(con, ps, rs);
        }
        return 0;
    }

    /**
     * 根据订单id查询
     */
    @Override
    public List<OrderItem> list(Integer orderId) {
        List<OrderItem> list = new ArrayList<>();
        try {
            con = DBHelper.getCon();
            ps = con.prepareStatement("select * from car_order_item where order_id=?");
            ps.setInt(1,orderId);
            rs=ps.executeQuery();
            while(rs.next()){
                OrderItem item=new OrderItem();
                item.setId(rs.getInt(1));
                item.setOrderId(rs.getInt(2));
                item.setGoods(goodsDao.one(rs.getInt(3)));
                item.setQuantity(rs.getInt(4));
                item.setTotal(rs.getInt(5));
                list.add(item);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBHelper.close(con, ps, rs);
        }
        return list;
    }

}

4.业务逻辑层接口

订单:IOrderBiz.java

package com.xyz.biz;

import com.xyz.pojo.Order;

import java.util.List;

/**
 * 订单业务逻辑层的接口
 **/

public interface IOrderBiz {

    int maxPK();

    int insert(Order order);

    List<Order> list(int userId);

}

订单项:IOrderItemBiz.java

package com.xyz.biz;

import com.xyz.pojo.OrderItem;

import java.util.List;

/**
 * 订单项业务逻辑层的接口
 **/

public interface IOrderItemBiz {

    int maxPK();

    int insert(OrderItem item);

    List<OrderItem> list(Integer id);

}

5.实现业务逻辑层接口的类

订单:OrderBizImpl.java

package com.xyz.biz.impl;

import com.xyz.biz.IOrderBiz;
import com.xyz.dao.IOrderDao;
import com.xyz.dao.impl.OrderDaoImpl;
import com.xyz.pojo.Order;

import java.util.List;

/**
 * 实现订单业务逻辑层的类
 **/

public class OrderBizImpl implements IOrderBiz {

    private IOrderDao orderDao=new OrderDaoImpl();

    @Override
    public int maxPK() {
        return orderDao.maxPK();
    }

    @Override
    public int insert(Order order) {
        return orderDao.insert(order);
    }

    @Override
    public List<Order> list(int userId) {
        return orderDao.list(userId);
    }
}

订单项:OrderItemBizImpl.java

package com.xyz.biz.impl;

import com.xyz.biz.IOrderItemBiz;
import com.xyz.dao.IOrderItemDao;
import com.xyz.dao.impl.OrderItemDaoImpl;
import com.xyz.pojo.OrderItem;

import java.util.List;

/**
 * 实现订单项业务逻辑层的类
 **/

public class OrderItemBizImpl implements IOrderItemBiz {

    private IOrderItemDao orderItemDao=new OrderItemDaoImpl();

    @Override
    public int maxPK() {
        return orderItemDao.maxPK();
    }

    @Override
    public int insert(OrderItem item) {
        return orderItemDao.insert(item);
    }

    @Override
    public List<OrderItem> list(Integer id) {
        return orderItemDao.list(id);
    }

}

6.处理功能

订单结算:CalcServlet.java

package com.xyz.servlet;

import com.xyz.biz.IOrderBiz;
import com.xyz.biz.IOrderItemBiz;
import com.xyz.biz.impl.OrderBizImpl;
import com.xyz.biz.impl.OrderItemBizImpl;
import com.xyz.pojo.Order;
import com.xyz.pojo.OrderItem;
import com.xyz.pojo.User;
import org.apache.commons.codec.binary.StringUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 订单结算
 **/

@WebServlet("/calc.do")
public class CalcServlet extends HttpServlet {

    private IOrderBiz orderBiz=new OrderBizImpl();
    private IOrderItemBiz orderItemBiz=new OrderItemBizImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//购物车在哪里?
        List<OrderItem> car = (List<OrderItem>)req.getSession().getAttribute("car");
        //获得用户
        User user = (User)req.getSession().getAttribute("user");
        //什么是结算? 将数据放到【订单】【订单项】
        if(car.isEmpty()){
            //返回购物车
            resp.sendRedirect("car.jsp");
            return;
        }
        //计算总和
        int sum=0;
        for (OrderItem item : car) {
            sum+=item.getTotal();
        }
        //优先结算订单
        Order order=new Order();
        order.setId(orderBiz.maxPK());
        order.setUserId(user.getId());
        order.setTotal(sum);
        //将订单放到数据库
        int i = orderBiz.insert(order);
        if(i>0){
            //如果订单插入成功了,则插入订单项
            for (OrderItem item : car) {
                //item没有id
                item.setId(orderItemBiz.maxPK());
                //也没有订单编号
                item.setOrderId(order.getId());
                orderItemBiz.insert(item);
            }
            //结算完毕
            car.clear();
            //清空价格
            req.getSession().setAttribute("total",0);
        }

        //返回购物车
        resp.sendRedirect("car.jsp");
    }

}

 订单的servlet:OrderServlet.java

package com.xyz.servlet;

import com.xyz.biz.IOrderBiz;
import com.xyz.biz.IOrderItemBiz;
import com.xyz.biz.impl.OrderBizImpl;
import com.xyz.biz.impl.OrderItemBizImpl;
import com.xyz.pojo.Order;
import com.xyz.pojo.OrderItem;
import com.xyz.pojo.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 订单的servlet
 **/

@WebServlet("/order.do")
public class OrderServlet extends HttpServlet {

    private IOrderBiz orderBiz=new OrderBizImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//获得用户
        User user = (User)req.getSession().getAttribute("user");
        List<Order> list = orderBiz.list(user.getId());
        //放到请求作用域中
        req.setAttribute("list",list);
        //返回order.jsp
        req.getRequestDispatcher("order.jsp").forward(req,resp);
    }

}

 订单项的servlet:ItemServlet.java

package com.xyz.servlet;

import com.xyz.biz.IOrderBiz;
import com.xyz.biz.IOrderItemBiz;
import com.xyz.biz.impl.OrderBizImpl;
import com.xyz.biz.impl.OrderItemBizImpl;
import com.xyz.pojo.Order;
import com.xyz.pojo.OrderItem;
import com.xyz.pojo.User;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 订单项的servlet
 **/

@WebServlet("/item.do")
public class ItemServlet extends HttpServlet {

    private IOrderItemBiz orderItemBiz=new OrderItemBizImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//接受订单的id
        Integer id = Integer.parseInt(req.getParameter("id"));
        //根据订单id查询对应的订单项
        List<OrderItem> list = orderItemBiz.list(id);
        //放到请求作用域中
        req.setAttribute("list",list);
        //返回order.jsp
        req.getRequestDispatcher("item.jsp").forward(req,resp);
    }

}

7.web界面

订单:order.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${list == null}">
    <c:redirect url="order.do"/>
</c:if>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <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>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>我的订单</title>
</head>
<body>

<div class="container">

    <h1>
        您好, <small>这是订单界面</small>
    </h1>
    <h1>
        <a href="index.do" class="btn btn-default">继续购买</a>
        <a href="car.jsp" class="btn btn-default">返回购物车</a>
    </h1>
    <table class="table table-bordered table-striped">
        <tbody>
        <tr>
            <th>订单编号</th>
            <th>订单总价</th>
            <th>订单操作</th>
        </tr>
        <c:forEach items="${list}" var="order">
        <tr>
            <td>${order.id}</td>
            <td>${order.total}</td>
            <td>
                <a href="item.do?id=${order.id}" class="btn btn-default">查看详情</a>
            </td>
        </tr>
        </c:forEach>
        </tbody>
    </table>

</div>

</body>
</html>

点击查看详情可跳转订单项界面。 

订单项:item.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${list == null}">
    <c:redirect url="item.do"/>
</c:if>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <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>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>我的订单项</title>
</head>
<body>

<div class="container">
    <h1>
        您好, <small>这是订单项界面</small>
    </h1>
    <h1>
        <a href="index.jsp" class="btn btn-default">继续购买</a>
        <a href="car.jsp" class="btn btn-default">返回购物车</a>
    </h1>
    <table class="table table-bordered table-striped">
        <tbody>
        <tr>
            <th>订单项编号</th>
            <th>订单项商品名称</th>
            <th>订单项商品单价</th>
            <th>订单项下单数量</th>
            <th>订单项下单总价</th>
        </tr>
        <c:forEach items="${list}" var="item">
        <tr>
            <td>${item.id}</td>
            <td>${item.goods.name}</td>
            <td>${item.goods.price}</td>
            <td>${item.quantity}</td>
            <td>${item.total}</td>
        </tr>
        </c:forEach>
        </tbody>
    </table>

</div>

</body>
</html>

购物车项目到此结束,感谢大家的观看 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值