黑马商城项目(四)
查看我的订单
在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()方法。