【黑马程序员新版JavaWeb基础教程,Java web从入门到企业实战完整版】
【请求转发】
请求转发(forward):一种在服务器内部的资源跳转方式。

过程:
【请求转发的实现方式】
req.getRequestDispatcher("资源B路径").forward(req,resp);
【举个栗子】

实现步骤:
创建RequestDemo5 类
package com.dingjiaxing.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* ClassName: RequestDemo5
* date: 2022/9/12 11:30
*
* @author DingJiaxiong
*/
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo5...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
创建RequestDemo6 类
package com.dingjiaxing.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* ClassName: RequestDemo6
* date: 2022/9/12 11:30
*
* @author DingJiaxiong
*/
@WebServlet("/req6")
public class RequestDemo6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo6...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}


只访问了req5,但是demo6也打印了,说明请求已经转发到了/req6
【请求转发资源之间共享数据:使用Request 对象】
解决问题:把请求从/req5转发到/req6的时候,如何传递数据给/req6。
需要使用request对象提供的三个方法:
存储数据到request域范围,数据是存储在request对象中
void setAttribute(String name,Object o);
根据key获取值
Object getAttribute(String name);
根据key删除该键值对
void removeAttribute(String name);
[看个需求]

[修改RequestDemo5和6中的方法]

启动服务测试

这样就实现了在转发多个资源之间共享数据。
【请求转发的特点】
浏览器地址栏路径不发生变化
虽然后台从/req5转发到/req6 ,但是浏览器的地址一直是/req5 ,未发生变化

只能转发到当前服务器的内部资源
不能从一个服务器通过转发访问另一台服务器
一次请求,可以在转发资源间使用request共享数据
虽然后台从/req5转发到/req6,但是这个只有一次请求