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);
}
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
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
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
总结:订单模块自己写的时候出现的问题还是很多的,这是我的总结,可能只有我看的懂了。