1.数据共享:
OneServlet工作完毕后,将【产生的数据】交给TwoServlet来使用
2.Servlet规范中提供四种数据共享方案:
1) ServletContext接口
2)Cookie类
3)HttpSession接口
4)HttpServletRequest接口
3.四种方案的详解
3.1ServletContext接口
1.介绍:
1)来自于servlet规范中一个接口。在Tomcat中存在servlet-api.jar;在Tomcat中负责提供这个接口实现类
2)如果两个servlet来自于同一个网站。彼此之间通过网站的servletContext实例对象实现数据共享
3)开发人员习惯于将servletContext对象称为【全局作用域对象】2.工作原理:
每一个网站都存在一个全局作用域对象。这个全局作用域对象[相当于]一个Map.在这个网站中oneServlet可以将一个数据存入到全局作用域对象,当前网站中其他Servlet此时都可以从全局作用域对象得到这个数据进行使用3.具体实现
oneServlet:
//1.在请求对象中获取ServletContext接口实现类【全局作用域对象】
ServletContext application = request.getServletContext();
//2.向全局作用域对象里添加数据
application.setAttribute("key1",2000);
TwoServlet:
//1.在请求对象中获取ServletContext接口实现类【全局作用域对象】
ServletContext application = request.getServletContext();
//2.向全局作用域对象里获取数据
Object value = application.getAttribute("key1");
System.out.println("value: "+value);
4.全局作用域对象生命周期:
1)在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
2)在Http服务器运行期间时,一个网站只有一个全局作用域对象
3)在Http服务器运行期间,全局作用域对象一直处于存活状态
4)在Http服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁处理
*****全局作用域对象生命周期贯穿网站整个运行期间***
3.2Cookie类
1.介绍:
1) Cookie来自于servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中.
2)如果【两个servlet来自于同一个网站,并且为同一个浏览器/用户】提供服务,此时借助于Cookie对象进行数据共享
3)cookie存放当前用户的私人数据,在共享数据过程中提高服务质量
4)在现实生活场景中,cookie相当于用户在服务端得到【会员卡】2.原理:
用户通过浏览器第一次向【Myweb】网站发送请求申请oneServlet。OneServlet在运行期间创建一个Cookie存储与当前用户相关数据OneServlet工作完毕后,将cookie写入到响应头交还给当前浏览器。浏览器收到响应响应包之后,将cookie存储在【浏览器的缓存】一段时间之后,用户通【同一个浏览器】再次向【myweb网站】发送请求申请TwoServlet时。【浏览器需要无条件的将myWeb网站之前推送过来的Cookie,写入到请求头】发送过去此时TwoServlet在运行时,就可以通过读取请求头中cookie中信息,得到OneServlet提供的共享数据3.具体实现
OneServlet:
//1.新建cookie
Cookie cookie0=new Cookie("userName",userName);
Cookie cookie1=new Cookie("money",money+"");
//2.将cookie写到【响应头】中
response.setContentType("text/html;charset=utf-8");
response.addCookie(cookie0);
response.addCookie(cookie1);
TwoServlet:
//1.获取cookie内的用户名、金额
Cookie[] cookies = request.getCookies();
4.Cookie销毁时机:
1.在默认情况下,Cookie对象存放在【浏览器的缓存】中。因此只要浏览器关闭,Cookie对象就被销毁掉
2.在手动设置情况下,可以要求浏览器将接收的Cookie存放在【客户端计算机上硬盘】上,同时需要指定Cookie在硬盘上存活时间。在存活时间范围内,关闭浏览器,关闭客户端计算机,关闭服务器,都不会导致Cookie被销毁。在存活时间到达时,Cookie自动从硬盘上被删除。
//3.将cookie1写入到内存中,并且设置生命周期为1分钟
cookie1.setMaxAge(60);
3.3HttpSession接口
1.介绍:
1) HttpSession接口来自于Servlet规范下一个接口。存在于Tomcat中servlet-api.jar。其实现类由Http服务器(Tomcat)提供实现类存在于servlet-api.jar
2)如果【两个servlet来自于同一个网站,并且为同一个浏览器/用户】提供服务,此时借助于HttpSession对象进行数据共享
3)开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】2.httpsession和cookie的区别
1)存储位置:
Cookie:存放在客户端计算机(浏览器内存/硬盘)
HttpSession:存放在服务端计算机内存
2)数据类型:
Cookie对象存储共享数据类型只能是string
HttpSession对象可以存储任意类型的共享数据object
3)数据数量:
一个Cookie对象只能存储一个共享数据
HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据4.Http服务器如何将用户与HttpSession关联起来
利用 cookie 中的JSESSIONID5. getSession()与getSession (false)的区别
1) getSession():
如果当前用户在服务端已经拥有了自己的私人储物柜,要求tomcat将这个私人储物柜进行返回;
如果当前用户在服务端尚未拥有自己的私人储物柜,要求tomcat为当前用户创建一个全新的私人储物柜
2)getSession (false) :
如果当前用户在服务端已经拥有了自已的私人储物柜,要求tomcat将这个私人储物柜进行返回;
如果当前用户在服务端尚未拥有自己的私人储物柜,此时Tomcat将返回nu116.具体实现
Servlet1:(模拟加入购物车)
//1.从请求对象中获取商品名称
String goodsName=request.getParameter("goodsName");
//2.新建会话对象
HttpSession session = request.getSession();
//3.
Integer goodsNum= (Integer) session.getAttribute(goodsName);
if(goodsNum==null){
session.setAttribute(goodsName,1);
}else {
session.setAttribute(goodsName,goodsNum+1);
}
Servlet2:(模拟查看购物车)
//1.从当前请求对象中获取会话对象
HttpSession session = request.getSession();
//2.遍历会话对象的key,获得的是一个枚举对象
Enumeration<String> attributeNames = session.getAttributeNames();
//
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
while (attributeNames.hasMoreElements()){
String goodsName = attributeNames.nextElement();
int goodsNum = (int)session.getAttribute(goodsName);
out.println("商品名称: "+goodsName+", 商品数量: "+goodsNum+"</br>");
}
7. HttpSession销毁时机:
1.用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中.
2.在浏览器关闭时,意味着用户与他的HttpSession关系被切断
3.由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁
4.为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】,这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟。此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession
5.在实际开发中,开发人员可以利用在项目-->WEB-INF-->web.xml中,添加
<session-config>
<session-timeout>5</session-timeout><!-- 设置session的空闲时间为5分钟-->
</session-config>
来手动设置session的空闲时间。
3.4HttpServletRequest接口
1.介绍:
1)在同一个网站中, 如果两个servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象。因此servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个Servlet之间实现数据共享。2)在请求对象实现servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
2.具体实现
Servlet1:
//1.向请求作用域对象中写入共享数据
request.setAttribute("key1","中国,你好");
//2.请求转发
request.getRequestDispatcher("/two").forward(request,response);
Servlet2:
//1.
String value = (String) request.getAttribute("key1");
//2.
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("来自servlet1的共享数据: "+value);