1、添加購物車html
一、得到商品id提交到servlet程序java
二、根據id獲取product對象session
三、判斷seesion中是否有存在購物車session。沒有的話表示 添加的第一件商品 須要先建立session;有的話直接在session裏添加得到的produce(添加product 要先判斷session中是否存在對應的商品,存在話直接修改商品數量,沒有的話新添加這個商品)。jsp
servlet程序代碼:ide
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 //獲取傳過來的id根據id或product對象, 4 String id=request.getParameter("id"); 5 if(!"".equals(id)&&id!=null) 6 { 7 Product p=new Product(); 8 p.setId(id); 9 ProductService ps=new ProductServiceImpl(); 10 p=ps.getProduct(p); 11 if(p!=null) 12 { 13 //判斷seesion中是否有存在購物車session 14 Map<Product,Integer> cart=(Map<Product, Integer>) request.getSession().getAttribute("cart"); 15 if(cart==null){ 16 //沒有的話表示 添加的第一件商品 須要先建立session 17 cart=new HashMap<Product, Integer>(); 18 } 19 20 //有的話直接在session裏添加得到的produce 21 //添加product 判斷session中是否存在對應的商品 存在話直接修改商品數量,沒有的話新添加這個商品 22 if(cart.containsKey(p)) 23 { 24 //存在話直接修改商品數量 25 int i=cart.get(p)+1; 26 cart.put(p, i); 27 } 28 else 29 { 30 //沒有的話新添加這個商品,並附加上商品的全部信息 31 cart.put(p, 1); 32 } 33 response.setContentType("text/html;charset=utf-8"); 34 request.getSession().setAttribute("cart", cart); 35 response.getWriter().print("添加到 購物車成功 . <a href='"+request.getContextPath()+"/listproducts'>繼續購物</a><br/><a href='"+request.getContextPath()+"/cart.jsp'>查看購物車</a>"); 36 return; 37 } 38 39 } 40 request.getRequestDispatcher("/listproducts").forward(request, response); 41 }
service層和dao層在estore商城案例(二)------登陸&添加商品&商品列表(下)中。工具
2、購物車顯示post
直接在jsp中遍歷購物車session:spa
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 <title>My JSP 'cart.jsp' starting page</title> 7 </head> 8 <body> 9 <c:if test="${empty cart }"> 10 你還木有購買過任何商品 11 </c:if> 12 <c:if test="${not empty cart }"> 13 <h3>您購買的商品有 :</h3> 14 <table border="1" width="100%"> 15 <tr> 16 <td>商品編號</td> 17 <td>商品名稱</td> 18 <td>商品價格</td> 19 <td>購買數量</td> 20 <td>庫存狀況</td> 21 </tr> 22 <!-- Ma<> --> 23 <c:forEach items="${cart }" var="entry"> 24 <tr> 25 <td>${entry.key.id }</td> 26 <td>${entry.key.name }</td> 27 <td>${entry.key.price }</td> 28 <td>${entry.value }</td> 29 <td> 30 <c:if test="${entry.key.pnum>=entry.value }"> 31 <font color="red">現貨充足</font> 32 </c:if> 33 <c:if test="${entry.key.pnum<entry.value }"> 34 <font color="gray">庫存緊張</font> 35 </c:if> 36 </td> 37 <c:set var="totalprice" value="${totalprice+ entry.key.price*entry.value }"></c:set> 38 </tr> 39 </c:forEach> 40 <tr> 41 <td colspan="5" align="right" style="color: red"> 42 商品總價: ${totalprice } 43 </td> 44 </tr> 45 </table> 46 <div align="right"> 47 <img src="/myestore/img/gotoorder.bmp" style="cursor: pointer;" onclick="location.href='${pageContext.request.contextPath}/add_order.jsp';"> 48 </div> 49 </c:if> 50 </body> 51 </html>
3、訂單生成線程
一、先生成訂單頁面、而後封裝訂單信息計較到servlet。code
二、訂單信息封裝到訂單(order)實體中,得到用戶session中的id,賦值給order實體中。
三、維護第三張出貨表(orderitem)中的數據;從購物車cart中獲取詳細的信息填入orderitem實體中;
四、執行生成訂單、建立商品出貨表(orderitem)、修改商品表中相應商品的數量的操做。這裏注意,這三個操做要麼同時成功,要麼同時失敗,因此要在事務中執行。
訂單頁面:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 3 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 5 <html> 6 <head> 7 8 <title>My JSP 'add_order.jsp.jsp' starting page</title> 9 10 </head> 11 12 <body> 13 <h1>生成訂單</h1> 14 <form action="${pageContext.request.contextPath }/generateorder" method="post"> 15 <table> 16 <tr> 17 <td>收貨人信息 </td> 18 <td> 19 <textarea cols="80" rows="5" name="receiverinfo"></textarea> 20 </td> 21 </tr> 22 <tr> 23 <td>付款方式 </td> 24 <td style="color: red"> 25 <input type="radio" name="paymethod" value="yibaozhifu">易寶支付 26 <input type="radio" name="paymethod" value="alipay">支付包 27 <input type="radio" name="paymethod" value="caifutong">財付通 28 </td> 29 </tr> 30 </table> 31 <h3>購買商品詳情</h3> 32 <table border="1" width="100%"> 33 34 <tr> 35 <td>商品編號</td> 36 <td>商品名稱</td> 37 <td>商品價格</td> 38 <td>購買數量</td> 39 <td>庫存狀況</td> 40 </tr> 41 <!-- Ma<> --> 42 <c:forEach items="${cart }" var="entry"> 43 <tr> 44 <td>${entry.key.id }</td> 45 <td>${entry.key.name }</td> 46 <td>${entry.key.price }</td> 47 <td>${entry.value }</td> 48 <td> 49 <c:if test="${entry.key.pnum>=entry.value }"> 50 <font color="red">現貨充足</font> 51 </c:if> 52 <c:if test="${entry.key.pnum<entry.value }"> 53 <font color="gray">庫存緊張</font> 54 </c:if> 55 </td> 56 <c:set var="totalprice" value="${totalprice+ entry.key.price*entry.value }"></c:set> 57 </tr> 58 </c:forEach> 59 <tr> 60 <td colspan="5" align="right" style="color: red"> 61 商品總價: ${totalprice } 62 <input type="hidden" name="money" value="${totalprice }"> 63 </td> 64 </tr> 65 </table> 66 <input type="submit" value="生成訂單"> 67 </form> 68 </body> 69 </html>
servlet程序:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 //訂單信息封裝到order實體中 4 Order order=new Order(); 5 try { 6 BeanUtils.populate(order, request.getParameterMap()); 7 //得到session中用戶的id,傳給賦值給order實體中 8 User user = (User) request.getSession().getAttribute("existUser"); 9 order.setUser_id(user.getId()); 10 //維護第三張表orderitem中的數據,從cart中獲取詳細的信息 11 Map<Product,Integer>map=(Map<Product, Integer>) request.getSession().getAttribute("cart"); 12 List<OrderItem> orderitem=new ArrayList<OrderItem>(); 13 for(Product p:map.keySet()) 14 { 15 OrderItem ord=new OrderItem(); 16 ord.setProduct_id(p.getId()); 17 ord.setBuynum(map.get(p)); 18 //ord.id??? 19 orderitem.add(ord); 20 } 21 order.setList(orderitem); 22 //執行生成訂單\建立商品出貨表(orderitem)\修改商品 表中相應商品的數量 23 OrderService os=new OrderServiceImpl(); 24 int b=os.insert(order); 25 response.setContentType("text/html;charset=utf-8"); 26 request.getSession().removeAttribute("cart"); 27 if(b==OrderServiceImpl.SUCCESS) 28 { 29 //訂單生成成功 30 //清理購物車 31 //response.getWriter().print("訂單生成成功!!!!!<a href='"+request.getContextPath()+"/index.jsp'>返回</a>"); 32 //跳轉到在線支付頁面 33 Order orders=OrderServiceImpl.ORDERS; 34 request.getSession().setAttribute("orders", orders); 35 request.getRequestDispatcher("/gopay.jsp").forward(request, response); 36 //完成支付後,修改訂單狀態 37 //由支付公司回傳數據給callbackpay 本身寫的servlet程序 判斷回傳有效性後,判斷回傳結果...... 38 return; 39 } 40 if(b==OrderServiceImpl.NOTENOUGH){ 41 response.getWriter().print("庫存不足啦!!!!!<a href='"+request.getContextPath()+"/index.jsp'>返回</a>"); 42 return; 43 } 44 if(b==OrderServiceImpl.FAIL){ 45 response.getWriter().print("訂單生成失敗!!!!!<a href='"+request.getContextPath()+"/index.jsp'>返回</a>"); 46 return; 47 } 48 } catch (Exception e) { 49 50 e.printStackTrace(); 51 throw new MyRuntimeException(e); 52 } 53 54 }
orderserviceImpl:(接口orderservice沒寫)
1 public class OrderServiceImpl implements OrderService { 2 public static int SUCCESS=1; 3 public static int FAIL=0; 4 public static int NOTENOUGH=-1; 5 public static Order ORDERS=null; 6 private OrderItemDao oidao=DaoFactory.getInstance().createDao(OrderItemDao.class); 7 private OrderDao odao=DaoFactory.getInstance().createDao(OrderDao.class); 8 private ProductDao pdao=DaoFactory.getInstance().createDao(ProductDao.class); 9 @Override 10 public int insert(Order order) { 11 //建立事務 處理 添加訂單order,添加訂單詳情表orderitem,修改product庫存 12 // ThreadLocal 類 , 內部維護了 一個map , key就是當前線程, value 就是你存的對象 13 // 將一個 connection 存入到 這個 Threalocal的 實例中, 那麼這個connecttion 也就 14 // 綁定 與 當前線程 上了 15 try{ 16 utils.TransactionUtils.startTransaction(); 17 //1,生成訂單插入order表 18 String orderId="order"+utils.UUIDtoHashCode.getUUIDHsahCode(); 19 order.setId(orderId); 20 odao.insert(TransactionUtils.getConnection(),order); 21 //oreritem表 22 List<OrderItem>orderitem=new ArrayList<OrderItem>(); 23 orderitem=order.getList(); 24 for (OrderItem odi : orderitem) { 25 odi.setOrder_id(orderId); 26 oidao.insert(TransactionUtils.getConnection(),odi); 27 pdao.update(TransactionUtils.getConnection(),odi); 28 } 29 ORDERS=order; 30 TransactionUtils.commit(); 31 return SUCCESS; 32 } 33 catch (Exception e) { 34 // TODO: handle exception 35 // 回滾事務 36 TransactionUtils.roolback(); 37 if("not enough".equalsIgnoreCase(e.getMessage())) 38 { 39 40 return NOTENOUGH; 41 } 42 } 43 return FAIL; 44 }
事務工具包:
1 public class TransactionUtils { 2 //建立線程變量爲Connection的threadlocal(tl) 3 private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>(); 4 private static Connection con=JdbcUtils.getConnection(); 5 //給這個tl初始化 connection值 6 public static Connection getConnection() 7 { 8 if(tl.get()==null) 9 { 10 tl.set(con); 11 } 12 return tl.get(); 13 } 14 //開始transaction 15 public static void startTransaction() 16 { 17 Connection conn=tl.get(); 18 if(conn==null) 19 conn=getConnection(); 20 try { 21 22 conn.setAutoCommit(false); 23 } catch (SQLException e) { 24 25 e.printStackTrace(); 26 throw new MyRuntimeException(e); 27 } 28 } 29 //commit 30 public static void commit() 31 { 32 Connection conn=tl.get(); 33 if(conn==null) 34 conn=getConnection(); 35 try { 36 conn.commit(); 37 } catch (SQLException e) { 38 39 e.printStackTrace(); 40 throw new MyRuntimeException(e); 41 } 42 } 43 //rollback 44 public static void roolback() 45 { 46 Connection conn=tl.get(); 47 if(conn==null) 48 conn=getConnection(); 49 try { 50 51 conn.rollback(); 52 } catch (SQLException e) { 53 54 e.printStackTrace(); 55 throw new MyRuntimeException(e); 56 } 57 } 58 59 }
4、在線支付
這裏使用的是易寶支付的接口,不一樣第三方支付都會提供差很少的支付pai這裏我就直接附上個人整個項目源碼了: