多Servlet之间数据共享实现的方式【Part3】

145 阅读6分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解多Servlet之间数据共享实现的方式,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

多Servlet之间数据共享实现

 1.'数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用
 ​
 2.Servlet规范中提供'四种数据共享方案
         1).ServletContext接口
 ​
         2).Cookie类
 ​
         3).HttpSession接口
 ​
         4).HttpServletRequest接口
ServletContext接口
 //介绍:
     1) 来自Servlet规范中的一个接口,Tomcat负责提供该接口的实现类
     2) 如果两个Servlet来自同一个网站。彼此之间通过网站的ServletContext'实例对象'来实现'数据共享
     3) 开发人员习惯将ServletConText的实例对象称为'全局作用域对象
 //工作原理
     每个网站都存在一个全局作用域对象,该对象相当于一个Map,网站中的一个Servlet将数据存放到全局作用域对象,该网站的其他所有Servlet都可以从全局作用域对象中得到该数据进行使用
 //生命周期
       全局作用域对象的生命周期贯穿网站的整个运行期间
         1)在Http服务器启动的过程中,自动在当前的网站内存中创建一个全局作用域对象
         2)在Http服务器的运行期间,'一个网站中只有一个全局作用域对象
         3)在Http服务器运行期间,该全局作用域对象一直处于存活状态
         4)在Http服务器准备关闭的时,负责将该全局作用域对象进行销毁
 //命令实现
         OneServlet{
             public void doGet(HttpServletRequest request,HttpServletResponse respnse){
                 //1、通过【请求对象】向【Tomcat】索要当前网站中的【全局作用域对象】
                 Servlet application  =  request.getServletContext();
                 //2、将数据添加到全局作用域对象中进行【共享数据】
                 application.setAttribute("key1","abc");
             }
         }
         
         TwoServlet{
             public void doGet(HttpServletRequest request,HttpServletResponse respnse){
                 //1、通过【请求对象】向【Tomcat】索要当前网站中的【全局作用域对象】
                 Servlet application  =  request.getServletContext();
                 //2、从全局作用域对象得到指定关键字对应数据
                Object 数据 =  application.getAttribute("key1");//(从Map中取出来的数据都是Object类型的,可以强转)
             }
         }
Cookie
 //介绍:
     1)Cookie来自Servlet规范中的一个工具类,存在于Tomcat提供的Servlet-api jar包中
     2)如果两个Servlet来自于同一个网站,且为同一个浏览器/用户提供服务,此时就可以借助Cookie对象进项数据的共享
     3)Cookie存放当前用户的私人数据,在共享过程中提高服务质量
     4)在现实中,Cookie类似于一张【会员卡】
 //原理
     用户通过浏览器第一次向当前网站发送请求申请OneServlet
     OneServlet在运行期间创建了一个Cookie存放与当前用户有关的数据
     OneServlet工作完毕之后,'将Cookie写入到响应头'交还给当前浏览器
     浏览器收到响应包之后,将该cookie写入到浏览器的缓存中去
     一段时间之后,用户通过【同一个浏览器】再次向【myWeb网站】发送请求申请TwoServlet时。
     【浏览器需要无条件的将myWeb网站之前推送过来的Cookie,写入到请求头】发送过去
     此时TwoServlet在运行时,就可以通过读取请求头中cookie中信息,得到OneServlet提供的'共享数据
 //实现命令:同一个网站 OneServlet 与  TwoServlet 借助于Cookie实现数据共享
        OneServlet{
                 public void doGet(HttpServletRequest request,HttpServletResponse response){
                     //1.创建一个cookie对象,保存共享数据(当前用户数据)
                      Cookie card1 = new Cookie("key1","abc");
                      Cookie card2 = new Cookie("key2","efg");
                     /*
                      ****cookie相当于一个map
                     ****一个cookie中只能存放一个键值对
                     ****这个键值对的key与value只能是String
                     ****键值对中key不能是中文
                     */
                     //2.【发卡】将cookie写入到响应头,交给浏览器
                      response.addCookie(card1);
                      response.addCookie(card2);
                 }
             }
 ​
             浏览器/用户      <---------响应包 【200】
                                              【cookie: key1=abc; key2=eft】
                                               【空白行】
                                               【处理结果】
 ​
                         浏览器向myWeb网站发送请求访问TwoServlet---->请求包 【url:/myWeb/two method:get】
                                                                        【
                                                                                     请求参数:xxxx
                                                                                 Cookie   key1=abc;key2=efg
                                                                          】
                                                                          【】
                                                                          【】
            TwoServlet{
                 public void doGet(HttpServletRequest request,HttpServletResponse resp){
                     //1.调用请求对象从请求头得到浏览器返回的Cookie
                     Cookie  cookieArray[] = request.getCookies();
                     //2.循环遍历数据得到每一个cookie的key 与 value
                   for(Cookie card:cookieArray){
                        String key =   card.getName(); 读取key  "key1"
                       Strign value = card.getValue();读取value "abc"
                       提供较好的服务。。。。。。。。
                   }
                 }
         }
 //Cookie销毁时机
 1.在默认情况下,Cookie对象存放在浏览器的缓存中。因此只要浏览器关闭,Cookie对象就被销毁掉
 ​
 2.在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机上硬盘上,同时需要指定Cookie在硬盘上存活时间。在存活时间范围内,关闭浏览器,关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。在存活时间到达时,Cookie自动从硬盘上被删除
 'cookie.setMaxAge(60);' //cookie在硬盘上存活1分钟
HttpSession
 //介绍:
     1)HttpSession接口来自于Servlet规范下一个接口。存在于Tomcat中servlet-api.jar
     其实现类由Http服务器提供。Tomcat提供实现类存在于servlet-api.jar
 ​
     2)如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时
     借助于HttpSession对象进行数据共享
 ​
     3)开发人员习惯于将HttpSession接口修饰对象称为'会话作用域对象
 //命令实现:   同一个网站(myWeb)下OneServlet将数据传递给TwoServlet
     OneServlet{
         public void doGet(HttpServletRequest request,HttpServletResponse response){
             //1.调用【请求对象】向Tomcat索要当前用户在服务端的私人储物柜
             HttpSession session = request.getSession();
             //2.将数据添加到用户私人储物柜
             session.setAttribute("key1",共享数据)
         }
     }
 浏览器访问/myWeb中TwoServlet
     TwoServlet{
     public void doGet(HttpServletRequest request,HttpServletResponse response){
         //1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜
         HttpSession   session = request.getSession();
         //2.从会话作用域对象得到OneServlet提供的共享数据
         Object 共享数据 = session.getAttribute("key1");
     }
 }
 ​
 //HttpSession销毁时机:
     1.用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中.
     2.在浏览器关闭时,意味着用户与他的HttpSession关系被切断
     3.由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁
     4.为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】这个空闲时间默认30分钟,如果当前HttpSession对象空闲时       间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession
 //HttpSession空闲时间手动设置
     在当前网站/web/WEB-INF/web.xml
     <session-config>
     <session-timeout>5</session-timeout> <!--当前网站中每一个session最大空闲时间5分钟-->
     </session-config>