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空闲时间。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章