堆栈花园的Servlet学习备忘录——多个Servlet之间数据共享

多个Servlet之间数据共享

一、ServletContext接口

1. 介绍

(1)来自于Servlet规范中的一个接口,tomcat负责提供这个接口的实现类。
(2)如果两个Servlet来自同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享。
(3)习惯于将ServletContext称为全局作用域对象

2. 工作原理
  • 每个网站都存在一个全局作用域对象。
  • 这个全局作用域对象相当于一个Map集合。
  • 在这个网站中的Servlet可以将一个数据存放到全局作用域对象中。
  • 当前网站中的其他Servlet此时都可以从全局作用域对象得到这个Map,获取数据。
3. 全局作用域对象的生命周期

(1)在http服务器启动的过程中,自动为当前网站在内存里创建一个全局作用域对象。
(2)在http服务器运行期间中,一个网站只有一个全局作用域对象。
(3)在http服务器运行期间,全局作用域对象一直是存在的。
(4)在http服务器关闭的时候,http服务器会将当前网站中的全局作用域对象进行销毁。

4. 实现代码

一号Servlet:

MyServlet1 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//通过请求对象向tomcat索取全局作用域对象。
		ServletContext application = request.getServletContext();
		//将数据添加到全局作用域对象里作为共享数据。
		application.setAttribute("key1","我是数据1");
	}
}

二号Servlet:

MyServlet2 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//通过请求对象向tomcat索取全局作用域对象。
		ServletContext application = request.getServletContext();
		//从全局作用域对象中得到指定关键字的数据。
		//从getAttribute中拿到的都是Object,需要根据情况向下转型。
		String data = (String)application.getAttribute("key1");
	}
}

二、Cookie

1. 介绍

(1)Cookie来自于Servlet规范中的一个工具类。
(2)如果两个Servlet来自于同一个网站,并且同一个用户,此时可以用Cookie对象进行数据共享。
(3)Cookie存放当前用户的私人数据,以此提高服务质量。

2. 工作原理
  • 用户通过浏览器第一次向网站发送请求,让MyServlet1开始工作。
  • MyServlet1在运行期间创建了一个Cookie,存放与当前用户相关的数据,MyServlet1工作完毕后,将Cookie写入响应头,交给当前浏览器。
  • 浏览器在收到响应包后,将Cookie存到浏览器的缓存里。
  • 一段时间后,如果用户用同一个浏览器再次向同一个网站发送请求,浏览器会将缓存里的Cookie写入到请求头中,并发送请求,让MyServlet2开始工作。
  • 此时MyServlet2在运行时,就可以通过请求头中的Cookie里的数据,得到MyServlet1提供的共享数据。
3. 实现代码

一号Servlet:

MyServlet1 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//创建一个Cookie对象,保存共享数据。
		//Cookie相当于一个Map。
		//一个Cookie只能存放一个键值对。
		//这个键值对的key和value只能是Srting。
		//键值对中的key不能是中文。
		Cookie cookie = new Cookie("uuid","xxxxxxxx");
		response.addCookie(cookie);
	}
}

二号Servlet:

MyServlet2 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//调用请求对象从请求头里取得浏览器返回的Cookie
		Cookie[] cookieArrary = request.getCookies();
		for(Cookie cookie :cookieArrary){
			//读取key:"uuid"
			Srting key = cookie.getName();
			//读取value:"xxxxxxxx"
			String value = cookie.getValue();
		}
}
4. 生命周期

(1)在默认情况下,Cookie对象存放在浏览器的缓存中,所以只要浏览器被关闭,Cookie对象就被回收了。
(2)通过手动设置,可以要求浏览器将Cookie存储在计算机的硬盘里,同时需要指定Cookie的存放时间,在存放时间内,关闭浏览器,关闭计算机,关闭服务器,都不会导致Cookie被删除,直到存放时间到达。

  • 代码:
cookie.setMaxAge(1);//cookie在硬盘上的存放时间是一秒。

三、HttpSession接口

1. 介绍

(1)HttpSession接口来自于Servlet规范下的一个接口,由http服务器提供其实现类。
(2)如果两个Servlet来自于同一个网站,并且同一个用户,此时可以用HttpSession对象进行数据共享。
(3)习惯于将HttpSession接口的对象称为会话作用域对象

2. HttpSession与Cookie的区别

(1)存储位置
Cookie存放在客户的计算机里。(内存/硬盘)
HttpSession存放在服务器端的内存里。
(2)数据类型
Cookie对象存储的数据只能是String。
HttpSession对象可以存储任意类型的数据。
(3)数据数量
Cookie一次只能存储一个数据。
HttpSession使用Map集合存储数据,可以存储任意数量的数据。

3. 实现代码

一号Servlet:

MyServlet1 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//调用请求对象向tomcat索要session。
		HttpSession session = request.getSession();
		//将数据添加到用户session里。
		session.setAttribute("password","xxxxxxxx");
	}
}

二号Servlet:

MyServlet2 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//调用请求对象向tomcat索要session。
		HttpSession session = request.getSession();
		//从Session中得到数据。
		String password = (Srting)session.getAttribute("password");
		//如果Session中有多组数据,需要遍历取出。
		Enumeration keys = session.getAttributeNames();
		while(keys.hasMoreElements()){
			String key = (String)keys.nextElement();
			String value = (String)session.getAttribute(key);
		}
	}
}
4. http服务器如何将用户和HttpSession联系起来?

tomcat在创建一个HttpSession时,自动为这个HttpSession对象生成一个JSESSIONID,tomcat将JSESSIONID保存到cookie对象里,推给当前浏览器的缓存里,等到用户第二次发送请求的时候,tomcat根据请求头里的JSESSIONID确认哪个HttpSession对象是当前用户的。

5. getSession() 与 getSession(false)的区别

(1)getSession()
如果当前用户服务器端已经有了HttpSession对象,就要求tomcat将这个HttpSession对象返回。
如果当前用户在服务器端没有HttpSession对象,就要求tomcat为当前用户创建一个HttpSession对象。
(2)getSession(false)
如果当前用户服务器端已经有了HttpSession对象,就要求tomcat将这个HttpSession对象返回。
如果当前用户在服务器端没有HttpSession对象,tomcat就返回个null。

6. 生命周期

(1)用户与HttpSession关联时使用的Cookie只能存放在浏览器换成里,当浏览器关闭后,用户和他对应的HttpSession无法被关联。
(2)但是tomcat无法检测浏览器是否被关闭,所以tomcat在浏览器关闭后,不会将失去关联的HttpSession回收。
(3)为了解决这个问题,tomcat会为每个HttpSession对象设置一个空闲时间,这个空闲时间默认为30分钟,如果时间到了,这个HttpSession会被回收。

HttpSession空闲时间手动设置
在当前网站的web.xml里
< session-config >
< !–最大空闲时间设置为1分钟-- >
< session-timeout >1< /session-timeout >
< /session-config >

四、HttpServletRequest接口

1. 介绍

(1)在同一个网站中,如果两个Servlet之间通过请求转发方式进行调用,彼此之间共享一个请求协议包。而请求协议包只对应一个请求对象,所以此时这两个Servlet也共享同一个请求对象,就可以利用这个请求对象在两个Servlet之间实现数据共享。
(2)在请求对象实现Servlet之间的数据共享时,将请求对象称作请求作用域对象

2. 实现代码

一号Servlet:

MyServlet1 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//将数据添加到请求左右对象中attribute属性里。
		//数据类型可以是任何类型的Object。
		request.setAttribute("uuid","xxxxxxxx");
		//向tomcat申请调用MyServlet2
		req.getRequestDispationcher("/two").forward(request,response);
	}
}

二号Servlet:

MyServlet2 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response){
		//从当前请求对象中获得数据。
		String uuid = (String)req.getAttribute("uuid");
	}
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值