热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

多个Servlet之间数据共享实现方案1实现方案2ServletContext接口2.1、介绍2.2、工作原理2.3、全局作用域生命周期2.4、命令实现3Cookie3.1、


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

  • 1>实现方案
  • 2>ServletContext接口
    • 2.1、介绍
    • 2.2、工作原理
    • 2.3、全局作用域生命周期
    • 2.4、命令实现
  • 3>COOKIE
    • 3.1、介绍
    • 3.2、原理
    • 3.3、实现命令
  • 4>COOKIE生命周期
  • 5>HttpSession接口
    • 5.1、介绍
    • 5.2、HttpSession与COOKIE区别《面试题》
    • 5.3>命令实现
    • 5.4、Http服务器如何将用户与HttpSession关联
    • 5.5、getSession()与getSession(false)
    • 5.6、HttpSession销毁时机
    • 5.7、HttpSession空闲时间手动设置
    • 5.8、利用HttpSession模拟购物车
  • 6>HttpServletRequest接口实现数据共享
    • 6.1、介绍
    • 6.2、命令实现


1>实现方案


  • 1、数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用
  • 2、Servlet规范中提供四种解决方案
    • 1)ServletContext接口
    • 2)COOKIE类
    • 3)HttpSession接口
    • 4)HttpServletRequest接口

2>ServletContext接口


2.1、介绍


  • 1、来自Servlet规范中一个接口。在Tomcat中存在servlet-api.jar,在Tomcat中负责提供这个接口实现类。
  • 2、如果两个Servlet来自于同一个网站。彼此之间通过网站的ServletContext实例对象实现数据共享
  • 3、开发人员习惯于将ServletContext对象称为《全局作用域对象》

2.2、工作原理


  • 每一个网站都存在一个全局作用域对象。
  • 这个全局作用域对象《相等于》一个Map。
  • 在这个网站中OneServlet可以将一个数据存到全局作用域对象,当前网站中其它Servlet此时都可以从全局作用域对象得到这个数据进行使用
    在这里插入图片描述

2.3、全局作用域生命周期


  • 1、在Http服务器启动过程中,自动为当前网站内存中创建一个全局作用域对象
  • 2、在Http服务器运行期间,一个网站只有一个全局作用域对象
  • 3、在Http服务器运行期间,全局作用域对象一直处于存活状态
  • 4、在Http服务器准备关闭时,负责将当前网络中全局作用域对象进行销毁处理
    • 全局作用域对象生命周期贯穿网站整个运行期间

2.4、命令实现


  • 《同一个网站》OneServlet将数据共享给TwoServlet

OneServlet{public void doGet(HttpServletRequest request,HttpServletResponse response)//1、通过《请求对象》向Tomcat索要当前网站中《全局作用域对象》这个对象名约定俗成ServletContext application = request.getServletContext() //2、将数据添加到全局作用域对象作为《共享数据》application.setAttribute("key1",数据);}
}TwoServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){//1、通过《请求对象》向Tomcat索要当前网站中《全局作用域对象》ServletContext application = request.getServletContext() //2、从全局作用域对象得到指定关键字对应数据Object 数据 = application.getAttribute("key1");}
}

3>COOKIE

在这里插入图片描述


3.1、介绍


  • 1、COOKIE来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
  • 2、如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于COOKIE对象进行数据共享
  • 3、COOKIE存放当前用户的私人数据,在共享数据过程中提高服务质量
  • 4、在现实生活场景中,COOKIE相等于一个会员卡

3.2、原理


  • 用户通过浏览器第一次向MyWeb网站发送请求申请OneServlet
  • OneServlet在运行期间创建一个COOKIE存储于当前用户相关数据OneServlet工作完毕后,《将COOKIE写入到响应头》交还给当前浏览器
  • 浏览器收到响应包之后,将COOKIE存储在浏览器的缓存,一段时间之后,用户通过《同一个浏览器》再次向《myweb网站》发送请求申请TwoSevlet时,《浏览器需要无条件的将MyWeb网站之间推送过来的COOKIE,写入到请求头》发送过去
  • 此时TwoServlet运行时,就可以通过读取请求头COOKIE中信息,得到OneServlet提供的共享数据

3.3、实现命令


  • 同一个网站OneServlet与TwoServlet借助于COOKIE实现数据共享

OneServlert{public void doGet(HttpServletRequest request,HttpServletResponse response){//1.创建一个COOKIE对象,保存共享对象(当前用户数据)COOKIE card = new COOKIE("key1","abc");COOKIE card1 =xxxx//COOKIE相等于一个map//一个COOKIE中只能存放一个键值对//这个键值对key与value只能是String//键值对key不能是中文card.setMaxAge(60);//指定card最多在硬盘中存活1分钟//2.《发卡》将COOKIE写入到响应头,交给浏览器response.addCOOKIE(card);response.addCOOKIE(card1);}
}
TwoServlet{public void doGet(HttpServletRequest request,HttpServletResponse response){//1.调用请求对象从请求头得到浏览器返回的COOKIECOOKIE COOKIEArrary[] = request.getCOOKIEs();//2.循环遍历数据得到每一个COOKIE的key与valuefor(COOKIE card:COOKIEArray){String key = card.getName();//读取key "key1"String value =card.getValue();//读取value "abc"//提供好的服务}}
}

4>COOKIE生命周期


  • 1、在默认情况下,COOKIE对象存放在浏览器的缓存中。因此只要浏览器关闭,COOKIE对象就被销毁掉
  • 2、在手动设置情况下,可以要求浏览器将接受的COOKIE存放在客户端计算机上硬盘上,同时需要制定COOKIE在硬盘上存活时间。在存活时间范围内,关闭浏览器、关闭客户端计算机,关闭服务器,都不会导致COOKIE被销毁。在存活时间到达时,都不会被销毁

5>HttpSession接口


5.1、介绍


  • 1)HttpSession接口来自于Servlet规范下一个接口。存在于Tomcat中servlet-api.jar,其实现类由Http服务器提供。Tomcat提供实现类存在于servlet-api.jar
  • 2)如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时解决于HttpSession对象进行数据共享
  • 3)开发人员习惯于将HttpSession接口修饰对象称为《会话作用域对象》

5.2、HttpSession与COOKIE区别《面试题》


  • 1)存储位置:一个在天上,一个在地下
    • COOKIE:存放在客户端计算机(浏览器内存/硬盘)
    • HttpSession:存放在服务端计算机内存
  • 2)数据类型:
    • COOKIE对象存储共享数据类型只能是String
    • HttpSession对象可以存储任意类型的共享数据object
  • 3)数据数量:
    • 一个COOKIE对象只能存储一个共享数据
    • HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据
  • 4)参照物:
    • COOKIE相当于客户在服务端《会员卡》
    • HttpSession相等于客户在服务端《私人保险柜》

5.3>命令实现


  • 同一个网站下OneSevlet将数据传递给TwoSevlet

OneServlet{public void doGet(HttpSevletRequest request,HttpServletResponse response) {//1、调用请求对象向Tomcat索要当前在服务端的私人储物柜HttpSession session = request.getSession();//2、将数据添加到用户私人储物柜session.setAttribute("key1",共享数据);}
}

  • 浏览器访问/myWeb中TwoServlet

TwoServlet{public void doGet(HttpSevletRequest request,HttpServletResponse response) {
//1、调用请求对象向Tomcat索要当前用户在服务端的私人储物柜
HttpSession session = request.getSession();
//2、从会话作用域对象得到OneServlet提供的共享数据
Object 共享数据 = session.getAttribute("key1");}
}

5.4、Http服务器如何将用户与HttpSession关联


  • COOKIE

5.5、getSession()与getSession(false)


  • 1)getSession():
    • 如果当前用户在服务端已经拥有自己的私人储物柜,要求tomcat将这个私人储物柜进行返回
      • 如果当前用户在服务端尚未拥有自己的私人储物柜,要求tomcat为当前用户创建一个全新的私人储物柜
  • 2)getSession(false):
    • 如果当前用户在服务端已经拥有了自己的私人储物柜进行返回
    • 如果当前用户在服务端尚未拥有自己的私人储物柜,此时Tomcat将返回null

5.6、HttpSession销毁时机


  • 1、用户在HttpSession关联时使用的COOKIE只能存放在浏览器缓存中
  • 2、在浏览器关闭时,意味着用户与他的HttpSession关系被切断
  • 3、由于Tomcat无法检测浏览器合适关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁
  • 4、为了解决这个问题,Tomcat为每一个HttpSession对象设置《空闲时间》,默认为30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession

5.7、HttpSession空闲时间手动设置


  • 在当前网站/web/WEB-INF/web.xml

<session-config><session-timeout>5</session-timeout><!--当前网站中每一个session最大控件事件5分钟-->
</session-config>

5.8、利用HttpSession模拟购物车

在这里插入图片描述


  • html页面

<!DOCTYPE html>
<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><title>Title</title>
</head>
<body><table><tr><td>商品</td><td>价格</td></tr><tr><td>华为手机</td><td>5000</td><td><a href&#61;"/myWeb/one?goodsname&#61;华为手机">放入购物车</a></td></tr><tr><td>榴莲</td><td>300</td><td><a href&#61;"/myWeb/one?goodsname&#61;榴莲">放入购物车</a></td></tr><tr align&#61;"center"><td colspan&#61;"4"><a href&#61;"/myWeb/two">查看我的购物车</a></td></tr></table>
</body>
</html>

  • OneServlet

package com.bjpowernode.controller;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.Enumeration;public class OneServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession httpSession &#61; request.getSession();String goodsname &#61; request.getParameter("goodsname");Integer goodsNum &#61; (Integer) httpSession.getAttribute(goodsname);if (goodsNum&#61;&#61;null) {httpSession.setAttribute(goodsname, 1);}else {httpSession.setAttribute(goodsname,goodsNum&#43;1);}}
}

  • TwoServlet

package com.bjpowernode.controller;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.Enumeration;public class TwoServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession httpSession &#61; request.getSession();Enumeration goodsnames &#61; httpSession.getAttributeNames();while (goodsnames.hasMoreElements()){String goodsname &#61;(String)goodsnames.nextElement();int goodsNum &#61; (int)httpSession.getAttribute(goodsname);System.out.println("商品名称 "&#43;goodsname&#43;" 商品数量"&#43;goodsNum);}}
}

6>HttpServletRequest接口实现数据共享


6.1、介绍


  • 1)在同一个网站中&#xff0c;如果两个Servlet之间通过《请求转发》方式进行调用&#xff0c;彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象&#xff0c;因此servlet之间共享同一个请求对象&#xff0c;此时可以利用这个请求对象在两个Servlet之间实现数据共享
  • 2)在请求对象实现Servlet之间数据共享&#xff0c;开发人员将请求对象称为《请求作用域对象》

6.2、命令实现


  • OneServlet通过请求对象申请调用TwoServlet时&#xff0c;需要给TwoServlet提供共享数据

OneServlet{public void doGet(HttpServlet request,HttpServletResponse response){//1、将数据添加到《请求作用域对象》中attribute属性request.setAttribute("key1",数据)//数据类型可以任意属性Object//2、向Tomcat申请调用TwoServletrequest.getRequestDispatcher("/two").forward(req,response);}
}

TwoServlet{public void doGet(HttpServlet request,HttpServletResponse response){//1、从当前请求对象得到OneServlet写入到共享数据Object 数据 &#61; request.getAt tribute("key1")//数据类型可以任意属性Object//2、向Tomcat申请调用TwoServletrequest.getRequestDispatcher("/two").forward(req,response);}
}

推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
author-avatar
蜗牛的家
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有