JavaWeb-03-Servlet-10-多个Servlet之间的数据共享
2021/8/18 1:06:13
本文主要是介绍JavaWeb-03-Servlet-10-多个Servlet之间的数据共享,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
JavaWeb-03-Servlet-10-多个Servlet之间的数据共享
1.多个Servlet之间的数据共享实现方案
数据共享:OneServlet工作完毕后,将产生的数据交给TwoServlet来使用。
在Servlet规范中提供四种数据共享方案:
- ServletContext接口
- Cookie类
- HttpSession接口
- HttpServletRequest接口
2.ServletContext接口
2.1ServletContext接口介绍
- 是来自于Servlet规范中的一个接口。
- 存在于Tomcat中的servlet-api.jar。
- 由Tomcat负责提供这个接口的实现类。
- 如果两个Servlet来自于同一个网站,那么彼此之间可以通过网站的ServletContext实例对象来实现数据共享。
- 开发人员习惯将其ServletContext对象称为【全局作用域对象】。
2.2原理
- 每一个网站中都存在一个全局作用域对象。
- 这个全局作用域对象相当于是一个【Map】,以键值对形式存储数据。
- 在这个网站中,OneServlet可以将一个数据存入到全局作用域对象。
- 在存入数据后,当前网站中的其他Servlet都可以从全局作用域对象获取这个数据。
2.3全局作用域对象的生命周期
- 创建:在服务器启动过程中,服务器会自动为当前网站创建一个全局作用域对象。
- 数量:在服务器运行期间,只有一个全局作用域对象【一个网站只有一个】
- 运行:在服务器运行期间,全局作用域对象一直处于存活状态。
- 销毁:在服务器准备关闭时,服务器会自动将当前网站中的全局作用域对象销毁。
注意:全局作用域对象的生命周期贯穿网站整个运行期间
2.4命令实现
在同一个网站中,将OneServlet中的数据共享给TwoServlet。
OneServlet:
public class OneServlet extends HttpServlet { @Overrite protected void doGet(HttpServletRequest request,HttpResponse response) throws IOException { //1.通过【请求对象】向Tomcat服务器索要【全局作用域对象】 ServletContext application = request.getServletContext();//全局作用域对象名默认都写作application //2.将数据添加到全局作用域对象中作为【共享数据】 application.setAttribute("key1",数据【任意类型】); } }
TwoServlet:
public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.通过【请求对象】向服务器索要当前网站中的【全局作用域】对象 ServletContext application = request.getServletContext(); //2.通过指定关键字从【全局作用域对象】中得到对应数据 Object 存储数据的变量 = application.getAttribute("关键字key"); } }
2.5演示
流程:
- 在web目录下创建一个html页面,命名为login.html。
- 通过表单将用户名和用户密码发送给服务器。
- 新建一个网站MyWeb,定义两个Servlet接口实现类:
- OneServlet
- TwoServlet
- OneServlet负责从请求协议包中获取用户名和用户密码,然后把数据共享给TwoServlet
2.5.1html页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> <style type="text/css"> * { font-size: 20px; } </style> </head> <body> <form action="/MyWeb/one"> <table> <tr> <td>用户名:</td> <td><input type="text" name="userName"></td> </tr> <tr> <td>密 码:</td> <td><input type="password" name="passWord"></td> </tr> <tr> <td><input type="submit" value="登录"></td> <td><input type="reset" value="重置"></td> </tr> </table> </form> </body> </html>
2.5.2OneServlet
package com.tsccg.controller; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @Author: TSCCG * @Date: 2021/08/17 16:29 */ public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.通过【请求对象】获取请求头中的【请求参数】 String userName = request.getParameter("userName"); String passWord = request.getParameter("passWord"); //2.通过【请求对象】向服务器索要【全局作用域对象】 ServletContext application = request.getServletContext(); //3.将【请求参数】添加到【全局作用域对象】中 application.setAttribute("key1",userName); application.setAttribute("key2",passWord); //4.处理完当前请求后,需要访问TwoServlet //4.1通过当前【请求对象】生成资源文件申请报告对象,将TwoServlet地址传进去 RequestDispatcher report = request.getRequestDispatcher("/two"); //4.2将报告对象发送给服务器 report.forward(request,response); } }
2.5.3TwoServlet
package com.tsccg.controller; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * @Author: TSCCG * @Date: 2021/08/17 16:52 */ public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.通过【请求对象】获取【全局作用域对象】 ServletContext application = request.getServletContext(); //2.通过指定关键字【key】获取【全局作用域对象】中的值 String userName = (String)application.getAttribute("key1"); String passWord = (String)application.getAttribute("key2"); //3.将获取到的数据打印在控制台 System.out.println("userName=" + userName); System.out.println("passWord=" + passWord); //4.通过响应对象向服务器索要输出流 PrintWriter out = response.getWriter(); //5.将一个字符串返回给浏览器作为结束标识 out.print("Hello"); } }
2.5.4开始演示
3.Cookie
3.1Cookie介绍
- Cookie来自于Servlet规范中的一个工具类,存放在Tomcat提供的servlet-api.jar包中。
- 如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,那么此时,可以借助Cookie对象进行数据共享。
- Cookie存放着当前用户的私人数据,在共享数据过程中来提高我们的服务质量。
- 在现实生活中,Cookie相当于用户在服务端得到了一张【会员卡】。
3.2Cookie原理
- 用户通过浏览器第一次向MyWeb网站发送请求,申请OneServlet。
- OneServlet在运行期间,创建一个Cookie,存储了当前用户的相关数据。
- 在OneServlet运行结束时,会将Cookie写入请求头中,发送给浏览器。
- 浏览器在接收到Cookie后,会将Cookie放进浏览器的缓存中。
- 一段时间后,当用户通过【同一浏览器】,向【MyWeb】网站再次发送请求,申请TwoServlet时,浏览器将无条件地将第一次【MyWeb】网站发送过来的Cookie从浏览器缓存中取出,写入到请求头中,发送给服务器。
- 此时TwoServlet运行时,就能通过请求头中Cookie的信息,读取到OneServlet提供的共享数据。
3.3命令实现
在同一个网站中,OneServlet与TwoServlet借助Cookie实现数据共享。
OneServlet
public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.创建Cookie对象,保存共享数据(当前用户数据) //Cookie对象相当于一个Map,以键值对方式存放数据 //键值对中的key和value都只能是String类型,且key不能为中文 //一个Cookie只能存放一个键值对 Cookie card1 = new Cookie("key1","abc"); Cookie card2 = new Cookie("key2","def"); //2.将Cookie对象写入响应头中,发送给浏览器 response.addCookie(card1); response.addCookie(card2); } }
浏览器/用户接收到响应包:
状态栏 | 200 |
---|---|
响应头 | Cookie:key1="abc";key2="def" |
空白行 | |
响应体 | 处理结果 |
浏览器再次向同一网站发送请求访问TwoServlet,发送的请求包:
请求行 | url:/MyWeb/two; method:get; |
---|---|
请求头 | 请求参数:***; Cookie: key1="abc";key2="def"; |
空白行 | |
请求体 |
TwoServlet:
public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.调用请求对象从请求头中获取浏览器返回的Cookie Cookie[] cookieArray = request.getCookies(); //2.循环遍历数据得到每一个Cookie的key和value for(Cookie card : cookieArray) { String key = card.getName();//读取key值--->"key1" String value = card.getValue();//读取value值--->"abc" } } }
3.4Cookie应用实例_订餐会员卡
3.4.1流程图
这篇关于JavaWeb-03-Servlet-10-多个Servlet之间的数据共享的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?