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));
}