Java Web网上商城——订单实现部分

1. 订单模块

1_准备工作

我的订单

2_OrderServlet__>findMyOrdersWithPage

      //确认用户登录状态

      //创建订单对象,为订单对象赋值

      //遍历购物项的同时,创建订单项

      //调用业务层功能:保存订单

      //清空购物车

      //将订单放入request

      //转发/jsp/order_info.jsp

确认用户登录状态

request.getSession().getAttribute("loginUI"); 

创建订单对象,为订单对象赋值

1.创建订单对象得有一个Order order = new Order();

2.向订单对象中加入商品,需要购物车里面的各种商品。于是需要新建一个购物车对象。

Cart cart = new Cart(); 我们需要为这个订单生成一些值,比如:订单编号,新建时间,商品总量,状态,订单拥有者。

3.遍历购物项的同时,创建订单项

用for循环 (我们得明白:遍历哪一个,在当前遍历购物项的时候,cart.getCartItems(),之前的遍历变量也自然是CartItem item)

创建订单项的时候,需要注意,在Order.java中我们已经知道了巧妙加入了一个List

setOrder方法是将订单项“加入”订单。

order.getList().add(orderItem); 即完成上述要求

4.保存订单,即调用业务层 ( OrderService OrderService=new OrderServiceImp(); )

OrderService.saveOrder(order); //转到OrderService.java

// saveOrder  将购物车中的信息以订单的形式保存
public String saveOrder(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		//确认用户登录状态
        // 返回Attribute不知道是什么形式,于是要进行强制类型转换
		User user = (User)req.getSession().getAttribute("loginUI");
            //需要对user进行判断,是否为空
		if(user == null) {
			req.setAttribute("msg", "请登录后再下单");
			return "/jsp/order_info.jsp";
		}
		//获取购物车
		Cart cart = new Cart();
		//创建订单对象,为订单对象赋值  
		Order order = new Order();
		//遍历购物项的同时,创建订单项
		order.setOid(UUIDUtils.getCode());
		order.setOrdertime(new Date());
		order.setTotal(cart.getTotal());
		order.setState(1);
		order.setUser(user);
		
		//调用业务层功能:保存订单  保存购物车里面的物品到订单中;
		for(CartItem item : cart.getCartItems()) {
			OrderItem orderItem=new OrderItem();
			orderItem.setItemid(UUIDUtils.getCode());
			orderItem.setQuantity(item.getNum());
			orderItem.setTotal(item.getSubTotal());
			orderItem.setProduct(item.getProduct());
			//以上已经设置好了orderItem 将其加入order(订单处) 
			//利用订单处的list->add方法添加
			orderItem.setOrder(order);
			order.getList().add(orderItem);
			
		}
		//清空购物车
		cart.clearCart();
		//将订单放入request
		req.getSession().setAttribute("order", order);
		//转发/jsp/order_info.jsp
		return "/jsp/order_info.jsp";
	}
	OrderDao orderDao = new OrderDaoImp();
	
	@Override
	public void saveOrder(Order order) throws SQLException {
		//保存订单和订单下所有的订单项(同时成功,失败)
		/*try {
			JDBCUtils.startTransaction();
			OrderDao orderDao=new OrderDaoImp();
			orderDao.saveOrder(order);
			for(OrderItem item:order.getList()){
				orderDao.saveOrderItem(item);
			}
			JDBCUtils.commitAndClose();
		} catch (Exception e) {
			JDBCUtils.rollbackAndClose();
		}
		*/
		Connection conn = null;
		
		try {
			conn = JDBCUtils.getConnection();
			//开启事务
			conn.setAutoCommit(false);
			//保存订单
			orderDao.saveOrder(conn, order);
			//保存订单项
			for(OrderItem orderItem : order.getList()) {
				orderDao.saveOrderItem(conn, orderItem);
			}
			//提交事务
			conn.commit();
		} catch (Exception e) {
			conn.rollback();
		}
	}

记下来上面的代码;其中保存订单和保存订单项是需要根据自己写的项目的改变而改变。调用数据层Dao来使用

 

saveOrder 和 saveOrderItem 利用Object数组进行储值,调用update方法

@Override
public void saveOrder(Connection conn, Order order) throws Exception {
	String sql="INSERT INTO orders VALUES(?,?,?,?,?,?,?,?)";
	QueryRunner qr=new QueryRunner();
	Object[] params={order.getOid(),order.getOrdertime(),order.getTotal(),order.getState(),order.getAddress(),order.getName(),order.getTelephone(),order.getUser().getUid()};
		qr.update(conn,sql,params);
}

@Override
public void saveOrderItem(Connection conn, OrderItem item) throws Exception {
	String sql="INSERT INTO orderitem VALUES(?,?,?,?,?)";
	QueryRunner qr=new QueryRunner();
	Object[] params={item.getItemid(),item.getQuantity(),item.getTotal(),item.getProduct().getPid(),item.getOrder().getOid()};
	qr.update(conn,sql,params);
}

2. 订单查询

1. jsp代码中需要修改订单的一些参数

在header中需要修改:

我的订单

  2.     

      获取用户信息

       获取当前页

       调用业务层功能:查询当前用户订单信息,返回PageModel

       将PageModel放入request

       转发到/jsp/order_list.jsp

//findMyOrdersWithPage
public String findMyOrdersWithPage(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		//获取用户信息
		User user=(User)req.getSession().getAttribute("loginUser");
		//获取当前页
		int curNum=Integer.parseInt(req.getParameter("num"));
		//调用业务层功能:查询当前用户订单信息,返回PageModel
		OrderService OrderService=new OrderServiceImp();
		//SELECT * FROM orders WHERE uid=? limit ? , ? 
		//PageModel:1_分页参数 2_url  3_当前用户的当前页的订单(集合) ,每笔订单上对应的订单项,以及订单项对应的商品信息
		PageModel pm=OrderService.findMyOrdersWithPage(user,curNum);
		//将PageModel放入request
		req.setAttribute("page", pm);
		//转发到/jsp/order_list.jsp
		return "/jsp/order_list.jsp";
}

3. OrderServiceImp

        //1_创建PageModel对象,目的:计算并且携带分页参数

             <1>计算某个用户订单项总共组成多少页

             <2>形成PageModel对象,第一个参数是 当前页的位置;第二个参数是一共有多少;第三个参数是一页有多少个商品。

        //2_关联集合 

             <1>调用数据访问层,第一个参数是针对某个用户;第二个参数是开始的元素;第三个参数是结束的参数;

        //3_关联url 

             <1> 

以上三条可以看做,分页模块的业务层模板

@Override
	public PageModel findMyOrdersWithPage(User user, int curNum) throws Exception {
		//1_创建PageModel对象,目的:计算并且携带分页参数
		//select count(*) from orders where uid=?
		int totalRecords=orderDao.getTotalRecords(user);
		PageModel pm=new PageModel(curNum, totalRecords, 3);
		//2_关联集合  select * from orders where uid=? limit ? ,?
		List list=orderDao.findMyOrdersWithPage(user,pm.getStartIndex(),pm.getPageSize());
		pm.setList(list);
		//3_关联url
		pm.setUrl("OrderServlet?method=findMyOrdersWithPage");
		return pm;
	}

4. OrderDaoImp(什么时候用Map->对多表进行操作的时候)

   *_利用MapListHandler封装多表查询结果

        List> list02 = qr.query(sql,new MapListHandler(),oid);

        MapListHandler

   *_多表查询语句

        select * from orderItem o,product p where o.pid=p.pid and o.pid=?

   *_BeanUtils自动填充数据

        利用BeanUtils的代码popular函数 赋值

@Override
public List findMyOrdersWithPage(User user, int startIndex, int pageSize) throws Exception {
		String sql="select * from orders where uid=? limit ? , ?";
		QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
		List list=qr.query(sql, new BeanListHandler(Order.class),user.getUid(),startIndex,pageSize);
		
		//遍历所有订单
		for (Order order : list) {
			//获取到每笔订单oid   查询每笔订单下的订单项以及订单项对应的商品信息
			String oid=order.getOid();
			sql="select * from orderItem o ,product p where o.pid=p.pid and oid=?";
			List> list02 = qr.query(sql, new MapListHandler(),oid);
			//遍历list
			for (Map map : list02) {
				OrderItem orderItem=new OrderItem();
				Product product=new Product();
				// 由于BeanUtils将字符串"1992-3-3"向user对象的setBithday();方法传递参数有问题,手动向BeanUtils注册一个时间类型转换器
				// 1_创建时间类型的转换器
				DateConverter dt = new DateConverter();
				// 2_设置转换的格式
				dt.setPattern("yyyy-MM-dd");
				// 3_注册转换器
				ConvertUtils.register(dt, java.util.Date.class);
				
				//将map中属于orderItem的数据自动填充到orderItem对象上
				BeanUtils.populate(orderItem, map);
				//将map中属于product的数据自动填充到product对象上
				BeanUtils.populate(product, map);
				
				//让每个订单项和商品发生关联关系
				orderItem.setProduct(product);
				//将每个订单项存入订单下的集合中
				order.getList().add(orderItem);
				
			}
		}
		return list;
}

3. 订单详情

1. 修改order_list.jsp的链接

付款

2. findOrderByOid

      获取到订单oid (由于订单oid并没有存在于session中,所以直接getparameter取值即可)

      调用业务层功能:根据订单编号查询订单信息 

          自然而然想到 new 实现(ServiceImp)     

          Service.XXX(调用Dao层的方法来查询)

          将订单放入request  (request.setAttribute("order",order);

      转发到/jsp/order_info.jsp                                 

public String findOrderByOid(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//		 获取到订单oid
		String oid = req.getParameter("oid");
		
//		 调用业务层功能:根据订单编号查询订单信息
		OrderService orderService = new OrderServiceImp();
		Order order = orderService.findOrderByOid(oid);
//	      将订单放入request
		req.setAttribute("order", order);
		
//	      转发到/jsp/order_info.jsp
		return "/jsp/order_info.jsp";
}

3. OrderService -> 直接调用Dao层代码

@Override
public Order findOrderByOid(String oid) throws Exception {
	return orderDao.findOrderByOid(oid);
		
}

4.OrderDaoImp

   根据订单oid查询当前订单  

   根据订单oid查询订单下所有的订单项以及订单项关联的商品

       关联操作:利用orderItem.setProduct(product);——>order.getList().add(orderItem);

@Override
public Order findOrderByOid(String oid) throws Exception {
		String sql = "select * from order where id = ?";
		QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//		根据订单oid查询当前订单   
		Order order = qr.query(sql, new BeanHandler(Order.class),oid);

//		根据订单oid查询订单下所有的订单项以及订单项关联的商品
		sql = "select * from orderitem o, product p where o.pid=p.pid and oid=?";
		List> list02 = qr.query(sql, new MapListHandler(),oid);
		for (Map map : list02) {
			OrderItem orderItem=new OrderItem();
			Product product=new Product();
			// 由于BeanUtils将字符串"1992-3-3"向user对象的setBithday();方法传递参数有问题,手动向BeanUtils注册一个时间类型转换器
			// 1_创建时间类型的转换器
			DateConverter dt = new DateConverter();
			// 2_设置转换的格式
			dt.setPattern("yyyy-MM-dd");
			// 3_注册转换器
			ConvertUtils.register(dt, java.util.Date.class);
			
			//将map中属于orderItem的数据自动填充到orderItem对象上
			BeanUtils.populate(orderItem, map);
			//将map中属于product的数据自动填充到product对象上
			BeanUtils.populate(product, map);
			
			//让每个订单项和商品发生关联关系
			orderItem.setProduct(product);
			//将每个订单项存入订单下的集合中
			order.getList().add(orderItem);
		}
		
		return order;
}

总结:订单模块自己写的时候出现的问题还是很多的,这是我的总结,可能只有我看的懂了。

 

你可能感兴趣的:(java)