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空閒時間。

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