2023-01-07 一、去結賬功能的準備工作 (1)需要完成的要求:將購物車內所有圖書都結賬。 (2)分析: ①結賬會生成訂單 訂單中的信息包含主鍵(唯一標識,使用自增)、訂單號(後臺生成一個唯一標識對於訂單)、訂單時間(點 擊去結賬時的系統時間)、訂單金額(即購物車的總金額)、訂單數量(即購物車 ...
2023-01-07
一、去結賬功能的準備工作
(1)需要完成的要求:將購物車內所有圖書都結賬。
(2)分析:
①結賬會生成訂單
訂單中的信息包含主鍵(唯一標識,使用自增)、訂單號(後臺生成一個唯一標識對於訂單)、訂單時間(點 擊去結賬時的系統時間)、訂單金額(即購物車的總金額)、訂單數量(即購物車的總數量)、訂單狀態(包含等待發貨、已發貨、未發貨、確認收貨)、用戶id(用於標識用戶,即記錄當前訂單屬於哪個用戶)
②訂單項包含的內容(之前的購物項對應現在的訂單項)
主鍵、書的圖片、書名、價格、數量、金額、訂單id(當前訂單項關聯的訂單表的主鍵)
(3)結論:訂單和訂單項的數據應該存儲在資料庫內
(4)創建表格(要存儲在資料庫內,所以要在資料庫中創建一個存儲訂單項的表格,變數的設置使用分析到的訂單內容進行設置)
在資料庫中創建表格的語句
CREATE TABLE t_order( order_id INT PRIMARY KEY AUTO_INCREMENT, order_sequence VARCHAR(200), create_time VARCHAR(100), total_count INT, total_amount DOUBLE, order_status INT, user_id INT );
打開資料庫,將語句放在這裡
之後選中語句,點擊運行,最後進行刷新
說明:訂單的狀態中:已支付,待發貨(使用0);已發貨(使用1);確認收貨(使用2)
(5)訂單項中的表格
步驟同(4),創建表格的sql語句為
CREATE TABLE t_order_item( item_id INT PRIMARY KEY AUTO_INCREMENT, book_name VARCHAR(20), price DOUBLE, img_path VARCHAR(50), item_count INT, item_amount DOUBLE, order_id VARCHAR(20) );
(6)在src中的com.hh.bean文件夾下創建“OrderItem”類、“Order”類
OrderItem類包含的欄位:
public class OrderItem { private Integer itemId; private String bookName; private Double price; private String imgPath; private Integer itemCount; private Double itemAmount; private Integer orderId; }
Order類包含的欄位:
public class Order { private Integer orderId; private String orderSequence; private String createTime; private Integer totalCount; private Double totalAmount; private Integer orderStatus; private Integer userId; }
之後在兩個類中使用快捷鍵“Insert+Alt”,創建有參、無參構造器、getter、setter、tostring方法
二、去結賬功能的實現
(1)在src文件夾下“com.hh.servlet.model”中創建一個“Servlet”,命名為“OrderServlet”.
在“OrderServlet”中的註解中設置訪問路徑
@WebServlet(name = "OrderServlet",value = "/order")
(2)找到“去結賬”的位置,發出請求。在“cart.html”中的第78行代碼,將路徑傳過去
<a class="pay" href="order?flag=createOrder">去結賬</a>
(3)在“OrderServlet”中創建“createOrder”方法
在該類中將“doPost”、“doGet”函數刪除,設置“createOrder”函數
@WebServlet(name = "OrderServlet",value = "/order") public class OrderServlet extends HttpServlet { protected void createOrder(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //處理結賬的請求 //1.獲得請求參數(要獲得結賬相關的數據) //①獲得購物車信息(n個購物項,總數量,總金額) HttpSession session = request.getSession(); Cart cart = (Cart)session.getAttribute("cart"); //②獲得當前登錄人的信息(登陸之後再去結賬) User user = (User)session.getAttribute("user");//如果沒有登錄user則為null //2.調用業務層處理業務 //3.給響應 } }
(4)在“src”中的“com.hh.service”中創建一個“OrderService”的介面
public interface OrderService { //處理創建訂單的業務 String createOrder(Cart cart, User user);
}
(5)在src文件夾下的“com.hh.service.impl”中創建實現類“OrderServiceImpl”
public class OrderServiceImpl implements OrderService { @Override public String createOrder(Cart cart, User user) { //1.創建訂單信息並保存到資料庫 String orderSequence="hh"+System.currentTimeMillis();//訂單號 Date date = new Date(); //對當前系統時間進行格式化 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(date);//字元串格式的當前系統時間 Order order = new Order(null,orderSequence,format,cart.getTotalCount(),cart.getTotalAmount(),0,user.getId()); //調用dao層將order的數據添加到資料庫內 //2.創建n個訂單信息並保存到資料庫 //3.對圖書的庫存和銷量進行修改操作(暫時不考慮庫存不足的情況) return null; } }
(6)在“src”文件夾下的“com.hh.dao”中創建一個介面“OrderDao”
public interface OrderDao { /** * 功能:添加訂單信息 * @param order */ void addOrder(Order order); /** * 功能:根據訂單編號查找訂單ID * @param orderSequence * @return */ Integer findIdBySequence(String orderSequence); }
(7)在src中的“com.hh.dao.impl”中創建“OrderDaoImpl”類
public class OrderDaoImpl extends BaseDaoImpl implements OrderDao { @Override public void addOrder(Order order) { String sql="insert into t_order values(null,?,?,?,?,?,?)"; this.update(sql,order.getOrderSequence(),order.getCreateTime(),order.getTotalCount(),order.getTotalAmount(),order.getOrderStatus(),order.getUserId()); } @Override public Integer findIdBySequence(String orderSequence) { String sql="select order_id from t_order where order_sequence=?"; return (Integer)this.getValue(sql,orderSequence);
}
}
(8)在src文件夾下的“com.hh.dao”中,創建“OrderItemDao”的類
public interface OrderItemDao { /** * 保存訂單項信息 * @param orderItem */ void addOrderItem(OrderItem orderItem); }
(9)在src文件夾下的“com.hh.dao.impl”中,創建實現類“OrderItemDaoImpl”
public class OrderItemDaoImpl extends BaseDaoImpl implements OrderItemDao { @Override public void addOrderItem(OrderItem orderItem) { String sql="insert into t_order_item values(null,?,?,?,?,?,?)"; this.update(sql,orderItem.getBookName(),orderItem.getPrice(),orderItem.getImgPath(),orderItem.getItemCount(),orderItem.getItemAmount(),orderItem.getOrderId()); } }
(10)完善“OrderServiceImpl”類中的函數
public class OrderServiceImpl implements OrderService { private OrderDao orderDao = new OrderDaoImpl(); private OrderItemDao orderItemDao = new OrderItemDaoImpl(); private BookDao bookDao = new BookDaoImpl(); @Override public String createOrder(Cart cart, User user) { //1.創建訂單信息並保存到資料庫 String orderSequence="hh"+System.currentTimeMillis();//訂單號 Date date = new Date(); //對當前系統時間進行格式化 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(date);//字元串格式的當前系統時間 Order order=new Order(null,orderSequence,format,cart.getTotalCount(),cart.getTotalAmount(),0,user.getId()); //調用dao層將order的數據添加到資料庫內 orderDao.addOrder(order); //2.創建n個訂單信息並保存到資料庫 //通過迴圈的方式去實現 //訂單id是根據訂單編號去查詢 Integer idBySequence = orderDao.findIdBySequence(orderSequence); Collection<CartItem> allCartItem = cart.getAllCartItem(); for (CartItem item : allCartItem) { //一個item(購物項)對應一個訂單項(OrderItem) OrderItem orderItem = new OrderItem(null, item.getBook().getBookName(), item.getBook().getPrice(), item.getBook().getImgPath(),item.getCount(),item.getAmount(),idBySequence); //調用dao層將orderItemDao的數據保存到資料庫 orderItemDao.addOrderItem(orderItem); //3.對圖書的庫存和銷量進行修改操作(暫時不考慮庫存不足的情況) //每一個訂單項的生成都隨之改變當前書的庫存和銷量 Book book = item.getBook(); book.setSales(book.getSales()+item.getCount()); book.setStock(book.getSales()-item.getCount()); bookDao.updateBook(book);//根據書的id修改其他信息 } return orderSequence;//需要把訂單號返回Servlet } }
(11)完善“OrderServlet”類中的函數
@WebServlet(name = "OrderServlet",value = "/order") public class OrderServlet extends BaseServlet { private OrderService orderService= new OrderServiceImpl(); protected void createOrder(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //處理結賬的請求 //1.獲得請求參數(要獲得結賬相關的數據) //①獲得購物車信息(n個購物項,總數量,總金額) HttpSession session = request.getSession(); Cart cart = (Cart)session.getAttribute("cart"); //②獲得當前登錄人的信息(登陸之後再去結賬) User user = (User)session.getAttribute("user");//如果沒有登錄user則為null //2.調用業務層處理業務 String orderSequence = orderService.createOrder(cart, user); //3.給響應 //需要將訂單號,放在請求域,轉發到網頁,通過thymeleaf渲染 request.setAttribute("orderSequence",orderSequence); this.processTemplate("cart/checkout",request,response); } }
(12)在“cart.html”中設置thymeleaf的命名空間設置base
<html xmlns:th="http://www.thymaleaf.org">
<base th:href="@{/}">
在“cart.html”中的第55行進行渲染訂單號
th:text="${orderSequence}
註意:刷新伺服器後,彈出的頁面一直報404,找了很長時間,最後發現是“web.xml”中的問題,“<servlet-class>”在遷移之後裡面的不是按照“com.hh.servlet.model.ToIndexPageServlet”,而是“ToIndexPageServlet”,之後將類似的問題改過之後就OK了。如果下次遇到同樣的問題報404時,先要檢查“web.xml”。