JavaWeb —— RequestDispatcher 接口与转发、重定向

本文深入解析Servlet中RequestDispatcher接口的forward()方法用于请求转发,及ServletResponse接口sendRedirect()方法实现请求重定向的机制。阐述两者在路径解析、请求对象处理及应用场景上的关键区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【概述】

RequestDispatcher 对象是由 Servlet 引擎创建的,用于封装一个要被其他资源调用的资源,如:Servlet、HTML、JSP 等,并可通过其中的方法将客户端的请求转发给所包装的资源。

该接口的方法常用于请求的转发,而 ServletResponse 接口中的 sendReadirect() 方法常用于请求的重定向。

【获取接口对象】

通过 ServletContext 对象:

  • RequestDispatcher getRequestDispatcher(String path):根据以 " / " 开头的路径获取 RequestDispatcher 对象
  • String getRequestDispatcher(String path):根据以 " / " 开头的路径获取 RequestDispatcher 对象名

通过 ServletRequest 对象:

  • RequestDispatcher getRequestDispatcher(String path):根据路径来获取 RequestDispatcher 对象(可不需要 " / ")

【接口方法】

RequestDispatcher 接口中定义了两个方法,用于请求转发:

  • void forward(ServletRequest req,ServletResponse res):将请求转发给服务器上另外一个 Servlet、HTML、JSP    
  • void include(ServletRequest req,ServletResponse res):用于在响应中包含其他资源的内容,即请求转发后,原来的 Servlet 还可继续输出响应信息,转发到的 Servlet 对请求做出的响应将并入原先 Servlet 的响应对象中

上述两个方法接收的两个参数一般是传递给当前 Servlet 的 service() 方法的 ServletRequest、ServletResponse 对象,但也可为对它们进行了包装的 ServletRequestWrapper 或 ServletResponseWrapper 对象

两方法的区别:forward() 方法调用后在响应中的没有提交的内容被自动消除,include() 方法使原先的 Servlet 和转发到的 Servlet 都可以输出响应信息。   

【请求转发与重定向】

RequestDispatcher 接口中的 forward() 方法常用于请求的转发,而 ServletResponse 接口中的 sendReadirect() 方法常用于请求的重定向。

在进行开发时,当需要用到转发、重定向时,建议使用绝对路径而不要使用相对路径,即当 " /" 代表站点的根目录时, 在其前面加上 contextPath 即可,而 contextPath 可有 request 或 application 的 getContextPath() 方法获取。

二个方法都是用于转发给另外的资源为客户端服务,但二者有着本质的区别。

1.不同

1)forward() 转发:

  • 转发的地址栏是初次发出请求的地址
  • 转发只能在当前 WEB 应用内部转发
  • 在最终的 Servlet 中,request 对象和中转的 request 是同一对象,原有 request 对象属性不变
  • 转发过程中,在方法中使用的 " / " 代表当前 WEB 应用的根目录 

2)sendReadirect() 重定向:

  • 重定向的地址栏不是初次发出的请求地址,而是最后响应的地址
  • 重定向可以跨 WEB 应用、服务器重新定位资源
  • 在最终的 Servlet 中,request 对象和中转的 request 不是同一对象,原有 request 对象属性全部失效,开始新的 request 对象
  • 重定向过程中,在方法中使用的 " / " 代表当前 WEB 站点的根目录 

注:关于 WEB 应用与 WEB 站点的根目录

以 http://localhost:8080/test/ 为例,test/ 为应用的根目录,http://localhost:8080/ 为站点的根目录

2.原理

1)forward() 方法

  • 客户端发送请求,Servlet1 做出处理
  • Servlet1 调用 forward() 方法,将请求转发给 Servlet2 来处理请求,为客户端服务
  • Servlet2 对客户端浏览器做出响应

2)sendReadirect() 方法   

  • 客户端发送请求,Servlet1 做出处理
  • Servlet1 调用 sendReadirect() 方法,将客户端的请求重新定位到 Servlet2
  • 客户端浏览器访问 Servlet2
  • Servlet2 对客户端浏览器做出响应

3.实例

 

//请求转发
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
    String path="testServlet";//要转发的地址
    RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path);//获取requestDispatcher对象并填入地址
    requestDispatcher.forward(request, response);//请求转发
}

//请求重定向
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
    String path="testServlet";
    response.sendRedirect(path);
}

 

### Java Web 中的请求响应工作原理 Java Web 的核心在于客户端(通常是浏览器)向服务器发送 HTTP 请求,而服务器接收并处理该请求后返回相应的 HTTP 响应。这一过程主要依赖于 `HttpServletRequest` 和 `HttpServletResponse` 接口来实现。 #### 1. HttpServletRequest的作用 `HttpServletRequest` 是用于封装 HTTP 请求的对象,它包含了来自客户端的所有信息,例如请求参数、头部信息、会话数据等。以下是其常见功能: - 获取请求方法:通过 `getMethod()` 方法可以获取客户端使用的 HTTP 方法(GET/POST 等)。 - 获取请求参数:可以通过 `getParameter(String name)` 或者 `getParameterMap()` 来读取 URL 参数或者表单提交的数据[^2]。 - 访问会话管理:如果启用了会话跟踪,则可通过 `getSession(boolean create)` 获得 HttpSession 对象以便存储和检索用户特定的信息。 #### 2. HttpServletResponse的功能 `HttpServletResponse` 则负责构建发回给用户的响应消息。这包括但不限于设定状态码、定义实体主体内容类型以及实际写入输出流等内容。 - 设置响应的状态码:比如成功时通常设为200 OK;当发生错误则可能设置成404 Not Found等等。可调用 setStatus(int sc) 实现这一点。 - 添加响应头字段:像 Content-Type, Cache-Control 这样的元数据能够指导浏览器如何解释接收到的内容。addHeader() 函数允许添加自定义头部项。 - 发送重定向指令:sendRedirect(java.lang.String location),指示客户重新访问指定的新URL位置[^3]。 #### 3. RequestDispatcher的工作方式 除了直接生成HTML页面作为回应之外,在某些情况下还需要把控制权交给另一个组件继续完成剩余的任务——这就是所谓的“转发”。RequestDispatcher 提供了一种机制让当前 servlet 将请求传递至其他资源(如JSP文件或其他servlet)去执行进一步操作而不改变原始URI路径可见性给最终使用者看到的是统一入口点的效果[^1]。 ```java // Example of using RequestDispatcher to forward a request. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String target = "/anotherResource"; getServletContext().getRequestDispatcher(target).forward(request,response); } ``` 上述代码片段展示了如何在一个简单的 GET 请求处理器中运用 RequestDispatcher 执行内部跳转到名为 `/anotherResource` 的目标上。 --- ### 总结 综上所述,Java Web 应用程序中的请求响应交互遵循标准的 HTTP 协议流程,并借助 Servlet API 提供的强大工具集简化了开发人员对于复杂网络通信细节的关注度。通过对 HttpServletRequest 和 HttpServletResponse 的灵活操控配合诸如 RequestDispatcher 类似的辅助类库的支持下实现了高效便捷的服务端逻辑编写能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值