在Servlet中我们一般都需要跳转页面,来实现某些功能,我们可以选择或者重定向来实现页面的跳转。
转发:request.getRequestDispatcher("test.html").forward(request, response);
重定向:response.sendRedirect("test.html");
转发的时候我们需要用到RequestDispatcher类,官方文档给的解释,这个类定义接收来自客户端的请求并将它们发送到服务器上的任何资源(比如 servlet、HTML 文件或 JSP 文件)的对象。servlet 容器可创建RequestDispatcher
对象,该对象被用作包装位于特定路径上的服务器资源或通过特定名称给定的服务器资源的包装器.然后我们调用forward()方法,将请求从一个 servlet 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。此方法允许一个 servlet 对请求进行初步处理,并使另一个资源生成响应。
重定向,使用指定重定向位置 URL 将临时重定向响应发送到客户端。此方法可以接受相对 URL;servlet 容器必须在将响应发送到客户端之前将相对 URL 转换为绝对 URL。如果位置是相对的,没有前导 '/',则容器将相对于当前请求 URI 对其进行解释。如果位置是相对的,有一个前导 '/',则容器将相对于 servlet 容器根对其进行解释。
区别:
1) 浏览器地址栏有变化,转发的话URL还是原来请求的URL,重定向变为定向到的资源
比如说:http://localhost:8080/demo/demoServlet 请求该servlet,页面跳转到index.jsp界面
转发以后的地址栏url http://localhost:8080/demo/demoServlet,重定向的话http://localhost:8080/demo/index.jsp
2) 请求次数不一样
从本质来说,它们的区别在于是否生成响应.sendRedirect()方法,实际上是生成了一个临时响应,这个响应是一个用户无法看到的响应,状态码是300。浏览器在接收到这个响应后,不显示任何东西,而再次发出一个请求到重定向的响应所指定的地址上。因此,用户最后看到的最后结果并不是第一次请求过的地址,而是重定向后的地址产生的结果。而请求的转发则不同,它是将请求交给另外一个Servlet来处理,然后处理好的结果还是由原来的Servlet返回。
3) 作用域不同
4)请求转发在服务器端完成,而重定向是让浏览器完成。