1. 请求转发(forward):一种在服务器内部的资源跳转方式1628851404283.png

(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A处理完请求后将请求发给资源B
(3)资源B处理完后将结果响应给浏览器
(4)请求从资源A到资源B的过程就叫==请求转发==

2. 请求转发的实现方式:

req.getRequestDispatcher(“资源B路径”).forward(req,resp);
具体如何来使用,我们先来看下需求:1628854783523.png
针对上述需求,具体的实现步骤为:
1.创建一个RequestDemo5类,接收/req5的请求,在doGet方法中打印demo5
2.创建一个RequestDemo6类,接收/req6的请求,在doGet方法中打印demo6
3.在RequestDemo5的方法中使用
req.getRequestDispatcher(“/req6”).forward(req,resp)进行请求转发
4.启动测试
(1)创建RequestDemo5类image.png
(2)创建RequestDemo6类image.png
(3)在RequestDemo5的doGet方法中进行请求转发image.png
(4)启动测试
访问http://localhost:8080/request-demo/req5,就可以在控制台看到如下内容:![1628855192876.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1657184174019-0a880f2c-6e4d-44af-9a54-50e9ac3c80cc.png#clientId=u241d5cdc-32a2-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=58&id=ub0c3bc5c&margin=%5Bobject%20Object%5D&name=1628855192876.png&originHeight=72&originWidth=1245&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11049&status=done&style=none&taskId=uef77001f-0c9e-40c2-956e-799ab68ec01&title=&width=996)
说明请求已经转发到了/req6

3. 请求转发资源间共享数据:使用Request对象

此处主要解决的问题是把请求从/req5转发到/req6的时候,如何传递数据给/req6。
需要使用request对象提供的三个方法:

  • 存储数据到request域[范围,数据是存储在request对象]中

void setAttribute(String name,Object o);

  • 根据key获取值

Object getAttribute(String name);

  • 根据key删除该键值对

void removeAttribute(String name);
接着上个需求来:1628856995417.png
1.在RequestDemo5的doGet方法中转发请求之前,将数据存入request域对象中
2.在RequestDemo6的doGet方法从request域对象中获取数据,并将数据打印到控制台
此时就可以实现在转发多个资源之间共享数据。
3.示例访问测试
(1)修改RequestDemo5中的方法image.png
(2)修改RequestDemo6中的方法image.png
(3)启动测试: 访问http://localhost:8080/request-demo/req5,就可以在 控制台看到如下内容:1628857213364.png
此时就可以实现在转发多个资源之间共享数据。

4. 请求转发的特点

  • 浏览器地址栏路径不发生变化
    • 虽然后台从/zhuanfa1转发到/zhuanfa2,但是浏览器的地址一直是/zhuanfa1,未发生变化1628857365153.png
  • 只能转发到当前服务器的内部资源不能从一个服务器通过转发访问另一台服务器
  • 一次请求,可以在转发资源间使用request共享数据虽然后台从/req5转发到/req6,但是这个==只有一次请求==