Servlet请求转发与重定向
RequestDispatcher实现请求转发
当一个 Web 资源收到客户端的请求后,如果希望服务器通知另外一个资源处理请求,那么这时可以通过 RequestDispatcher 接口的实例对象实现。ServletRequest 接口中定义了一个获取 RequestDispatcher 对象的方法,如表 1 所示。
获取 RequestDispatcher 对象的方法
方法声明 | 功能描述 |
---|---|
RequestDispatcher getRequestDispatcher (String path) | 返回封装了某条路径所指定资源的 RequestDispatcher 对象。其中,参数 path 必须以“/”开头,用于表示当前 Web 应用的根目录。需要注意的是,WEB-INF 目录中的内容对 RequestDispatcher 对象也是可见的。因此,传递给 getRequestDispatcher(String path) 方法的资源可以是 WEB-INF 目录中的文件 |
获取到 RequestDispatcher 对象后,最重要的工作就是通知其他 Web 资源处理当前的 Servlet 请求,为此,RequestDispatcher 接口定义了两个相关方法,如表 2 所示。
RequestDispatcher 接口的方法
方法声明 | 功能描述 |
---|---|
forward(ServletRequest request,ServletResponse response) | 该方法用于将请求从一个 Servlet 传递给另一个 Web 资源。在 Servlet 中,可以对请求做一个初步处理,然后通过调用这个方法,将请求传递给其他资源进行响应。需要注意的是,该方法必须在响应提交给客户端之前被调用,否则将抛出 IllegalStateException 异常 |
include(ServletRequest request,ServletResponse response) | 该方法用于将其他的资源作为当前响应内容包含进来 |
请求转发
在 RequestDispatcher 接口中,forward() 方法可以实现请求转发,include() 方法可以实现请求包含,本节将以请求转发为例,讲解 forward() 方法的使用。
在 Servlet 中,如果当前 Web 资源不想处理请求,则可以通过 forward() 方法将当前请求传递给其他的 Web 资源进行处理,这种方式称为请求转发。请求转发的工作原理如图 1 所示。
从图 1 中可以看出,当客户端访问 Servlet1 时,可以通过 forward() 方法将请求转发给其他 Web 资源,其他 Web 资源处理完请求后,直接将响应结果返回到客户端。
了解了 forward() 方法的工作原理后,下面通过案例演示 forward() 方法的使用。在 servletDemo02 项目的 com.mengma.request 包中创建一个名为 RequestForwardServlet 的 Servlet 类,该类使用 forword() 方法将请求转发到一个新的 Servlet 页面,如下所示。
![](https://img.haomeiwen.com/i20553365/5b411835f95b1883.png)
图 1 forward() 方法的工作原理
HttpServletResponse .sendRedirect()实现重定向(页面跳转)
在某些情况下,针对客户端的请求,一个 Servlet类可能无法完成全部工作。这时,可以使用请求重定向完成这一工作。
请求重定向指 Web 服务器接收到客户端的请求后,可能由于某些条件的限制,不能访问当前请求 URL 所指向的 Web 资源,而是指定了一个新的资源路径,让客户端重新发送请求。
为了实现请求重定向,HttpServletResponse 接口定义了一个 sendRedirect() 方法,该方法用于生成 302 响应码和 Location 响应头,从而通知客户端重新访问 Location 响应头中指定的 URL,sendRedirect() 方法的完整语法如下所示:
public void sendRedirect(java.lang.String location) throws java.io.IOException
在上述方法代码中,参数 location 可以使用相对 URL,Web 服务器会自动将相对 URL 翻译成绝对 URL,再生成 Location 头字段。
sendRedirect()
方法的工作原理如图 1 所示。
![](https://img.haomeiwen.com/i20553365/5fa81eeece2f3579.png)
在图 1 中,当客户端访问 Servlet1 时,由于在 Servlet1 中调用了 sendRedirect() 方法将请求重定向到 Servlet2,因此,浏览器收到 Servlet1 的响应消息后,立刻向 Servlet2 发送请求,Servlet2 对请求处理完毕后,再将响应消息回送给客户端浏览器并显示。