HttpSession实例——购物车功能

HttpSession:会话作用域对象。用于解决cookie存储类型单一,存储数量少的问题。

在这里插入图片描述

java代码

//web.xml
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.luna.controller.OneServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.luna.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>

首先是购物页面…

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎选购</title>
</head>
<body >
    <h2 style="color: red;" align="center">欢迎选购</h2>
    <table align="center" border="1px">
        <tr>
            <td>商品名称</td>
            <td>商品单价</td>
            <td>供货商</td>
            <td>操作</td>
        </tr>
        <tr>
            <td>华为magic笔记本</td>
            <td>7000</td>
            <td>华为</td>
            <td><a href="/myweb/one?goodsName=华为magic笔记本">加入购物车</a></td>
        </tr>
        <tr>
            <td>榴莲</td>
            <td>200</td>
            <td>泰国</td>
            <td><a href="/myweb/one?goodsName=榴莲">加入购物车</a></td>
        </tr>
        <tr>
            <td>男士小袜</td>
            <td>50</td>
            <td>杭州</td>
            <td><a href="/myweb/one?goodsName=男士小袜">加入购物车</a></td>
        </tr>
        <tr align="center">
            <td colspan="4">
                <a href="/myweb/two">查看我的购物车</a>
            </td>
        </tr>
    </table>
</body>
</html>

当用户在购物页面index.html点击加入购物车时,商品参数会通过超链接发送给OneServlet,OneServlet通过request拿到商品参数并为用户建立session,通过goodsName的真实值确定商品数量,当前购物车此商品==null则令其为数量1,当前购物车此商品!=null则令其数量+1

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、调用请求对象获取请求头参数,得到用户选择的商品名
        String goodsName=request.getParameter("goodsName");
        //2、调用请求对象,向Tomcat索要当前用户在服务端的私人储物柜
        HttpSession session=request.getSession();
        //3、将用户选购商品添加到当前用户私人储物柜
        Integer goodsNum=(Integer) session.getAttribute(goodsName);
        if (goodsNum==null){
            session.setAttribute(goodsName,1);
        }else{
            session.setAttribute(goodsName,goodsNum+1);
        }

    }
}

当用户点击购物页面的"查看购物车"时,浏览器将通过超链接发送到TwoServlet。TwoServlet通过request拿到session,对其中元素进行遍历并输出。

public class TwoServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、调用请求对象,向Tomcat索要当前用户在服务端私人储物柜
        HttpSession session=request.getSession();
        //2、将session中的所有key读取出来,存放在一个枚举对象中
        Enumeration goodsNames=session.getAttributeNames();
        while(goodsNames.hasMoreElements()){
            String goodsName=(String) goodsNames.nextElement();
            int goodsNum=(int) session.getAttribute(goodsName);
            System.out.println("商品名称:"+goodsName+" 商品数量:"+goodsNum);
        }
    }
}

面试题:
1、cookie与session的区别

1)存储位置:Cookie存储在客户端计算机(浏览器内存/硬盘);HttpSession存放在服务端计算机内存。
2)数据类型:Cookie存储的数据类型只能是String;HttpSession可存储任意类型(Object)。
3)数据数量:一个Cookie只能存储一个共享数据;HttpSession可存储任意数量。
4 )参照物:Cookie相当于客户在服务端的会员卡;HttpSession相当于客户在服务端的私人保险柜。

2、Http服务器如何将用户与HttpSession关联起来?

通过Cookie。
Tomcat在创建一个HttpSession对象时自动为这个HttpSession对象生成一个编号(箱号)。Tomcat将箱号保存到cookie对象中,推送到当前浏览器缓存。格式为cookie:JSESSIONID=箱号
等到用户第二次访问,Tomcat根据请求头JSESSIONID确认用户是否有HttpSession以及哪一个HttpSession是当前用户。

流程图如下:

在这里插入图片描述

3、getSession()与getSession(false)的区别

1 )getSession():查看当前请求对象是否有session,如果有则返回session对象,如果没有就创建一个。
2 )getSession(false):查看当前请求对象是否有session,如果有则返回session对象,如果没有就返回null。

4、HttpSession的销毁时机

1)cookie是用户与session的关联,浏览器关闭则cookie销毁,也就是用户与session的关联断开。但Tomcat无法检测浏览器是否关闭,因此浏览器关闭时session并不会销毁。
2)为了解决这个问题,Tomcat为session对象设置了空闲时间,默认为30分钟,超过30分钟session将被销毁。另外,可以在web.xml文件中自定义session空闲时间。

购物车功能一般需要以下几个步骤: 1. 将商品加入购物车; 2. 修改购物车中商品的数量; 3. 删除购物车中的商品; 4. 清空购物车; 5. 计算购物车中商品的总价。 下面是一个简单的购物车实现: 1. 定义一个商品类 Item,包含商品的编号、名称、价格和数量等属性。 ``` public class Item { private int id; // 商品编号 private String name; // 商品名称 private double price; // 商品价格 private int quantity; // 商品数量 // 构造方法 public Item(int id, String name, double price, int quantity) { this.id = id; this.name = name; this.price = price; this.quantity = quantity; } // getter 和 setter 方法 // ... } ``` 2. 定义一个购物车类 ShoppingCart,包含购物车中所有商品的列表。 ``` public class ShoppingCart { private List<Item> itemList; // 商品列表 public ShoppingCart() { itemList = new ArrayList<Item>(); } // 加入商品到购物车 public void addItem(Item item) { itemList.add(item); } // 修改购物车中商品的数量 public void updateItemQuantity(int itemId, int quantity) { for (Item item : itemList) { if (item.getId() == itemId) { item.setQuantity(quantity); break; } } } // 从购物车中删除商品 public void removeItem(int itemId) { Iterator<Item> iterator = itemList.iterator(); while (iterator.hasNext()) { Item item = iterator.next(); if (item.getId() == itemId) { iterator.remove(); break; } } } // 清空购物车 public void clear() { itemList.clear(); } // 计算购物车中商品的总价 public double getTotalPrice() { double totalPrice = 0.0; for (Item item : itemList) { totalPrice += item.getPrice() * item.getQuantity(); } return totalPrice; } // getter 和 setter 方法 // ... } ``` 3. 在页面中使用 ShoppingCart 类实现购物车功能。 ``` <%-- 加入商品到购物车 --%> <% int itemId = Integer.parseInt(request.getParameter("itemId")); String itemName = request.getParameter("itemName"); double itemPrice = Double.parseDouble(request.getParameter("itemPrice")); int itemQuantity = Integer.parseInt(request.getParameter("itemQuantity")); Item item = new Item(itemId, itemName, itemPrice, itemQuantity); HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart) session.getAttribute("cart"); if (cart == null) { cart = new ShoppingCart(); session.setAttribute("cart", cart); } cart.addItem(item); %> <%-- 修改购物车中商品的数量 --%> <% int itemId = Integer.parseInt(request.getParameter("itemId")); int itemQuantity = Integer.parseInt(request.getParameter("itemQuantity")); HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart) session.getAttribute("cart"); if (cart != null) { cart.updateItemQuantity(itemId, itemQuantity); } %> <%-- 从购物车中删除商品 --%> <% int itemId = Integer.parseInt(request.getParameter("itemId")); HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart) session.getAttribute("cart"); if (cart != null) { cart.removeItem(itemId); } %> <%-- 清空购物车 --%> <% HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart) session.getAttribute("cart"); if (cart != null) { cart.clear(); } %> <%-- 显示购物车中商品的总价 --%> <% HttpSession session = request.getSession(true); ShoppingCart cart = (ShoppingCart) session.getAttribute("cart"); if (cart != null) { out.println("Total price: $" + cart.getTotalPrice()); } %> ``` 以上代码仅供参考,实际应用中需要根据具体需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值