Servlet之HttpSession对象详解

HttpSession 服务端的技术
服务器会为每一个用户 创建一个独立的HttpSession

HttpSession原理
当用户第一次访问Servlet时,服务器端会给用户创建一个独立的Session
并且生成一个SessionID,这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中
当用户再一次访问Servlet时,请求中会携带着cookie中的SessionID去访问
服务器会根据这个SessionID去查看是否有对应的Session对象
有就拿出来使用;没有就创建一个Session(相当于用户第一次访问)

域的范围:
    Context域 > Session域 > Request域
    Session域 只要会话不结束就会存在 但是Session有默认的存活时间(30分钟)

使用Session保存数据

public class Demo01 extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.setContentType("text/html;charset=UTF-8");
       request.setCharacterEncoding("UTF-8");

       // 获取参数
       String username = request.getParameter("username");

       // 获取session对象
       HttpSession session = request.getSession();
       // 保存数据
       session.setAttribute("username", username);
       // 打印SessionID
       System.out.println(session.getId());
   }

   public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
   }
}

测试获取Session域中的数据

public class Demo02 extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");

        HttpSession session = request.getSession();
        String username = (String)session.getAttribute("username");
        // 响应到网页上
        response.getWriter().write(username + " " + session.getId());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
    }
}

 模拟购物车

Session
钝化:服务器停止时,如果你的Session中保存了对象 并且该对象实现了序列化接口Serializable
系统会把你保存的Session序列化到 服务器的work文件夹你的工程下的一个文件
活化:当你重新启动了服务器 系统会重新把钝化下来的那个文件加载回Session中
 

Books

package com.ingy.service;

import java.io.Serializable;

public class Book implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String name;
    public Book() {
        super();
    }
    public Book(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "[图书编号:" + id + ", 图书名:" + name + "]";
    }
}

BookUtil

package com.ingy.service;

import java.util.HashMap;

public class BookUtil {
    // 声明一个保存书的容器
    private static HashMap<String, Book> books = new HashMap<>();

    // 添加数据
    static {
        books.put("1", new Book("1", "葵花宝典"));
        books.put("2", new Book("2", "辟邪剑谱"));
        books.put("3", new Book("3", "九阴真经"));
        books.put("4", new Book("4", "如来神掌"));
    }

    // 获取集合的方法
    public static HashMap<String, Book> getBooks() {
        return books;
    }
    // 按id查找对应的书
    public static Book findBookById(String id) {
        return books.get(id);
    }
}

BookServlet

package com.ingy.servlet;

import com.ingy.service.Book;
import com.ingy.service.BookUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Set;

@WebServlet(name = "BookServlet")
public class BookServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        // 获取全部图书
        HashMap<String, Book> books = BookUtil.getBooks();
        // 遍历
        Set<String> keySet = books.keySet();
        for (String key : keySet) {
            Book book = books.get(key);
            out.write("<a href='"+ req.getContextPath() +"/addBook?id="+book.getId()+"'>"+book.getName()+"</a><br>");
        }
        // 添加查看购物车的链接
        out.write("<a href='" + req.getContextPath() + "/show'>查看购物车</a>");

        // 设置session有效时间
        // request.getSession().setMaxInactiveInterval(5);
    }
}


AddBookUtil

package com.ingy.servlet;

import com.ingy.service.Book;
import com.ingy.service.BookUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.ArrayList;

@WebServlet(name = "AddBookServlet")
public class AddBookServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");

        // 获取参数(获取点击的是哪本书)
        String id = req.getParameter("id");
        Book book = BookUtil.findBookById(id);
        // 创建一个容器(相当于购物车 保存买的书)
        // 两种情况 1.已经存过书了 2.没存过
        HttpSession session = req.getSession();
        ArrayList<Book> car = (ArrayList<Book>)session.getAttribute("car");
        if (car == null) {
            // 相当于第一次访问 创建容器
            car = new ArrayList<>();
        }
        // 把书添加到容器中
        car.add(book);
        // 把这个容器添加到session中
        session.setAttribute("car", car);
        // 显示添加成功
        resp.getWriter().write("添加成功");
        // 一秒后返回商品列表页
        resp.setHeader("refresh", "1;url=" + req.getContextPath() + "/books");
    }
}

ShowServlet

package com.ingy.servlet;

import com.ingy.service.Book;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.io.PrintWriter;
import java.util.ArrayList;

@WebServlet(name = "ShowServlet")
public class ShowServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        HttpSession session = req.getSession();
        ArrayList<Book> car = (ArrayList<Book>)session.getAttribute("car");
        if (car != null) {
            // 遍历输出
            for (Book book : car) {
                out.write(book.getName() + "<br>");
            }
        } else {
            out.write("购物车是空的");
            // 两秒跳转图书列表
            resp.setHeader("refresh", "2;url=" + req.getContextPath() + "/books");
        }
    }
}

运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值