黑马商城项目(四)

本文详细介绍了黑马商城项目的订单管理部分,包括查看我的订单功能的实现。当用户点击我的订单时,会调用OrderServlet的myOrder方法,通过传递参数调用Service层的findOrder方法获取PageBean对象,并在order_list.jsp页面展示。Service层中,findOrder方法封装了PageBean,Dao层的findOrder方法用于查询当前用户订单,使用多表查询获取订单项。在处理查询结果时,使用MapListHandler将数据转换为List<Map>,然后遍历并创建订单项及商品对象,最后将这些数据添加到订单集合中。此外,文章还提及了单个订单详情的展示逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

黑马商城项目(四)

查看我的订单

在head.jsp(导航栏页面)中有如下代码:

<li><a href="${pageContext.request.contextPath}/order?method=myOrder&pageNumber=1">我的订单</a></li>

点击我的订单后,会访问OrderServlet中的myOrder方法并传递当前页参数1:

public String myOrder(...){
    {
        try {
            // 获取当前页
            int pageNumber =Integer.parseInt(request.getParameter("pageNumber"));
            // 设定每页的条数
            int pageSize=3;
            // 获取当前用户
            HttpSession session = request.getSession();
            User user =(User)session.getAttribute("user");
            // session30分钟不使用自动过期,所以需要判断一下用户是否为空
            if(user==null)
            {
                request.setAttribute("msg", "亲,请重新登录吧..");
                return "/jsp/info.jsp";
            }
            // 调用service
            OrderService os =(OrderService)FactoryDemo.getBean("OrderService");
            PageBean pb = os.findOrder(user,pageNumber,pageSize);
            request.setAttribute("pb", pb); 
        } catch (Exception e) {
            request.setAttribute("msg", "查询订单失败,请下次查询");
            return "/jsp/info.jsp";
        }
        return "/jsp/order_list.jsp";
    }

设置三个参数以后调用Service层的findOrder()方法,返回一个pagebean对象,供order_list.jsp页面获取数值展示。

Service层的findOrder()方法(主要是封装pagebean各个属性,其中每页显示数据从Dao层获取):

public PageBean findOrder(User user, int pageNumber, int pageSize) throws Exception 
    {
        // 创建dao
        OrderDao od=(OrderDao)FactoryDemo.getBean("OrderDao");
        // 每页显示的数据
        List<Order> list = od.findOrder(user,pageNumber,pageSize);
        // 定义在Dao层的count()方法,用于获取总条数
        int totalCount=od.count(user);
        // 总页数
        int totalPage=0;
        if(totalCount%pageSize==0)
        {
            totalPage=totalCount/pageSize;
        }else
        {
            totalPage=totalCount/pageSize+1;
        }

        PageBean pb = new PageBean();
        pb.setPageNumber(pageNumber);
        pb.setPageSize(pageSize);
        pb.setTotalCount(totalCount);
        pb.setTotalPage(totalPage);
        pb.setList(list);

        return pb;
    }

Dao层的findOrder()方法(重点,获取每页显示的数据):

public List<Order> findOrder(User user, int pageNumber, int pageSize) throws Exception
    {
        int start=(pageNumber-1)*pageSize;
        QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
        String sql="select * from orders where uid=? limit ?,?";
        List<Order> list = qr.query(sql, new BeanListHandler<Order>(Order.class),user.getUid(),start,pageSize);

        // 遍历每一个订单
        if(list!=null)
        {
            for (Order order: list) 
            {
                // 获取每一个订单的订单项集合
                List<Orderitem> itemList = order.getList();
                // 根据每一个订单,查到这个订单下的所有订单项
                String sql2="select * from orderitem o,product p where o.oid=? and o.pid=p.pid";
                List<Map<String, Object>> mList = qr.query(sql2,new MapListHandler(),order.getOid());
                // 遍历循环每一个订单项的数据
                for (Map<String, Object> map : mList) 
                {
                    // 拿每一个订单项的数据进行封装====Orderitem
                    Orderitem item = new Orderitem();
                    BeanUtils.populate(item,map);
                    Product product = new Product();
                    BeanUtils.populate(product, map);
                    // 把商品对象放到item
                    item.setProduct(product);
                    // 把封装好的每一个订单项数据放到订单下的订单项集合中
                    itemList.add(item);
                }
            }
        }
        return list;
    }

String sql="select * from orders where uid=? limit ?,?";

这句sql语句是查询当前用户的订单,返回一个订单list集合。

然后遍历订单集合,获取其中的每一个订单order,调用order.getList()来获取订单下面的订单项集合: itemList 空的(等待添加具体的订单项)


多表查询

 String sql2="select * from orderitem o,product p where o.oid=? and o.pid=p.pid";

 List<Map<String, Object>> mList = qr.query(sql2,new MapListHandler(),order.getOid());

MapListHandler 类:

它(实现了ResultSetHandler 接口)把从数据库中查询出的记录 都 放到List 集合当中, List集合中每一个对象都是Map类型,可以根据这条记录的字段名读出相对应的值.


[{...}{shop_price=, pname=, pflag=, pdate=, count=, pid=, oid=, itemid=, pimage=, subtotal=, is_hot=, pdesc=, market_price=, cid=}{...}]

最终返回一个 list 集合,包含查询语句查询出的所有记录(每一个大括号内是一个订单项)


for (Map<String, Object> map : mList) 

遍历每一个订单项的数据,new一个订单项和商品的实例进行封装数据( BeanUtils.populate)。


最后:
item.setProduct(product)—把商品对象放到订单项中;
itemList.add(item)—把封装好的订单项数据放到订单下的订单项集合中;
返回订单集合。

单个订单详情

在order_list.jsp中有以下代码:

<c:if test="${order.state==0}">
    <a style="color:red" href="${pageContext.request.contextPath}
    /order?method=findByoid&oid=${order.oid}">去付款</a>
</c:if>

点击去付款,会访问OrderServlet中的findByoid()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值