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

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 中的JSESSIONID

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

6.具体实现

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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值