转发与重定向
- 一、转发和重定向的概念
-
- 二、JavaWeb 中的转发和重定向
- 三、SpringMVC 中的转发和重定向
-
- 四、总结
一、转发和重定向的概念
- 在 Web 应用中,转发和重定向都是用于将请求从一个页面传递到另一个页面的操作(资源跳转),它们的主要区别在于传递的方式不同。
1.转发
- 转发(Forward) 是指将请求从一个 Servlet 转发到另一个 Servlet、JSP 或 HTML 页面。在转发的过程中,请求对象和响应对象都会被传递给下一个 Servlet 或页面,而客户端并不知道这个过程。也就是说,转发是在服务器端完成的,客户端并不知道。
- 转发(浏览器发送了一次请求)
- 在浏览器地址栏上发送的请求是:http://localhost:8080/servletA ,最终请求结束之后,浏览器地址栏上的地址还是这个。没变。
- 转发会存在浏览器的刷新问题。
2.重定向
- 重定向(Redirect)是指将请求从一个页面重定向到另一个页面。在重定向的过程中,服务器会发送一个特殊的响应给客户端,这个响应会告诉客户端请求的地址已经发生了变化,需要重新发起请求。客户端会根据这个响应重新发起请求,并直接访问新的地址。也就是说,重定向是在客户端完成的,客户端完成的这个过程。
- 重定向(浏览器发送了两次请求)
- 在浏览器地址栏上发送的请求是:http://localhost:8080/servletA,最终在浏览器地址栏上显示的地址是:http://localhost:8080/servletB。
二、JavaWeb 中的转发和重定向
- 转发
- 由于是在项目内部中进行跳转,所以转发的时候路径上不需要写项目名。
RequestDispatcher dispatcher = request.getRequestDispatcher("/target.jsp");
dispatcher.forward(request, response);
request.getRequestDispatcher("/target.jsp").forward(request, response);
- 重定向
- 注意:路径上要加一个项目名,因为浏览器发送请求,请求路径上是需要添加项目名的。
- 重定向不可以访问WEN-INF下的文件,在WEB-INF下的目录是不可以直接方法,是被保护的。
response.sendRedirect(request.getContextPath() + "/target.jsp");
三、SpringMVC 中的转发和重定向
- 在 SpringMVC 中默认的就是转发,在我们使用 ModelAndView 或者是直接 return 字符串时,其实就是默认走的转发。
1.转发
- 我们如果使用默认的方式进行转发的话,我们的路径是会去拼接视图解析器的前缀和后缀。
- 如果我们选择显式的完整的去进行使用转发,那么这时候视图解析器就不起作用了,我们需要在 forward: 后面添加完整的路径。
- 这样做其实是可以让我们可以去访问其他目录下的一些文件,避免了视图解析器只能访问前缀的指定目录 。
(1) 默认的方式
@GetMapping("/ServletA")
public String ServletA(){
return "target";
}
(2) 完整的方式
@GetMapping("/ServletA")
public String ServletA(){
return "forward:/templates/target.jsp";
}
2.重定向
- 使用重定向其实和上面转发的完整方式是一样的,这时候需要我们显式的把 redirect: 写出来。
- 当我们使用这种方式来进行重定向时,和上面完整的转发方式一样,需要把完整的路径写出来,这时的视图解析器也是不会去拼接前缀和后缀。
- 重定向不可以访问WEN-INF下的文件,在WEB-INF下的目录是不可以直接方法,是被保护的。
@GetMapping("/ServletA")
public String ServletA(){
return "redirect:/templates/target.jsp";
}
四、总结
- 转发和重定向应该如何选择?什么时候使用转发,什么时候使用重定向?
- 如果在上一个 Servlet 当中向 request 域当中绑定了数据,希望从下一个 Servlet 当中把 request 域里面的数据取出来,使用转发机制。
- 剩下所有的请求均使用重定向。(重定向使用较多。)