JavaEE学习日志(七十二): 黑马商城项目(五)

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

黑马商城项目(五)

今日任务

  • ThreadLocal优化订单事务
  • 生成订单
  • 订单详情

ThreadLocal优化订单事务

使用工具类ConnectionManager优化订单事务

ConnectionManager工具类

package com.itheima.utils;

import java.sql.Connection;
import java.sql.SQLException;


public class ConnectionManager{
	private static ThreadLocal<Connection> local = new ThreadLocal<Connection>();
	private static Connection con;
	
	public static Connection getConnection() throws SQLException{
		con = local.get();
		if(con==null){
			local.set(C3P0UtilsXML.getConnection());
			con = local.get();
		}
		return con;
	}
	
	public static void begin() throws SQLException{
		getConnection();
		con.setAutoCommit(false);
	}
	public static void commit() throws SQLException{
		con.commit();
	}
	public static void rollback() throws SQLException{
		con.rollback();
	}
	public static void close(){
		try {
			con.close();
			local.remove();
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
	}
	
}

OrdersService

package com.itheima.service.impl;

import com.itheima.dao.OrdersDao;
import com.itheima.domain.OrderItem;
import com.itheima.domain.Orders;
import com.itheima.service.OrdersService;
import com.itheima.utils.BeanFactory;
import com.itheima.utils.ConnectionManager;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;

public class OrdersServiceImpl implements OrdersService {
    //bean工厂,创建ordersDao接口实现类
    private OrdersDao ordersDao = BeanFactory.newInstance(OrdersDao.class);

    @Override
    public void addOrders(Orders orders, List<OrderItem> orderItemList) {
        Connection conn = null;
        try{
            conn = ConnectionManager.getConnection();
            ConnectionManager.begin();
            ordersDao.submitOrder(conn,orders);
            for (OrderItem orderItem : orderItemList) {
                ordersDao.submitOrderItem(conn,orderItem);
            }
            ConnectionManager.commit();
        }catch (Exception e){
            e.printStackTrace();
            try {
                ConnectionManager.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }finally {
            ConnectionManager.close();
        }
    }
    /*
        实现订单和订单项的添加
        事务的控制
     */

    /*public void addOrders(Orders orders, List<OrderItem> orderItemList) {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/store_331", "root", "root");
            //开启事务
            conn.setAutoCommit(false);
            ordersDao.submitOrder(conn,orders);
            for (OrderItem orderItem : orderItemList) {
                ordersDao.submitOrderItem(conn,orderItem);
            }
            //提交事务
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            //回滚事务
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        } finally {
            if(conn!=null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }*/

    /*
        传递订单对象,调用dao写入数据表

    @Override
    public void submitOrder(Orders orders) {
        try {
            ordersDao.submitOrder(orders);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    */


    /*
        传递订单项对象,调用dao写入数据表
        遍历集合,取出集合中的每个订单项

    @Override
    public void submitOrderItem(List<OrderItem> orderItemList) {
        try {
            for (OrderItem orderItem : orderItemList) {
                ordersDao.submitOrderItem(orderItem);
            }
        }catch (Exception ex){ex.printStackTrace();}

    }
    */
}

生成订单

实现步骤

  • 订单列表页面发送AJAX请求
  • Servlet获取当前页数
  • 从session中取出用户对象,判断用户是否登录
  • 调用业务层方法返回PageBean对象,传递当前页数,和用户主键
  • 业务层调用持久层方法获取订单数据,并封装PageBean对象
  • Servlet将数据格式化为JSON返回客户端
  • 客户端拼接字符串,显示订单列表

订单查询的商品表分析
在这里插入图片描述
订单的数据分许
在这里插入图片描述
订单的分页流程
在这里插入图片描述

前端

在这里插入图片描述

<script type="text/javascript">
			$(function(){
				//获取当前页数
				var currentPage = HM.getParameter("currentPage");
				if(currentPage==null){
					currentPage = 1;
				}
				//向服务器发送ajax请求,获取该用户的订单,PageBean对象
				HM.ajax("/order?method=myOrderWithPage","currentPage="+currentPage,function(data){
					if(data.code==2){
						alert(data.message);
						location.href="http://www.itheima331.com:8020/web/login.html";
					}
					//取出pagebean对象
					var pb = data.obj;
					var str = "";
					//取出多个订单对象
					var orderList = pb.list;
					$.each(orderList, function(index,element) {
						//element就是订单对象
						str += "<tr class=\"success\">\n" +
					    "\t\t\t\t\t\t\t\t\t<th colspan=\"2\">\n" +
					    "\t\t\t\t\t\t\t\t\t\t订单编号:\n" +
					    "\t\t\t\t\t\t\t\t\t\t<a href=\"http://www.itheima331.com:8020/web/view/order/info.html?oid="+element.oid+"\">\n" +
					    "\t\t\t\t\t\t\t\t\t\t\t"+element.oid+"\n" +
					    "\t\t\t\t\t\t\t\t\t\t</a>\n" +
					    "\t\t\t\t\t\t\t\t\t</th>\n" +
					    "\t\t\t\t\t\t\t\t\t<th colspan=\"1\">订单状态:"+getState(element.state)+" </th>\n" +
					    "\t\t\t\t\t\t\t\t\t<th colspan=\"2\">下单时间:"+element.ordertime+" </th>\n" +
					    "\t\t\t\t\t\t\t\t</tr>\n" +
					    "\t\t\t\t\t\t\t\t<tr class=\"warning\">\n" +
					    "\t\t\t\t\t\t\t\t\t<th>图片</th>\n" +
					    "\t\t\t\t\t\t\t\t\t<th>商品</th>\n" +
					    "\t\t\t\t\t\t\t\t\t<th>价格</th>\n" +
					    "\t\t\t\t\t\t\t\t\t<th>数量</th>\n" +
					    "\t\t\t\t\t\t\t\t\t<th>小计</th>\n" +
					    "\t\t\t\t\t\t\t\t</tr>\n";
					    
					    //取出每个订单的订单项,数组
					    var viewList = element.orderItemViewList;
					    $.each(viewList, function(index,element) {
							str+=
						    "\t\t\t\t\t\t\t\t<tr class=\"active\">\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"60\" width=\"40%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"id\" value=\"22\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<img src=\"http://www.itheima331.com:8020/web/"+element.pimage+"\" width=\"70\" height=\"60\">\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"30%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<a target=\"_blank\"> "+element.pname+"</a>\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"20%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t¥"+element.shop_price+"\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"10%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t"+element.count+"\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"15%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<span class=\"subtotal\">¥"+element.subTotal+"</span>\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t</tr>";
					    });
					    
					});
					$("#orders").html(str);
					//拼接分页
					var pageStr = HM.page(pb,"http://www.itheima331.com:8020/web/view/order/list.html");
					$("#page").html(pageStr);
				});
			});
			function getState(state){
				if(state==0){
					return "未付款";
				}
				if(state==1){
					return "已付款";
				}
				if(state==2){
					return "已发货";
				}
				if(state==3){
					return "已完成";
				}
			}
		</script>

orderDao

/*
        查询用户订单的总数量
     */
    @Override
    public long getOrdersCount(String uid) throws SQLException {
        String sql = "select count(*) from orders where uid = ?";
        return qr.query(sql,new ScalarHandler<Long>(),uid);
    }
    /*
        分页查询订单
        分两次查询
         1.查询出这个用户的所有订单
         2.遍历每个订单对象,查询每个订单的订单项
     */
    @Override
    public List<Orders> myOrderWithPage(int currentPage, int pageSize, String uid) throws SQLException {
        //拼写查询该用户的订单
        String sql = "select * from orders where uid = ? limit ?,?";
        List<Orders> ordersList = qr.query(sql, new BeanListHandler<Orders>(Orders.class), uid, (currentPage-1)*pageSize,pageSize);
        //遍历集合
        for (Orders orders : ordersList) {
            //order就是每个订单对象,取出订单主键
            String oid = orders.getOid();
            //拼写根据订单主键查询订单项的sql
            sql = "SELECT p.pid, p.pname, p.pimage, p.shop_price, o.count, o.subtotal\n" +
                    "FROM product p, orderitem o\n" +
                    "WHERE p.pid = o.pid AND o.oid= ?";
            //获取每个订单项
            List<OrderItemView> orderItemViewList = qr.query(sql, new BeanListHandler<OrderItemView>(OrderItemView.class), oid);
            orders.setOrderItemViewList(orderItemViewList);

        }

        return ordersList;
    }

orderService

/*
        用户订单的分页显示方法
        接收web层参数,查询dao,封装pageBean对象
     */
    @Override
    public PageBean<Orders> myOrderWithPage(int currentPage, int pageSize, String uid) {
        PageBean<Orders> pb = new PageBean<>();
        //封装pb对象的数据
        try {
            //当前页对象
            pb.setCurrentPage(currentPage);
            //每页显示的条数
            pb.setPageSize(pageSize);
            //查询dao层,获取订单对象
            List<Orders> ordersList = ordersDao.myOrderWithPage(currentPage, pageSize, uid);
            //订单集合存储到pb
            pb.setList(ordersList);
            //获取所有用户的订单总数量,并存入pb
            long totalCount = ordersDao.getOrdersCount(uid);
            pb.setTotalCount(totalCount);
            //设置总页数
            pb.setTotalPage((int)(Math.ceil(totalCount*1.0/pageSize)));
        }catch (Exception e){
            e.printStackTrace();
        }


        return pb;
    }

orderServlet

/*
        实现用户订单的分页功能
        获取当前页数
        session取出登录的User对象
            判断:user对象没有,则没有登录

        调用业务层方法,传递当前页,每页个数和用户主键
        获取返回的PageBean对象,转成Json响应

     */
    public void myOrderWithPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //session取出登录的User对象
        User user = (User)request.getSession().getAttribute("user");
        if(user==null){
            //没有登录
            Result result = new Result(Result.NOLOGIN,"尚未登录");
            response.getWriter().print(JSONObject.fromObject(result));
            return;
        }
        //获取当前页数
        int currentPage = Integer.parseInt(request.getParameter("currentPage"));
        //定义每页显示的条数
        int pageSize = 3;
        //调用业务层方法,获取PageBean对象
        PageBean<Orders> pb = ordersService.myOrderWithPage(currentPage, pageSize, user.getUid());
        //转成json响应
        Result result = new Result(Result.SUCCESS,"查询成功",pb);
        response.getWriter().print(JSONObject.fromObject(result));


    }

订单详情

实现步骤

  • 点击订单编号,调转到info.html并传递订单编号
  • 订单编号页面发起AJAX请求,提交订单编号
  • Servlet获取订单编号,查询订单数据
  • 业务层查询订单数据,查询订单项数据
  • Servlet接收业务层返回的订单数据
  • 响应回浏览器JSON数据

前端

在这里插入图片描述

<script type="text/javascript">
			$(function(){
				//获取订单编号
				var oid = HM.getParameter("oid");
				//向服务器发送ajax请求
				HM.ajax("/order?method=info","oid="+oid,function(data){
					if(data.code==2){
						alert(data.message);
						location.href="http://www.itheima331.com:8020/web/login.html";
					}
					//取出json中的订单对象
					var order = data.obj;
					//添加订单号
					$("#oid").html(order.oid);
					//添加订单状态
					$("#state").html(getState(order.state));
					//添加下单时间
					$("#ordertime").html(order.ordertime);
					//取出订单中的订单项
					var viewList = order.orderItemViewList;
					//添加订单的总金额
					$("#total").html(order.total);
					var str = "";
					$.each(viewList, function(index,element) {
						str =
						    "\t\t\t\t\t\t\t\t<tr class=\"active\">\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"60\" width=\"40%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"id\" value=\"22\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<img src=\"http://www.itheima331.com:8020/web/"+element.pimage+"\" width=\"70\" height=\"60\">\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"30%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<a target=\"_blank\"> "+element.pname+"</a>\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"20%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t¥"+element.shop_price+"\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"10%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t"+element.count+"\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t\t<td width=\"15%\">\n" +
						    "\t\t\t\t\t\t\t\t\t\t<span class=\"subtotal\">¥"+element.subTotal+"</span>\n" +
						    "\t\t\t\t\t\t\t\t\t</td>\n" +
						    "\t\t\t\t\t\t\t\t</tr>";
						    $("#order").append(str);
					});
				});
			})
			function getState(state){
				if(state==0){
					return "未付款";
				}
				if(state==1){
					return "已付款";
				}
				if(state==2){
					return "已发货";
				}
				if(state==3){
					return "已完成";
				}
			}
		</script>

orderDao

//查询一个订单
    @Override
    public Orders info(String oid) throws SQLException {
        //查询一个订单
        String sql = "select * from orders where oid = ?";
        Orders orders = qr.query(sql, new BeanHandler<Orders>(Orders.class), oid);
        //订单主键查询订单项
        sql = "SELECT p.pid, p.pname, p.pimage, p.shop_price, o.count, o.subtotal\n" +
                "FROM product p, orderitem o\n" +
                "WHERE p.pid = o.pid AND o.oid= ?";
        List<OrderItemView> orderItemViewList = qr.query(sql, new BeanListHandler<OrderItemView>(OrderItemView.class), oid);
        orders.setOrderItemViewList(orderItemViewList);
        return orders;

    }

orderService

@Override
    public Orders info(String oid) {
        Orders orders = null;
        try {
            orders = ordersDao.info(oid);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return orders;
    }

orderServlet

/*
        实现订单详情
        获取订单编号
        调用业务层传递订单号
        获取返回的订单对象
     */
    public void info(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //进行登录验证
        //session取出登录的User对象
        User user = (User)request.getSession().getAttribute("user");
        if(user==null){
            //没有登录
            Result result = new Result(Result.NOLOGIN,"尚未登录");
            response.getWriter().print(JSONObject.fromObject(result));
            return;
        }
        //获取订单编号
        String oid = request.getParameter("oid");
        Orders orders = ordersService.info(oid);
        Result result = new Result(Result.SUCCESS,"查询成功",orders);
        response.getWriter().print(JSONObject.fromObject(result));

    }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值