Servlet学习笔记

Stella981
• 阅读 713

目 录

  • 数据共享
  • 关于ServletContext接口
  • 关于Cookie类
  • 关于HttpSession接口
  • 关于HttpServletRequest接口

数据共享

  1. 什么是数据共享?
    比如:OneServlet工作完毕后,将产生的数据交给TwoServlet使用

  2. Servlet规范中提供四种数据共享方案
    ServletContext接口
    Cookie类
    HttpSession接口
    HttpServletRequest接口

关于ServletContext接口

  1. 介绍
    来自于Servlet规范中的一个接口,在Tomcat中存在于servlet-api.jar
    如果两个Servlet来自于同一个网站,彼此之间通过网站中的ServletContext实例对象实现数据共享。
    开发人员习惯将ServletContext称为:全局作用域对象

  2. 工作原理:
    每一个网站都存在一个全局作用域对象,这个全局作用域对象相当于一个Map集合,在这个网站中的OneServlet可以将一个数据存入到全局作用域对象中,当前网站中的其他Servlet此时都可以从全局作用域对象中得到这个数据。
    Servlet学习笔记

  3. 全局作用域对象的生命周期:
    在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象。
    在Http服务器运行期间,一个网站中只能有一个全局作用域对象
    在Http服务器运行期间,全局作用域对象一直处于存活状态。
    在Http服务器准备关闭时,负责将当前网站中的全局作用域对象进行销毁。
    全局作用域对象生命周期伴随着当前网站整个运行期间

  4. 命令实现:

同一个网站中,OneServlet将数据共享给TwoServlet
//1.通过请求对象向Tomcat索要当前网站全局作用域对象
ServletContext application = request.getServletContext();
注意:在开发过程中,全局作用域对象的变量名,规范为:application
//2.将数据添加到全局作用域对象中作为共享数据
application.setAttribute(“key1”,“数据”);

//OneServlet
//1.通过请求对象向Tomcat索要当前网站全局作用域对象
ServletContext application=request.getServletContext();
//2.将数据添加到全局作用域对象中作为【共享数据】
application.setAttribute("key1",100);

同一个网站中,TwoServlet拿该数据
//1.通过请求对象向Tomcat索要当前网站全局作用域对象
ServletContext application = request.getServletContext();
//2.从全局作用域对象中得到指定关键字对应数据
Object 数据=application.getAttribute(“key1”);

//TwoServlet
//1.通过请求对象向Tomcat索要当前网站全局作用域对象
ServletContext application=request.getServletContext();
//2.从全局作用域对象中得到指定关键字对应的值
Integer money=(Integer)application.getAttribute("key1");

关于Cookie类

  1. 介绍:
    Cookie来自于Servlet规范中的一个工具类,存在于Tomcat提供的servlet-api.jar
    如果俩个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时可以借助于Cookie对象进行数据共享。
    Cookie存放当前用户的私人数据,在共享过程中提高服务质量。(类似于会员卡)

  2. 工作原理:
    用户通过浏览器第一次向myWeb网站发送请求申请OneServlet,OneServlet在运行期间创建一个Cookie储存当前用户相关数据,OneServlet工作完毕后,将Cookie写入到响应头交还给浏览器。
    浏览器收到响应包后,将Cookie储存在浏览器的缓存中,一段时间后,用户通过同一个浏览器再次向myWeb网站发送请求申请TwoServlet时,浏览器需要无条件的将myWeb网站之前推送过来的cookie写入到请求头中发送过去。
    此时TwoServlet在运行时,就可以通过读取请求头中的Cookie信息,得到OneServlet提供的共享数据。
    Servlet学习笔记

  3. 实现命令:

同一个网站OneServlet与TwoServlet借助Cookie实现数据共享
//cookie也相当于一个Map
//一个cookie只能存放一个键值对
//key和value都是String类型,key不能为中文

//1.创建一个Cookie对象,保存共享数据(当前用户)
Cookie card1 = new Cookie(“key1”,“qwe”);
Cookie card2 = new Cookie(“key2”,“asd”);
//2.将Cookie写入到响应头,交给浏览器
responce.addCookie(card1);
responce.addCookie(card2);

浏览器向myWeb网站发送请求,访问TwoServlet
//1.调用请求对象,从请求头中得到浏览器返回的Cookie
Cookie cookieArray[] = request.getCookies();
//2.循环遍历数据的得到每一个Cookie的key与value
for(Cookie card:cookieArrays){
 String key = card.getName();//获得key
 String value = card.getValue();//获得value
}

  1. Cookie生命周期
    默认情况下,Cookie是放在浏览器的缓存中,只要浏览器关闭,Cookie对象就被销毁掉。
    在手动配置情况下,可以要求浏览器将接收的Cookie存在当前客户端计算机的硬盘上,同属需要指定Cookie在硬盘上的存活时间。在存活时间到达时,Cookie自动从硬盘上被删除。
    cookie.setMaxAge(60);//cookie在硬盘上存活1分钟

关于HttpSession接口

  1. 介绍
    HttpSession接口来自于Servlet规范下的接口,存在于Tomcat中servlet-api.jar
    如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时可以借助于HttpSession对象进行数据共享。
    开发人员习惯于将HttpSession接口称为会话作用域对象。

  2. HttpSession与Cookie的区别(重要)
    储存位置:Cookie在客户端计算机中;HttpSession在服务端计算机中
    数据类型:Cookie只能存String类型;HttpSession可以存放任意类型(Object类型)
    数据的数量:一个Cookie只能存放一个共享数据;HttpSession使用Map集合储存共享数据,任意数量

  3. 实现命令

同一个网站下OneServlet将数据传递给TwoServlet
//1.调用请求对象向Tomcat索要当前用户在服务端的HttpSession
HttpSession session = request.getSession();
//2.将数据添加到用户的Session
session.setAttribute(“key1”,共享数据);

浏览器访问同一个网站下的TwoServlet
//1.调用请求对象向Tomcat索要当前用户在服务端的HttpSession
HttpSession session = request.getSession();
//2.从回话作用域对象中得到OneServlet提供的共享数据
Object 共享数据 = session.getAttribute(“key1”);

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="2" align="center">
    <tr>
        <td>商品名称</td>
        <td>商品单价</td>
        <td>供货商</td>
        <td>放入购物车</td>
    </tr>
    <tr>
        <td>商品1</td>
        <td>7000元</td>
        <td>中国</td>
        <td><a href="/myWeb9/one?goodsName=good1">加入购物车</a></td>
    </tr>
    <tr>
        <td>商品2</td>
        <td>5000元</td>
        <td>泰国</td>
        <td><a href="/myWeb9/one?goodsName=good2">加入购物车</a></td>
    </tr>
    <tr>
        <td>商品3</td>
        <td>1000元</td>
        <td>日本</td>
        <td><a href="/myWeb9/one?goodsName=good3">加入购物车</a></td>
    </tr>
    <tr align="center">
        <td colspan="4">
            <a href="/myWeb9/two">查看购物车</a>
        </td>
    </tr>
</table>
</body>
</html>


//OneServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String goodsName;
    //1.调用请求对象,读取请求头参数,得到商品名称
    goodsName=request.getParameter("goodsName");
    //2.调用请求对象,向Tomcat索要当前用户在服务端的“储物柜”
    HttpSession session=request.getSession();
    //3.将用户选购商品添加到用户“储物柜”中
    Integer goodsNum=(Integer)session.getAttribute(goodsName);
    if(goodsNum==null){
        session.setAttribute(goodsName,1);
    }else{
        session.setAttribute(goodsName,goodsNum+1);
    }
}


//TwoServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //1.调用请求对象,向Tomcat索要当前用户在服务端的“私人储物柜”
    HttpSession session=request.getSession();
    //2.将session中所有的key读取出来,存放在一个枚举对象中
    Enumeration goodsNames=session.getAttributeNames();
    while (goodsNames.hasMoreElements()){
        String goodsName=(String) goodsNames.nextElement();
        int goodsNum=(int)session.getAttribute(goodsName);
        System.out.println("商品名称"+goodsName+",商品数量"+goodsNum);
    }
}
  1. Http服务器如何将用户与与HttpSession关联起来
    通过服务器端获取到用户请求信息后,会创建一个Cookie对象,储存当前用户的JSESSIONID,通过响应协议包转发给用户。用户再次访问服务器的时候,会携带这个Cookie,服务器收到该用户Cookie中的JSESSIONID后会自动识别。
    Servlet学习笔记

  2. getSessoin()和getSession(false)的区别
    getSession():如果当前用户在服务端没有自己的“储物柜”,则服务器新建一个该用户的“储物柜”。
    gesSession(false):果当前用户在服务端没有自己的“储物柜”,则服务器返回Null

  3. HttpSession生命周期
    a.用户与HttpSession关联时,使用的Cookie只能存放在浏览器缓存中。
    b.在浏览器关闭后,意味着用户与他的HttpSession关系被切断。
    c.由于Tomcat无法检测浏览器何时被关闭,因此在浏览器关闭时,并不会导致Tomcat将浏览器关联的HttpSession进行销毁。
    d.为了解决这个问题,Tomcat为每一个HttpSession对象设置“空闲时间”,这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat会销毁该HttpSession。

  4. 手动设置空闲时间
    当前网站/web/WEB-INF/web.xml

    5

关于HttpServletRequest接口

  1. 介绍
    在同一个网站中,如果两个Servlet之间通过请求转发方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象,因此Servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个Servlet之间实现数据共享。
    再去请求对象实现Servlet之间数据共享功能时,开发人员习惯将请求对象成为请求作用域对象。

  2. 实现命令:

OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据

//OneServlet
//1.将数据添加到【请求作用域对象】中的Attribute属性
request.setAttribute(“key1”,数据); //数据类型是Object类型
//2.向Tomcat申请调用TwoServlet
request.getRequestDispatcher("/two").forward(requset,responce);

//TwoServlet
//1.从当前请求对象中得到OneServlet所写入的共享数据
Object 数据 = requset.getAttribute(“key1”);

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这