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 = "https://www.cnblogs.com/order")
(2)找到“去結賬”的位置,發出請求,在“cart.html”中的第78行代碼,將路徑傳過去
<a class="pay" href="https://www.cnblogs.com/isDaHua/archive/2023/01/07/order?flag=createOrder">去結賬</a>
(3)在“OrderServlet”中創建“createOrder”方法
在該類中將“doPost”、“doGet”函式洗掉,設定“createOrder”函式
@WebServlet(name = "OrderServlet",value = "https://www.cnblogs.com/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 = "https://www.cnblogs.com/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”,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541425.html
標籤:其他
