JavaWeb學習篇—Servlet-Session數據處理

一、Session簡介:

Session 和 Cookie 一樣,同樣是在客戶端和服務器之間進行會話時用來傳輸數據的一種方式,不過Cookie數據是保存在客戶端的,而Session數據是存儲在服務器端的,然後服務器會給客戶端返回一個對應Session的ID存儲在客戶端的cookie中,當瀏覽器需要對應的數據時,就可以通過存儲在客戶端的Sessionid去服務器獲取對應的數據。這樣,也就可以解決用Cookie存儲數據的安全性問題。

二、在Session的基本使用方法:

2.1 Session的使用過程:

從服務器獲取一個session,如果能獲取到session,就將Session的id記錄下來,保存在瀏覽器;

如果獲取不到Session,就說明Session還不存在,就創建一個Session,將數據保存在服務器端,將Sessionid保存在客戶端的Cookie中。

獲取Session:

  • requset.getSession(); // 直接從服務器獲取Session
  • requset.getSession(boolean create) ; // 如果參數爲true, 就直接創建一個session,如果爲false,就相當於上面的方法從服務器獲取一個session

2.2 Session的作用:

作爲域對象使用:

  • Session的作用範圍:僅在當前Session域中有效(當前用戶)

2.3 Session的生命週期:

  • 創建session:requset.getSession(true);
  • 給Session域中添加數據:Session對象 . setAttribute(Stirng  s , Object  o); // s相當一是一個標識符,o是存入的數據,獲取數據的時候通過這個 字符串s獲取o
  • Session的銷燬:
    • 服務器非正常關閉的時候,Session被銷燬
    • 手動設置Session的最大生存時間:Session對象 . setMaxInactiveInterval(int interval) // 參數是以秒爲單位,一般爲正整數
    • 手動刪除Session : invalidate();

2.4 Session的特點:

  1. 可以存儲任意類型的數據
  2. 存儲的數據沒有大小限制
  3. 適合用來存儲私有數據

三、Session的使用案例:

3.1 Session基本使用案例:

後臺往session中寫入數據

前臺jsp頁面輸出獲取到的數據:

運行結果:

3.2 Session案例 — 模擬實現將商品加入購物車

簡單寫幾個商品界面:

product_list.jsp  商品清單的界面,點擊商品之後會跳轉到對應的商品界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>列表清單</title>
</head>
<body>
<table border="0px" >
    <tr>
        <td colspan="4">
            <img src="../img/頂部.jpg" width="100%" />
        </td>
    </tr>
    <tr>
        <td>
            <a href="001.jsp">
                <img src="../img/001.jpg" />
            </a>
        </td>
        <td>
            <a href="002.jsp">
                <img src="../img/002.jpg" />
            </a>
        </td>
        <td>
            <a href="003.jsp">
                <img src="../img/003.jpg" />
            </a>
        </td>
        <td>
            <a href="004.jsp">
                <img src="../img/004.jpg" />
            </a>
        </td>
    </tr>
</table>
<hr/>
<a href="showCart.jsp">查看購物車</a>
</body>
</html>

001.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>watch</title>
</head>
<body>
<center>
    <img src="../img/001.jpg" width="200" height="200"/>
</center>
<center>
    價格:888 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href="">立即購買</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href='/add2Cart?name="手錶"'>加入購物車</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href="showCart.jsp">查看購物車</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href="product_list.jsp">回到主頁</a>
</center>
</body>
</html>

002.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>watch</title>
</head>
<body>
<center>
    <img src="../img/002.jpg" width="200" height="200"/>
</center>
<center>
    價格:666 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href="">立即購買</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href='/add2Cart?name="洗面奶"'>加入購物車</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href="showCart.jsp">查看購物車</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <a href="product_list.jsp">回到主頁</a>
</center>
</body>
</html>

幾個商品界面基本一樣,這裏就放兩個商品的代碼了。

查看購物車的頁面:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%--
  Created by IntelliJ IDEA.
  User: ASUS
  Date: 2019/6/1
  Time: 16:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>show</title>
</head>
<body>
<table border="1px" cellpadding="0px" cellspacing="0px" align="center" >
    <tr bgcolor="#ffe4c4">
        <th width="100px">商品名稱</th>
        <th width="100px">商品數量</th>
    </tr>
        <c:choose>
            <c:when test="${empty sessionScope.cart}">
                <tr>
                  <td colspan="2">
                        購物車空空如也~~~
                    </td>
                </tr>
            </c:when>
            <c:otherwise>
                <c:forEach items="${cart}" var="item">
                    <tr bgcolor="gray">
                        <td >
                           <c:out value="${item.key}"/>
                        </td>
                        <td>
                            <c:out value=" ${[item.value]}"/>
                        </td>
                    </tr>
                </c:forEach>
            </c:otherwise>
        </c:choose>
</table>
</body>
</html>

後臺獲取信息並處理數據的Servlet

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Add2Cart extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 當用戶點擊加入購物車的時候 在後臺獲取點擊的商品對應的id
        String name  = request.getParameter("name");
//        獲取名字爲cart的session數據
        HttpSession session = request.getSession();
        Map<String, Long> cartMap = (Map<String, Long>) session.getAttribute("cart");
//            如果爲空,表示還沒有創建購物車的Session
        if (cartMap == null)
        {
            Map<String, Long> cart = new HashMap();
            cart.put(name, 1L);
            session.setAttribute("cart", cart);
        }
// 如果不爲空,說明已經創建過session了,現在需要在獲取到的購物車中判斷是否包含現在訪問的
// 名稱的商品,如果有當前商品,讓商品的個數加一,如果沒有當前商品,就放入當前商品,數量爲1
        else
        {
            if (cartMap.keySet().contains(name))
            {
                cartMap.put(name, cartMap.get(name)+1);
            }
            else
            {
                cartMap.put(name, 1L);
            }
// 吧數據更新後的購物車存入session中
            session.setAttribute("cart", cartMap);
        }
// 設置最大生存時間,單位爲秒
        session.setMaxInactiveInterval(1200);
        response.getWriter().write(name+"添加到購物車成功<hr/>");
//        if (cartMap != null)
//             System.out.println(cartMap.get(name));
        response.getWriter().write("<a href='history/product_list.jsp'>回到首頁</a>");
    }
}

運行結果:

查看購物車的信息:

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