JAVA中实现session实现购物车原理思路(付源码)

假如我们要做一个简单的购物车,首先分析下购物车的组成部分.假使我们现在只需要两个属性,一个是商品的实体,另一个是商品的数量.业务中可以利用简单的map集合来实现购物车通过分析我们知道,如果想获取用户的购物车,且是自己的购物车,里面寄存了我们曾购买的物品属性和数量,我们想到了session这个对象,先来了解下session,以下资料借鉴网络

一个session就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户。一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束。
其工作原理是这样的:
1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;
2.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。
这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。
对于session标识号(sessionID),有两种方式实现:cookies和URL重写。

简单的了解之后,先分析下思路,当用户点击”加入到购物车”时,假使我从session取得购物车,首先要判断用户是不是第一次购物,如果是第一次购物,我们需要为用户创建购物车,如果不是则需要判断用户所选择的商品购物车里有没有(我们可以获取map的对象,我们迭代里面的商品,通过OID判断是不是为同一商品,或者通过其他方法获取到商品),如果没有我们需要在购物车里添加商品,如果有的话我们去得商品的数量,再+,在放回购物车里即可完成一次购物.最后把购物车放在session域中.代码实现如下:
JSP页面源代码为:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page  import="cn.itcast.utils.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   <title>My JSP 'product.jsp' starting page</title>
  </head>
    <body>
    <h1>购物页面</h1>
    <img src="/day11/img/1.jpg"/> <a href="/day11/sessionDemo2?id=1">加入到购物车</a>
    <img src="/day11/img/2.jpg"/> <a href="/day11/sessionDemo2?id=2">加入到购物车</a>
    <img src="/day11/img/3.jpg"/> <a href="/day11/sessionDemo2?id=3">加入到购物车</a>
    <img src="/day11/img/4.jpg"/> <a href="/day11/sessionDemo2?id=4">加入到购物车</a>
  </body>
</html>

JAVA代码是:

package cn.itcast.session;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 使用session实现购物车
 * @author 柳成风
 */
public class SessionDemo2 extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 1、获取到id
         * 2、得到商品名称创建一个数组
         * 3、判断是否是第一次购物 (得到session,是否为空)
         * 创建一个购物车 使用map<String,Integer>
         *  把商品名称和数量1放入到购物车
         * 4、不是第一次购物
         * 判断是否有相同名称的session值
         * 有相同的,得到商品的数量+1
         * 没有,直接吧商品名称和数量加入到购物车
         * 5、把购物车(map)放入到session里面
         */

        //获取id
        String id1 = request.getParameter("id");
        //把string转换成int
        int id = Integer.parseInt(id1);
        //得到商品的名称,数组代替数据库
        String[] names = {"手电","电视","冰箱","手机"};
        //根据获取value
        String name = names[id-1];
        //判断是否是第一次购物 cart  
        getAttribute(java.lang.String name) 
        @SuppressWarnings("unchecked")
        Map<String,Integer> map = (Map<String, Integer>)request.getSession().getAttribute("cart");
        //判断map是否为空
        if(map == null) {//第一次购物
            //创建购物车
            map = new HashMap<String,Integer>();
            //把商品名称和数量放入到map中(购物车中)
            map.put(name, 1);
        } else { //不是第一次购物
            //判断是否有相同名称session
            //第一种方式可以遍历
            if(map.containsKey(name)) {//有相同名称的key
                //得到商品的数量,+1
                int num = map.get(name);
                //把num+1,放到购物车
                map.put(name, num+1);
            } else { //没有相同的key
                //直接把商品名和数量1添加到购物车
                map.put(name, 1);
            }
        }
        //把购物车放到session里面
        request.getSession().setAttribute("cart", map);
        //向页面输出两个超链接 一个是继续购物 ,一个是结算
        //处理中文乱码
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("<a href='/day11/session/product.jsp'>继续购物</a>" +
                " <a href='/day11/session/cart.jsp'>结算</a>");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

购物车创建完毕,已经放进session中,同时向jsp页面相应.jsp页面源码为:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>My JSP 'cart.jsp' starting page</title>

  </head>

  <body>
    <h2>商品结算</h2>
        <h3><a href="/day11/sessionDemo3">清空购物车</a></h3>
    <%
        //获取session里面商品信息
        Map<String,Integer> map = (Map<String,Integer>)request.getSession().getAttribute("cart");
        //判断map是否为空
        if(map == null) {
    %>
        <h3>没有任何购物信息</h3>
    <%      
        } else {
            //现在map里面存储的是商品名称和数量
            //遍历map   两种 :1 获取所有key;2 获取key-value关系
            Set<String> set = map.keySet();//所有商品的名称
            //遍历set  两种 增强for  迭代
            for(String name : set) {
                //得到value值(商品数量)
                int num = map.get(name);
    %>
        <h3>商品名称 :<%=name %>,商品数量:<%=num %></h3>
    <% 
            }       
        }
     %>
  </body>
</html>

在具体的开发中,因业务需求不同,代码实现相比较会做出更多变化.但基本思路已经实现了.此文抛砖引玉.

  • 10
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值