一.重定向

  1. 原理:用户发送一次请求,需要得到多个Servlet,在第一个Servlet工作完毕之后,将下一个的Servlet的地址写到响应头的location属性中,导致Tomcat将302状态码写入到状态行,浏览器读取状态行的信息,会自动访问下一个Servlet

  2. 实现命令:response.sendRedirect(“请求地址”)

  3. 特征:

    • 请求地址:即可以是当前网站内部的资源文件(/网站名/资源文件名)
    • 也可以是其他网站资源文件(“http://baidu.com”)
    • 请求方式:通过浏览器请求,所以是get方式
  4. 缺点:效率低,往返时间浪费较多,需要用户等待

二.请求转发

  1. 原理:用户第一次通过浏览器手动访问one_Servlet,其工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调Two_Servlet,Tocat接收到请求之后,自动调用下一个Servlet完成剩余任务

  2. 实现命令:

    • 请求对象代替浏览器向Tomcat发送请求:requestDispatcher report = request.getrequestDispatcher(“/资源文件名”)
    • 将报告对象发送给Tomcat
  3. 优点:

    1. 用户只需手动访问一次
    2. Servlet之间的调用发送在服务器端,节省时间,增加服务速度
  4. 请求方式: 多个Servlet之间都是共享浏览器第一次请求发送的协议包,因此:请求方式与浏览器发送的请求方式保持一致,可能是post,也可能是get

三.多个Servlet之间的数据共享实现方案

  1. 数据共享:第一个工作完毕之后,将产生的数据交给下一个来使用
  2. 共享的四种方案:

    • ServletContext接口
    • Cookie类
    • HttpSession接口
    • HttpServletRequest接口

四.ServletContext接口

  1. 介绍:

    • 来自于Servlet规范的一个接口
  2. 向Tomcat索要当前网站的全局作用域对象

ServletCotnext application = 请求对象.getServletContext();通过全局作用域对象将数据存入到公共仓库,作为共享数据

application.setAttribute(“共享数据名”,共享数据)通过全局作用域对象将公共仓库中共享数据读取出来

Object 共享数据 = application.getAttribute(“共享数据名”)

    • Http服务器(tomcat)在启动时,自动的为当前网站创建一个全局作用域对象
    • 一个网站只有一个全局作用域对象
    • 在Http服务器关闭时,由Http服务器负责销毁掉网站中全局作用域对象

** Interger monney = (Integer)application.getAttribute(x) ,(integer)是为了防止出现空指针异常,这个类型可以为null

五.Cookie接口

1. 介绍

来自于Servlet规范中一个工具类

如果两个Servlet都是为同一个用户/同一个浏览器提供服务。此时这个两个Servlet可以使用这个用户的Cookie进行数据共享。Cookie相当于用户在服务端拥有的【会员卡】

2. 工作原理

  1. 用户第一个访问OneServlet
  2. OneServlet负责创建一个Cookie对象。并写入共享数据
  3. OneServlet工作完毕后负责【将Cookie对象写入到响应头】
  4. 来交给浏览器进行管理
  5. 等到浏览器第二次向当前网站发送请求时,必须无条件的
  6. 将当前网站之前推送过来的cookie对象写入到请求协议包
  7. 中的请求头进行返回,本次为用户提供服务的Two Servlet
  8. 进行服务的同时就可以读取到这个cookie对象,从而读取
  9. 到由OneServlet写入到Cookie对象中共享数据

3. 使用

l 创建一个Cookie对象并写入共享数据

Cookie card = new Cookie(“共享数据名”,”共享数据”);

  1. 一个cookie对象只能存放一个键值对
  2. cookie对象存放共享数据只能是String

l 通过响应对象将Cookie对象写入到响应头

响应对象.addCookie(card);

l 读取请求头中Cookie对象

Cookie cookieArray[] = 请求对象.getCookies();

l 读取某个cookie共享数据

String 共享数据名 = cookie.getName();//读取cookie对象中【共享数据名】

  1. String 共享数据 = cookie.getValue();//读取cookie对象中【共享数据】

4.生命周期

l 由Servlet调用构造方法创建

l 默认情况下,Cookie对象存放在浏览器的内存中。意味着浏览器关闭时Cookie对象就会被销毁

l 特殊情况下,要求浏览器将接收的Cookie对象存放客户端计算机的硬盘同时指定Cookie对象在硬盘上存活时间。在未达到存活时间之前,关闭浏览器,关闭服务器,关闭计算机都不会导致Cookie对象销毁

l cookie.setMaxAge(存活时间);存活时间以秒为单位

  1. // OneServlet
  2. //1. 调用请求对象读取请求头参数信息
  3. userName = request.getParameter("userName",userName);
  4. //2. 创建Cookie
  5. Cookie card = new Cookie("userName",userName);
  6. //3.将Cookie写入到响应头中交给浏览器
  7. response.addCookie(card);
  8. //4.通知Tomcat服务器将[点餐界面]内容写入到响应体中交给浏览器(请求转发)
  9. request.getRequestDispatcher("/index2.html").for(request,response);

六.HttpSession

1.项目流程

  1. 浏览器建立index.HTML,里面写入商品信息
  2. 浏览器第一次请求,将选购商品加入购物车
  3. OneServlet将用户商品存入私人储物柜

    • 调用请求对象读取请求参数,得到用户的选购商品
    • 调用请求对象向TOmcat索要当前用户在服务端的私人储物柜
    • 将商品添加到储物柜
  4. 当浏览器再次发起请求时
  5. TwoServlet

    • 调用请求对象向Tomcat索要当前的储物柜
    • 获取储物柜的资源
    • 调用相应的对象将得到的商品的信息结合table标签写入到响应体,交给浏览器

*Http服务器如何区分不同(浏览器的)用户:

Tomcat在创建一个HttpServlet对象时主动为这个对象生成一个编号,将该编号保存到Cookie对象,推送到当前浏览器缓存,当用户第二次来访的时候,会根据请求头的JSESSION_ID确认用户是否拥有HttpSession以及哪一个HttpServlet是当前用户.