estore商城案例(四、五)------添加购物车&购物车显示/生成订单&在线支付

一、添加购物车

1、获得商品id提交到servlet程序

2、根据id获取product对象

3、判断seesion中是否有存在购物车session。没有的话表示  添加的第一件商品  需要先创建session;有的话直接在session里添加获得的produce(添加product 要先判断session中是否存在对应的商品,存在话直接修改商品数量,没有的话新添加这个商品)。

servlet程序代码:

 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商城案例(二)------登录&添加商品&商品列表(下)中。

二、购物车显示

直接在jsp中遍历购物车session:

 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>

三、订单生成

1、先生成订单页面、然后封装订单信息计较到servlet。

2、订单信息封装到订单(order)实体中,获得用户session中的id,赋值给order实体中。

3、维护第三张出货表(orderitem)中的数据;从购物车cart中获取详细的信息填入orderitem实体中;

4、执行生成订单、创建商品出货表(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 }

四、在线支付

这里使用的是易宝支付的接口,不同第三方支付都会提供差不多的支付pai这里我就直接附上我的整个项目源码了:

http://pan.baidu.com/s/1hq7nDe0

estore商城案例(四、五)------添加购物车&购物车显示/生成订单&在线支付,布布扣,bubuko.com

时间: 2024-10-14 06:32:35

estore商城案例(四、五)------添加购物车&购物车显示/生成订单&在线支付的相关文章

estore商城案例(二)------登录&amp;添加商品&amp;商品列表(下)

撸完了登录模块,接着撸商品添加,和商品列表模块: 先亮出数据库: 1 DROP TABLE IF EXISTS products; 2 CREATE TABLE products ( 3 id varchar(100) NOT NULL, 4 name varchar(100) DEFAULT NULL, 5 price double DEFAULT NULL, 6 category varchar(100) DEFAULT NULL, 7 pnum int(11) DEFAULT NULL,

estore商城案例(二)------登录&amp;添加商品&amp;商品列表(上)

今天继续写一下第二个功能:登录&添加商品&商品列表 1.登录页面,很简单做个表单提交一下就可以了,记住登录的功能也先简单写一下,明天写filter过滤器会完善自动登录的功能,以及权限管理. 登录页面代码: 1 <html> 2 <head> 3 4 <title>My JSP 'login.jsp' starting page</title> 5 6 <script type="text/javascript">

estore商城案例(三)------Filter过滤器:自动登录&amp;权限管理

前面写好了用户登录\注册\添加商品的功能模块.下面写一下对于这些功能模块的相关过滤器---自动登录与权限管理: 一.自动登录: 业务逻辑是这样的:jsp登录页面有个“自动登录选项”,如果登录这勾选了,那么在serlvet程序中则会额外的生成一个保存用户名和密码的cookie,然后每次用户向服务器发送请求时,Filter过滤器都会先判断用户的登录状态(session),如果已经登录那么无需做出受任何操作直接放行,如果没有登录(无session),那么这时体现自动登录功能作用的时候到了,先获取自动登

estore商城案例(一)------用户注册&amp;邮件激活(下)

先补上昨天注册页面的验证码代码: 1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 BufferedImage bf=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 4 Graphics2D graphice=(Graphics2D

把商品添加到购物车的动画效果(贝塞尔曲线)

如图: 参考: Android补间动画,属性动画实现购物车添加动画 思路: 确定动画的起终点 在起终点之间使用二次贝塞尔曲线填充起终点之间的点的轨迹 设置属性动画,ValueAnimator插值器,获取中间点的坐标 将执行动画的控件的x.y坐标设为上面得到的中间点坐标 开启属性动画 当动画结束时的操作 难点: PathMeasure的使用 - getLength() - boolean getPosTan(float distance, float[] pos, float[] tan) 的理解

web day25 web day24 小项目练习图书商城, 购物车模块,订单模块,支付(易宝支付)

购物车模块 购物车存储: 保存在session中(本次使用的) 保存在cookie中 保存在数据库中 购物车相关类 购物车结构 CartItem:包含图书和数量,小计 Cart:包含一个Map<String,CartItem>和部分购物车操作方法 修改登录方法,在用户登录成功后,马上在session中添加一辆车 页面负责遍历存在session域中的购物车属性 添加购物车条目 清空购物车条目 指定删除购物车条目 图 我的购物车 top.jsp中存在一个链接:我的购物车 我的购物车直接访问/jsp

jQuery 复制节点的元素实现添加到购物车功能

描述: 用户点击左边div中的商品,对应商品会自动添加到右面的div中,类似电子商城中的添加到购物车功能. 主要用到了jquery中的复制节点功能,基本原理是首先获取点击的元素,然后将相应信息进行克隆,然后添加到右面的div中. 效果如果: show you code: <!doctype html> <html> <head> <meta charset="utf-8"> <title>jquery test</tit

vue登录功能和将商品添加至购物车实现

 2.1: 学子商城--用户登录 用户登录商城用户操作行为,操作用户输入用户名和密码 点击登录按钮,一种情况登录成功 一种情况登录失败 "用户名或密码有误请检查" 2.2:如何实现用户登录 (1)数据库 xz_login 用户登录表[id;uname;upwd] id INT uname VARCHAR(25) upwd  VARCHAR(32) 加密处理 xz_login 1  tom     123 2  jerry     123 知识扩展:加密通过复杂算法将明文加密转换密文保存

(实例篇)添加到购物车相关操作

我们有很多种方法实现将商品添加到购物车,通常的做法是点击"添加到购物车"按钮,会跳转到购物车,在购物车里可以点击"结算"按钮进行结算.而今天我给大家介绍一个更友好的解决方案. 默认情况下,购物车是隐藏不可见的,当用户点击添加到购物车按钮后,商品信息会添加到购物车,购物车会以按钮的形式出现在页面右下角,点击按钮则会展开购物车,显示购物车中的商品信息,同时也可以对购物车中的商品进行删除或者结算等操作.用户也可以暂时关闭购物车继续购物. HTML结构 HTML结构主要包括