为什么需要Servlet请求转发
原因:
-
Web 应用在处理客户端的请求时,经常需要多个 Web 资源共同协作才能生成响应结果。
-
Serlvet 对象无法直接调用其他 Servlet 的 service() 方法
解决办法:
-
请求转发
-
请求包含(了解即可)
请求转发
什么是请求转发?
-
容器接收请求后,Servlet 会先对请求做一些预处理,然后将请求传递给其他 Web 资源,来完成包括生成响应在内的后续工作
-
属于服务器行为
RequestDispatcher 接口
特点:
-
RequestDispatcher 对象由 Servlet 容器创建
作用:
-
装由路径所标识的 Web 资源
-
把请求转发给其他的 Web 资源
请求转发的工作原理:
由工作原理图可知请求转发的关键点:
-
获取RequestDispatcher对象
-
调用RequestDispatcher对象当中的方法
Servlet获取RequestDispatcher对象的方式
-
getRequestDispatcher(String path) 方法,参数 path 指定目标资源的路径,必须为绝对路径;--->绝对路径是指以符号“/”开头的路径,“/”表示当前 Web 应用的根目录。相对路径是指相对当前 Web 资源的路径,不以符号“/”开头。
-
getRequestDispatcher(String path) 方法,参数 path 指定目标资源的路径,可以为绝对路径,也可以为相对路径。
RequestDispatcher接口提供的方法:
返回值类型 | 方法 | 功能描述 |
---|---|---|
void | forward(ServletRequest request,ServletResponse response) | 用于将请求转发给另一个 Web 资源。该方法必须在响应提交给客户端之前被调用,否则将抛出 IllegalStateException 异常 |
void | include(ServletRequest request,ServletResponse response) | 用于将其他的资源作为当前响应内容包含进来 |
request域对象
什么是request域对象?
request 是 Servlet 的三大域对象之一,它需要与请求转发配合使用,才可以实现动态资源间的数据传递
Context域对象和Request域对象的区别:
-
从单词就可以看出Request域对象是Context域对象的子集。
具体的不同点:
-
生命周期不同
-
作用域不同
-
Web应用中数量不同
-
实现数据共享的方式不同
-
Context 域对象可以独立完成动态资源之间的数据共享;
-
Request 域对象需要与请求转发配合使用才能实现动态资源之间的数据共享。
-
示例代码:
需求:
-
创建一个Serlvet类,在该类内部转发请求给第二个Serlet类
-
创建一个表单,模拟登录
第一个Servlet类:
package com.example.HttpServletRequestDemo;
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;
import java.io.PrintWriter;
/**
* 这是直接与表单交互的Servlet动态资源类,表单的数据直接提交到该类当中
* @since JDK 1.8
* @date 2021/09/17
* @author Lucifer
*/
接收转发请求的Servlet类:
package com.example.HttpServletRequestDemo;
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;
import java.io.PrintWriter;
import java.util.Arrays;
/**
* 接收上一个Servlet类转发的请求的接受类
* @since JDK 1.8
* @date 2021/09/17
* @author Lucifer
*/