转发与重定向 一、转发和重定向的概念 二、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 域里面的数据取出来,使用转发机制。 剩下所有的请求均使用重定向。(重定向使用较多。)