ServletContextCookieHttpSessionHttpServletRequest 【Servlet】多个Servlet之间数据共享实现方案

多个Servlet之间数据共享实现方案
文章目录

    • 多个Servlet之间数据共享实现方案
      • 前言
      • 一、ServletContext
        • 1、介绍
        • 2、工作原理
        • 3、全局作用域对象的生命周期
        • 4、代码实现
        • 5、ServletCoext原理图![请添加图片描述](http://www.kaotop.com/file/tupian/20220330/15bb3272c03041938451fb4f43d361b0.jpg?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARXR1adu5KO-9peC8pe-9pcK0KdmIIMyRzJE=,size_20,color_FFFFFF,t_70,g_se,x_16)
      • 二、Cookie
        • 1、介绍
        • 2、原理
        • 3、代码实现
        • 4、Cookie销毁时机
        • 5、Cookie工作原理图
      • 三、HttpSession
        • 1、介绍
        • 2、HttpSession与Cookie的区别
        • 3、代码实现
        • 4、HttpSession工作原理图
        • 5、http服务器如何将用户与HttpSession关联起来
        • 6、getSession()与getSession(false)
        • 7、HttpSession销毁时机
        • 8、手动设置HttpSession空闲时间
      • 四、HttpServletRequest接口实现数据共享
        • 1、介绍
        • 2、代码实现
      • Over!

前言
  • 数据共享:即多个Servlet之间通过某种规则互相使用各自产生的数据 。例如下文练习中OneServlet工作完毕后,将产生的数据交给TwoServlet来使用 。
  • Servlet规范中提供四中数据共享方案
    • ServletContext接口
    • Cookie类
    • HttpSession接口
    • HttpServletRequest接口
一、ServletContext 1、介绍
  • 来自于Servlet规范中的一个接口 。在Tomcat中存在servelet-api.jar,在Tomcat中负责提供这个接口实现类 。
  • 如果两个Servlet来自于同一个网站 。彼此之间通过网站的ServletContext实例对象实现数据共享 。
  • 开发人员习惯将ServletContext对象称为【全局作用域对象】 。
2、工作原理
  • 每一个网站都存在一个全局作用域对象 。这个全局作用域对象【相当于】一个Map 。在这个网站中OneServlet可以将一个数据存入到全局作用域对象,当前网站中的其他Servlet此时都可以从全局作用域对象得到这个数据进行使用 。
3、全局作用域对象的生命周期
  • 在http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象 。
  • 在http服务器运行期间,一个网站只有一个全局作用域对象 。
  • 在http服务器运行期间,全局作用域对象一直处于存活状态 。
  • 在http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理 。
  • 全局作用域对象贯穿网站整个运行期间 。
4、代码实现
  • 【同一个网站中】OneServlet将数据共享给TwoServlet
  • OneServlet.java
    package com.Etui.Controller;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "OneServlet", value = "https://tazarkount.com/OneServlet")public class OneServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1.通过请求对象向Tomcat所要当前网站的全局作用域对象ServletContext application = request.getServletContext();// 2.将数据添加到全局作用域对象,作为共享数据application.setAttribute("key1", 123);}}
  • TwoServlet.java
    package com.Etui.Controller;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "TwoServlet", value = "https://tazarkount.com/TwoServlet")public class TwoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1.通过请求对象向Tomcat所要当前网站的全局作用域对象ServletContext application = request.getServletContext();// 2.从全局作用域对象中读取数据Integer value = https://tazarkount.com/read/(Integer) application.getAttribute("key1");System.out.println(value);}}
5、ServletCoext原理图 二、Cookie 1、介绍
  • Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
  • 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于Cookie对象进行数据共享 。
  • Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量 。
  • 在现实生活场景中,Cookie相当于用户在服务端得到【会员卡】 。
2、原理
  • 用户通过浏览器第一次向myWeb(所有案例项目的默认网站均为/myWeb)网站发送请求申请OneServlet 。OneServlet在运行期间创建一个Cookie存储与当前用户相关数据,OneServlet工作完毕后,将Cookie写入到响应头交还给当前浏览器 。浏览器收到响应包之后,将cookie存储在浏览器的缓存,一段时间之后,用户通过【同一个浏览器】再次向【/myWeb网站】发送请求申请TwoServelt时 。【浏览器需要无条件的将myWeb网站之前推送过来的Cookie,写入到请求头】发送过去 。此时TwoServlet在运行时,就可以通过读取请求头中cookie信息,得到OneServlet提供的共享数据 。
3、代码实现
  • 【Servlet】通过Cookie实现Servlet之间数据共享(实现案例)
4、Cookie销毁时机
  • 在默认情况下,Cookie对象存放在浏览器的缓存中 。因此只要浏览器关闭,Cookie对象就被销毁掉 。
  • 在手动设置情况下,可以要求浏览器将接受的Cookie存放在客户端计算机上,同时需要指定Cookie在硬盘上存活时间 。在存货时间范围内,关闭浏览器、关闭客户端计算机、关闭服务器,都不会导致Cookie被销毁 。在存货时间到达时,Cookie自动从硬盘上被删除 。
    cookie.setMaxAge(60); //设置cookie在(用户)硬盘上存活1分钟
5、Cookie工作原理图
三、HttpSession 1、介绍
  • HttpSession接口来自于Servlet规范下的一个接口 。存在于Tomcat中servlet-api.jar 。其实现类由Http服务器提供 。Tomcat提供实现类存在于servlet-api.jar 。
  • 如果两个Servlet来自于同一个网站,并且为同一个浏览器(用户)提供服务,此时借助于HttpSession对象进行数据共享 。
  • 开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】
2、HttpSession与Cookie的区别
  • 存储位置不同 。Cookie存放在客户端计算机,HttpSession存放在服务端计算机内存 。
  • 数据类型不同 。Cookie对象存储共享数据类型只能是String,HttpSession对象可以存储任意类型的共享数据(Object) 。
  • 数据数量不同 。一个Cookie对象只能存储一个共享数据,HttpSession使用map集合存储共享数据,所以可以存储任意数据共享数据 。
  • 参照物不同:Cookie相当于客户端在服务端的“会员卡”,HttpSession相当于客户在服务端的“私人保险柜” 。
3、代码实现
  • 【Servlet】通过HttpSession实现Servlet之间数据共享(实现案例)
4、HttpSession工作原理图
5、http服务器如何将用户与HttpSession关联起来
  • 通过cookie,即服务器在为用户创建session时,会同时创建一个Cookie对象作为用户访问session时的“钥匙”,该Cookie对象写入到响应体中,并存入用户的计算机/硬盘 。
6、getSession()与getSession(false)
  • getSession():如果当前用户在服务端已经拥有了自己的【私人储物柜】,要求Tomcat将这个【私人储物柜】进行返回,如果当前用户在服务端尚未拥有自己的【私人储物柜】,则要求Tomcat为当前用户创建一个全新的【私人储物柜】 。
  • getSession(false):如果当前用户在服务端已经拥有了自己的【私人储物柜】,则要求Tomcat将这个【私人储物柜】进行返回 。如果当前用户在服务端尚未拥有自己的私人储物柜,此时Tomcat将返回null 。
7、HttpSession销毁时机
  • 用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中 。
  • 在浏览器关闭时,意味着用户与他的HttpSession关系被切断 。
  • 由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁 。
  • 为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】,这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession 。
8、手动设置HttpSession空闲时间
  • 修改当前网站/WEB-INF/web.xml文件
    > >5
四、HttpServletRequest接口实现数据共享 1、介绍
  • 在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包 。而一个请求协议包只对应一个请求对象,因此servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个Servlet之间实现数据共享 。
  • 在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】 。
2、代码实现
  • OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据
  • OneServlet.java
    package com.Etui.controller;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "OneServlet", value = "https://tazarkount.com/one")public class OneServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1、将数据添加到请求作用域对象,作为共享数据request.setAttribute("key1", "HelloWorld");// 2、代替浏览器,向Tomcat索要TwoServlet来完成剩余任务request.getRequestDispatcher("/two").forward(request, response);}}
  • TwoServlet.java
    【ServletContextCookieHttpSessionHttpServletRequest 【Servlet】多个Servlet之间数据共享实现方案】package com.Etui.controller;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "TwoServlet", value = "https://tazarkount.com/two")public class TwoServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 读取OneServlet共享在作用域中的数据Object key1 = request.getAttribute("key1");// 输出测试System.out.println("TwoServlet接受的数据:" + key1);}}
Over!