Java基础100 把购物车中的商品购买支付、生成订单(Servlet技术,简单演示,支付功能省略,只是演示整个流程而已)

1、效果图示  

2、相关代码  

注:这里只是简单演示,很多代码并不是那么完善,且 没有写支付功能,只是简单演示整个流程而已

  2.1、数据库相关表

 1 CREATE TABLE orders( -- 订单表
 2   id VARCHAR(100) PRIMARY KEY,
 3   orderId VARCHAR(100) NOT NULL UNIQUE,
 4   num INT,
 5   price FLOAT(8,2),
 6 state INT,
 7   user_id VARCHAR(100),
 8   CONSTRAINT user_id_fk FOREIGN KEY(user_id) REFERENCES Users(id)
 9 );
10 
11 CREATE TABLE ordersitem( -- 订单项表
12   id VARCHAR(100) PRIMARY KEY,
13   num INT,
14   price FLOAT(8,2),
15   orders_id VARCHAR(100),
16   book_id VARCHAR(100),
17   CONSTRAINT orders_id_fk FOREIGN KEY(orders_id) REFERENCES orders(id),
18   CONSTRAINT book_id_fk FOREIGN KEY(book_id) REFERENCES book(id)
19 );

2.2、实体类

 1 package com.shore.entity;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 /**
 7  * @author DSHORE/2019-4-26
 8  *
 9  */
10 //订单信息:对应的就是购物车的基本信息
11 public class Orders{  
12     private String id;//订单:用户+订单项     数据库中:只有用户的id   只有订单项的id 
13     private String orderId;//订单号。not null  unique
14     private int num;//数量
15     private float price;//付款金额
16     private int state;//0表示未发货  1表示已发货
17     private List<OrdersItem> items = new ArrayList<OrdersItem>();//订单中的订单项 //id
18     private User user;//id //该订单是属于哪个用户
19 
20     public String getId() {
21         return id;
22     }
23 
24     public void setId(String id) {
25         this.id = id;
26     }
27 
28     public String getOrderId() {
29         return orderId;
30     }
31 
32     public void setOrderId(String orderId) {
33         this.orderId = orderId;
34     }
35 
36     public int getNum() {
37         return num;
38     }
39 
40     public void setNum(int num) {
41         this.num = num;
42     }
43 
44     public float getPrice() {
45         return price;
46     }
47 
48     public void setPrice(float price) {
49         this.price = price;
50     }
51 
52     public int getState() {
53         return state;
54     }
55 
56     public void setState(int state) {
57         this.state = state;
58     }
59 
60     public List<OrdersItem> getItems() {
61         return items;
62     }
63 
64     public void setItems(List<OrdersItem> items) {
65         this.items = items;
66     }
67 
68     public User getUser() {
69         return user;
70     }
71 
72     public void setUser(User user) {
73         this.user = user;
74     }
75 }

OrdersItem 订单项 实体类

 1 package com.shore.entity;
 2 
 3 /**
 4  * @author DSHORE/2019-4-26
 5  *
 6  */
 7 //对应购物车中的购物项
 8 public class OrdersItem {
 9     private String id;
10     private int num;
11     private float price;
12     private Book book;
13     
14     public String getId() {
15         return id;
16     }
17     public void setId(String id) {
18         this.id = id;
19     }
20     public int getNum() {
21         return num;
22     }
23     public void setNum(int num) {
24         this.num = num;
25     }
26     public float getPrice() {
27         return price;
28     }
29     public void setPrice(float price) {
30         this.price = price;
31     }
32     public Book getBook() {
33         return book;
34     }
35     public void setBook(Book book) {
36         this.book = book;
37     }
38 }

2.3、接口和实现类

OrderDao接口

 1 package com.shore.dao;
 2 
 3 import java.util.List;
 4 
 5 import com.shore.entity.Orders;
 6 import com.shore.entity.User;
 7 
 8 /**
 9  * @author DSHORE/2019-4-26
10  *
11  */
12 public interface OrderDao {
13     //前台内容
14     void addOrders(Orders orders, User user);//添加订单信息(即:用户付款后,将该信息添加到我的订单中)
15     List<Orders> findOrdersByUsersId(String id);//根据用户的id查询属于自己的订单
16     Orders findOrdersById(String ordersId);//根据id查看订单的详细信息
17 
18     //后台订单发货处理
19     List<Orders> findOrdersByState(int i);//显示所有未发货的订单,还要查询出是哪个用户的
20     void sureOrders(String ordersId);//把已寄出的商品,改成已发货状态
21 }

OrderDaoImpl 接口的实现类

  1 package com.shore.dao.impl;
  2 
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 import com.shore.dao.OrderDao;
 11 import com.shore.entity.Book;
 12 import com.shore.entity.Orders;
 13 import com.shore.entity.OrdersItem;
 14 import com.shore.entity.User;
 15 import com.shore.util.IdGeneratorKey;
 16 import com.shore.util.JdbcUtil;
 17 
 18 /**
 19  * @author DSHORE/2019-4-26
 20  *
 21  */
 22 public class OrderDaoImpl implements OrderDao {
 23     Connection connection = null;
 24     PreparedStatement pStatement = null;
 25     ResultSet resultSet = null;
 26     
 27     //添加订单信息(即:用户付款后,将该信息添加到我的订单中。即 :保存到数据库的订单表中)
 28     public void addOrders(Orders orders, User user) {
 29         connection = JdbcUtil.getConnection();
 30         try {
 31             String sql = "insert into orders (id,orderId,num,price,state,user_id) values(?,?,?,?,?,?);";
 32             pStatement = connection.prepareStatement(sql);
 33             //String orderId = IdGeneratorKey.genOrdersId();
 34             //String ids = IdGeneratorKey.getPrimaryKey();//这两个都不需要,直接从实体类中获取(servlet获取页面中的值,已经存到实体类中了)
 35             pStatement.setString(1,orders.getId());
 36             pStatement.setString(2,orders.getOrderId());
 37             pStatement.setInt(3,orders.getNum());
 38             pStatement.setFloat(4,orders.getPrice());
 39             pStatement.setInt(5,orders.getState());
 40             pStatement.setString(6,user.getId());
 41             pStatement.executeUpdate();
 42             //订单中的订单项
 43             List<OrdersItem> items = orders.getItems();
 44             if(items != null && items.size() > 0){//订单项中 有东西,才添加进数据库中的订单项表
 45                 String sql2 = "insert into ordersitem (id,num,price,orders_id,book_id) values(?,?,?,?,?)";
 46                 pStatement = connection.prepareStatement(sql2);
 47                 Object pps[][] = new Object[items.size()][];
 48                 for(int i = 0; i < items.size(); i++){
 49                     String id = IdGeneratorKey.getPrimaryKey();
 50                     OrdersItem item = items.get(i);
 51                     pStatement.setString(1,id);
 52                     pStatement.setInt(2,item.getNum());
 53                     pStatement.setFloat(3,item.getPrice());
 54                     pStatement.setString(4,orders.getId());
 55                     pStatement.setString(5,item.getBook().getId());
 56                     pStatement.executeUpdate();
 57                 }
 58             }
 59         } catch (SQLException e) {
 60             e.printStackTrace();
 61         }finally{
 62             JdbcUtil.close(connection, pStatement, resultSet);
 63         }
 64     }
 65 
 66     //根据用户的id查询属于自己的订单
 67     public List<Orders> findOrdersByUsersId(String id) {
 68         connection = JdbcUtil.getConnection();
 69         try {
 70             pStatement = connection.prepareStatement("select * from orders where user_id=? order by orderId desc;");
 71             pStatement.setString(1,id);
 72             resultSet = pStatement.executeQuery();
 73             List<Orders> list=new ArrayList<Orders>();
 74             Orders order = null;
 75             while(resultSet.next()){
 76                 //创建Orders对象
 77                 order = new Orders();
 78                 order.setId(resultSet.getString("id"));
 79                 order.setOrderId(resultSet.getString("orderId"));
 80                 order.setNum(resultSet.getInt("num"));
 81                 order.setState(resultSet.getInt("state"));
 82                 order.setPrice(resultSet.getFloat("price"));
 83                 //order.setUser(rs.getString("user_id"));
 84                 list.add(order);
 85             }
 86             return list;
 87         } catch (SQLException e) {
 88             e.printStackTrace();
 89             throw new RuntimeException();
 90         }finally{
 91             JdbcUtil.close(connection, pStatement, resultSet);
 92         }
 93     }
 94 
 95     //根据id查看订单的详细信息(订单明细、图书明细、当前用户,都要查询出来)
 96     public Orders findOrdersById(String ordersId) {
 97         connection = JdbcUtil.getConnection();
 98         try {
 99             pStatement = connection.prepareStatement("select * from orders where id=?");
100             pStatement.setString(1,ordersId);
101             resultSet = pStatement.executeQuery();
102             Orders orders = null;
103             while(resultSet.next()){
104                 //创建Orders对象
105                 orders = new Orders();
106                 orders.setId(resultSet.getString("id"));
107                 orders.setOrderId(resultSet.getString("orderId"));
108                 orders.setNum(resultSet.getInt("num"));
109                 orders.setState(resultSet.getInt("state"));
110                 orders.setPrice(resultSet.getFloat("price"));
111                 //orders.setUser(rs.getString("user_id"));
112             }
113             if(orders != null){
114                 //查询用户信息:少的一方,不管有没有需求,默认都是查出来的
115                 pStatement = connection.prepareStatement("select * from Users where id=(select user_id from orders where id=?)");
116                 pStatement.setString(1,ordersId);
117                 resultSet = pStatement.executeQuery();
118                 User user = null;
119                 while(resultSet.next()){
120                     //创建User对象
121                     user = new User();
122                     user.setId(resultSet.getString("id"));
123                     user.setUserName(resultSet.getString("userName"));
124                     user.setPassWord(resultSet.getString("passWord"));
125                     user.setCellPhone(resultSet.getString("cellPhone"));
126                     user.setMobilePhone(resultSet.getString("mobilePhone"));
127                     user.setAddress(resultSet.getString("address"));
128                     user.setEmail(resultSet.getString("email"));
129                 }
130                 orders.setUser(user);
131                 //订单明细
132                 pStatement = connection.prepareStatement("select * from ordersitem where orders_id=?");
133                 pStatement.setString(1,ordersId);
134                 resultSet = pStatement.executeQuery();
135                 List<OrdersItem> items=new ArrayList<OrdersItem>();
136                 OrdersItem or=null;
137                 while(resultSet.next()){
138                     or=new OrdersItem();
139                     or.setId(resultSet.getString("id"));
140                     or.setNum(resultSet.getInt("num"));
141                     or.setPrice(resultSet.getFloat("price"));
142                     items.add(or);
143                 }
144                 //查询图书的信息
145                 if(items != null && items.size() > 0){
146                     pStatement = connection.prepareStatement(("select * from Book where id=(select book_id from ordersitem where id=?)"));
147                     for(OrdersItem item:items){
148                         pStatement.setString(1,item.getId());
149                         resultSet = pStatement.executeQuery();
150                         Book book = null;
151                         while(resultSet.next()){
152                             book = new Book();
153                             book.setId(resultSet.getString("id"));
154                             book.setName(resultSet.getString("name"));
155                             book.setAuthor(resultSet.getString("author"));
156                             book.setPrice(resultSet.getFloat("price"));
157                             book.setImage(resultSet.getString("image"));
158                             book.setDescription(resultSet.getString("description"));
159                             book.setCategory_id(resultSet.getString("category_id"));
160                             item.setBook(book);
161                         }
162                     }
163                 }
164                 orders.setItems(items);
165             }
166             return orders;
167         }catch (SQLException e) {
168             e.printStackTrace();
169             throw new RuntimeException();
170         }finally{
171             JdbcUtil.close(connection, pStatement, resultSet);
172         }
173     }
174 
175     //下面几个方法 都是  后台内容   订单发货处理
176     //显示所有未发货的订单,还要查询出是哪个用户的
177     public List<Orders> findOrdersByState(int i) {
178         connection = JdbcUtil.getConnection();
179         try {
180             pStatement = connection.prepareStatement("select * from orders where state=? order by orderId desc");
181             pStatement.setInt(1,i);
182             resultSet = pStatement.executeQuery();
183             List<Orders> lo = new ArrayList<Orders>();
184             Orders order = null;
185             while(resultSet.next()){
186                 order = new Orders();
187                 order.setId(resultSet.getString("id"));
188                 order.setOrderId(resultSet.getString("orderId"));
189                 order.setNum(resultSet.getInt("num"));
190                 order.setState(resultSet.getInt("state"));
191                 order.setPrice(resultSet.getFloat("price"));
192                 //order.setUser(rs.getString("user_id"));
193                 lo.add(order);
194             }
195             if(lo != null && lo.size() > 0){
196                 //查询用户信息:少的一方,不管有没有需求,默认都是查出来的
197                 pStatement = connection.prepareStatement("select * from Users where id=(select user_id from orders where id=?)");
198                 for(Orders ord:lo){
199                     pStatement.setString(1,ord.getId());
200                     resultSet = pStatement.executeQuery();
201                     while(resultSet.next()){
202                         User user = new User();
203                         user.setId(resultSet.getString("id"));
204                         user.setUserName(resultSet.getString("userName"));
205                         user.setPassWord(resultSet.getString("passWord"));
206                         user.setCellPhone(resultSet.getString("cellPhone"));
207                         user.setMobilePhone(resultSet.getString("mobilePhone"));
208                         user.setAddress(resultSet.getString("address"));
209                         user.setEmail(resultSet.getString("email"));
210                         ord.setUser(user);
211                      }
212                 }
213             }
214             return lo;
215         } catch (SQLException e) {
216             e.printStackTrace();
217             throw new RuntimeException();
218         }finally{
219             JdbcUtil.close(connection, pStatement, resultSet);
220         }
221     }
222 
223     //把已寄出的商品,改成已发货状态
224     public void sureOrders(String ordersId) {
225         connection = JdbcUtil.getConnection();
226         try {
227             pStatement = connection.prepareStatement("update orders set state=? where id=?");
228             pStatement.setInt(1,1);
229             pStatement.setString(2,ordersId);
230             pStatement.executeUpdate();
231         } catch (SQLException e) {
232             e.printStackTrace();
233         }finally{
234             JdbcUtil.close(connection, pStatement, resultSet);
235         }
236     }
237 }

2.4、Servlet 控制器

ClientServlet 类

  1 package com.shore.web.controller.client;
  2 
  3 import java.io.IOException;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 import java.util.Map;
  7 
  8 import javax.servlet.ServletException;
  9 import javax.servlet.http.HttpServlet;
 10 import javax.servlet.http.HttpServletRequest;
 11 import javax.servlet.http.HttpServletResponse;
 12 import javax.servlet.http.HttpSession;
 13 
 14 import com.shore.entity.Cart;
 15 import com.shore.entity.CartItem;
 16 import com.shore.entity.Orders;
 17 import com.shore.entity.OrdersItem;
 18 import com.shore.entity.User;
 19 import com.shore.service.OrderService;
 20 import com.shore.service.impl.OrderServiceImpl;
 21 import com.shore.util.IdGeneratorKey;
 22 
 23 /**
 24  * @author DSHORE/2019-5-12
 25  *
 26  */
 27 public class ClientServlet extends HttpServlet {
 28     private static final long serialVersionUID = 1L;//序列化
 29     OrderService oService = new OrderServiceImpl();
 30     
 31     public void doGet(HttpServletRequest request, HttpServletResponse response)
 32             throws ServletException, IOException {
 33         String operation = request.getParameter("operation");
 34         if ("genOrders".equals(operation)) {
 35             genOrders(request,response);
 36         }else if ("showUsersOrders".equals(operation)) {
 37             showUsersOrders(request,response);
 38         }else if ("showOrdersDetail".equals(operation)) {
 39             showOrdersDetail(request,response);
 40         }
 41     }
 42 
 43     //查看订单的详细信息
 44     private void showOrdersDetail(HttpServletRequest request,
 45             HttpServletResponse response) throws ServletException, IOException {
 46         String ordersId = request.getParameter("ordersId");//取得订单的id(订单号)
 47         Orders ordersDetail = oService.findOrdersById(ordersId);//订单的明细还要查出来;明细中还要查询出书的信息
 48         request.setAttribute("ordersDetail", ordersDetail);
 49         request.getRequestDispatcher("/client/showOrdersDetail.jsp").forward(request, response);
 50     }
 51 
 52     //根据用户的id查询属于自己的订单
 53     private void showUsersOrders(HttpServletRequest request,
 54             HttpServletResponse response) throws ServletException, IOException {
 55         //判断用户是否登录:如果还没登录,则转向登录页面
 56         HttpSession session = request.getSession();
 57         User user = (User)session.getAttribute("user");
 58         if(user == null){
 59             request.setAttribute("message", "请先登录,2秒后将自动跳转到登录页面!<meta http-equiv='Refresh' content='2;URL="+request.getContextPath()+"/client/login.jsp'>");
 60             request.getRequestDispatcher("/client/message.jsp").forward(request, response);
 61             return;
 62         }
 63         List<Orders> UserOrders = oService.findOrdersByUsersId(user.getId());//查询某个用户的所有订单
 64         request.setAttribute("UserOrders", UserOrders);
 65         request.getRequestDispatcher("/client/listOrders.jsp").forward(request, response);
 66     }
 67 
 68     //付款购买:把订单和订单项的信息存入数据库中(生成订单)
 69     private void genOrders(HttpServletRequest request,
 70             HttpServletResponse response) throws ServletException, IOException {
 71         //判断用户是否登录:如果还没登录,则转向登录页面
 72         HttpSession session = request.getSession();
 73         User user = (User)session.getAttribute("user");
 74         if(user == null){
 75             request.setAttribute("message", "请先登录,2秒后将自动跳转到登录页面!<meta http-equiv='Refresh' content='2;URL="+request.getContextPath()+"/client/login.jsp'>");
 76             request.getRequestDispatcher("/client/message.jsp").forward(request, response);
 77             return;
 78         }
 79         String id = IdGeneratorKey.getPrimaryKey();//(UUID)自动生成:订单id
 80         String ordersId = IdGeneratorKey.genOrdersId();//自动生成:订单号
 81         //如果已登录,则从session中取出购物车中商品:Cart  Map<String,CartItem>  填充模型
 82         Cart cart = (Cart) session.getAttribute("cart");//购物车
 83         Orders orders = new Orders();//订单
 84         orders.setId(id);
 85         orders.setNum(cart.getNum());
 86         orders.setPrice(cart.getPrice());
 87         orders.setState(0);
 88         orders.setOrderId(ordersId);
 89         //购物项
 90         List<OrdersItem> ordersItems = new ArrayList<OrdersItem>();
 91         for(Map.Entry<String,CartItem> item:cart.getItems().entrySet()){
 92             CartItem cartItem = item.getValue();
 93             String orderItemId = IdGeneratorKey.getPrimaryKey();
 94             OrdersItem orderItem = new OrdersItem();
 95             //修改
 96             orderItem.setId(orderItemId);
 97             orderItem.setNum(cartItem.getNum());
 98             orderItem.setPrice(cartItem.getPrice());
 99             orderItem.setBook(cartItem.getBook());
100             ordersItems.add(orderItem);
101         }
102         orders.setItems(ordersItems);
103         oService.addOrders(orders,user);
104         session.removeAttribute("cart");//付款后,清空session中的购物车
105         request.setAttribute("message", "付款成功,请等待店家发货!<span style='font-size: 18px;'><br/><br/>也可点击“我的订单”,查看您的订单信息</span>");//中间的付款步骤没写,这里只是模拟了购物的流程
106         request.getRequestDispatcher("/client/message.jsp").forward(request, response);
107     }
108 
109     public void doPost(HttpServletRequest request, HttpServletResponse response)
110             throws ServletException, IOException {
111         doGet(request, response);
112     }
113 }

2.5、前端页面

listOrders.jsp 主页面

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@include file="/client/header.jsp"%>
 3 <style> 
 4     table tr th{ border:1px solid #C1C1C1; font-size: 16px;}
 5     table,table tr td { border:1px solid #C1C1C1; }
 6     table { width: 71%; min-height: 25px; line-height: 25px; border-collapse: collapse; padding:2px; margin:auto;text-align: center;}
 7 </style> 
 8 
 9 <h2 style="text-align: center;font-size: 20px">以下是您近期的订单</h2>
10 <table>
11        <tr>
12            <th>订单号</th>
13            <th>金额</th>
14            <th>订单状态</th>
15            <th>订单详情</th>
16        </tr>
17        <c:forEach items="${UserOrders}" var="uo">
18         <tr>
19              <td>${uo.orderId}</td>
20              <td>¥${uo.price}元</td>
21              <td>${uo.state==0?'未发货':'已发货'}</td>
22              <td>
23                  <a href="${pageContext.request.contextPath}/ClientServlet?operation=showOrdersDetail&ordersId=${uo.id}">查看明细</a>
24              </td>
25          </tr>
26     </c:forEach>
27 </table>

showOrdersDetail.jsp 明细页面

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@include file="/client/header.jsp"%>
 3 <style> 
 4     table tr th{ border:1px solid #C1C1C1; font-size: 16px;}
 5     table,table tr td { border:1px solid #C1C1C1; }
 6     table { width: 71%; min-height: 25px; line-height: 25px; border-collapse: collapse; padding:2px; margin:auto;text-align: center;}
 7 </style> 
 8 
 9 <div style="font-size: 15px;">
10     订单号:${ordersDetail.orderId}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11     总金额:¥${ordersDetail.price}元&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;明细如下:<br/>
12 </div>
13 <table>
14     <tr>
15         <th>书名</th>
16         <th>作者</th>
17         <th>单价</th>
18         <th>数量</th>
19         <th>小计</th>
20     </tr>
21     <c:forEach items="${ordersDetail.items}" var="od">
22         <tr>
23             <td>${od.book.name}1</td>
24             <td>${od.book.author}</td>
25             <td>¥${od.book.price}元</td>
26             <td>${od.num }</td>
27             <td>¥${od.price}元</td>
28         </tr>
29     </c:forEach>
30 </table>
31 <div style="text-align:left;width:280px; margin:0 auto;font-size: 15px;">
32     收货信息如下:<br/>
33     地址:${ordersDetail.user.address }<br/>
34     电话:${ordersDetail.user.cellPhone }<br/>
35 </div>    

 

 

 

把商品加入购物车中及删除操作(Servlet技术,简单演示)

 

 

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/10775869.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

posted @ 2019-04-26 18:10  DSHORE  阅读(5270)  评论(0编辑  收藏  举报