作为一名 java web 开发的程序员,在应用 servlet/jsp 的时候,咱们必须要晓得实现页面跳转的两种形式的区别和分割:即转发和重定向的区别。
1、request.getRequestDispatcher().forward()办法, 只能将申请转发给同一个 WEB 利用中的组件;而 response.sendRedirect() 办法不仅能够重定向到以后应用程序中的其余资源,还能够重定向到同一个站点上的其余应用程序中的资源,甚至是应用相对 URL 重定向到其余站点的资源。
如果传递给 response.sendRedirect()办法的绝对 URL 以“/”结尾,它是绝对于整个 WEB 站点的根目录;如果创立 request.getRequestDispatcher()对象时指定的绝对 URL 以“/”结尾,它是绝对于以后 WEB 应用程序的根目录。
2、重定向拜访过程完结后,浏览器地址栏中显示的 URL 会产生扭转,由初始的 URL 地址变成重定向的指标 URL;申请转发过程完结后,浏览器地址栏放弃初始的 URL 地址不变。
3、HttpServletResponse.sendRedirect 办法对浏览器的申请间接作出响应,响应的后果就是通知浏览器去从新收回对另外一个 URL 的拜访申请,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四当初的通信地址通知给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。
由此可见,重定向的时候,“浏览器”一共收回了两封信和收到了两次回复,“浏览器”也晓得他借到的钱出自李四之手。
request.getRequestDispatcher().forward()办法在服务器端外部将申请转发给另外一个资源,浏览器只晓得收回了申请并失去了响应后果,并不知道在服务器程序外部产生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还能够加上本人的一些钱,而后再将这些钱汇给了“浏览器”。
由此可见,转发的时候,“浏览器”只发 出了一封信和收到了一次回复,他只晓得从张三那里借到了钱,并不知道有一部分钱出自李四之手。
4、request.getRequestDispatcher().forward()办法的调用者与被调用者之间共享雷同的 request 对象和 response 对象,它们属于同一个拜访申请和响应过程;
而 response.sendRedirect()办法调用者与被调用者应用各自的 request 对象和 response 对象,它们属于两个独立的拜访申请和响应过程。对于同一个 WEB 应用程序的外部资源之间的跳转,特地是跳转之前要对申请进行一些后期预处理,并要应用 HttpServletRequest.setAttribute 办法传递预处理后果,那就应该应用 request.getRequestDispatcher().forward()办法。不同 WEB 应用程序之间的重定向,特地是要重定向到另外一个 WEB 站点上的资源的状况,都应该应用 response.sendRedirect()办法。
5、无论是 request.getRequestDispatcher().forward()办法,还是 response.sendRedirect()办法,在调用它们之前,都不能有内容曾经被理论输入到了客户端。如果缓冲区中曾经有了一些内容,这些内容将被从缓冲区中。
转发和重定向的图解
两种跳转取得对象的形式
// 取得转发对象 getRequestDispatcher()
HttpServletRequest(httpServletRequest).getRequestDispatcher
ServletContext.getRequestDispatcher();
// 取得重定向对象 sendRedirect()
HttpServletResponse(httpServletResponse).sendRedirect();
转发和跳转的小结
1、转发应用的是 getRequestDispatcher()办法; 重定向应用的是 sendRedirect();
2、转发:浏览器 URL 的地址栏不变。重定向:浏览器 URL 的地址栏扭转;
3、转发是服务器行为,重定向是客户端行为;
4、转发是浏览器只做了一次拜访申请。重定向是浏览器做了至多两次的拜访申请;
5、转发 2 次跳转之间传输的信息不会失落,重定向 2 次跳转之间传输的信息会失落(request 范畴)。
转发和重定向的抉择
1、重定向的速度比转发慢,因为浏览器还得收回一个新的申请,如果在应用转发和重定向都无所谓的时候倡议应用转发。
2、因为转发只能拜访以后 WEB 的应用程序,所以不同 WEB 应用程序之间的拜访,特地是要拜访到另外一个 WEB 站点上的资源的状况,这个时候就只能应用重定向了。
转发和重定向的利用场景
在下面我曾经提到了,转发是要比重定向快,因为重定向须要通过客户端,而转发没有。有时候,采纳重定向会更好,若须要重定向到另外一个内部网站,则无奈应用转发。另外,重定向还有一个利用场景:防止在用户从新加载页面时两次调用雷同的动作。
例如,当提交产品表单的时候,执行保留的办法将会被调用,并执行相应的动作;这在一个实在的应用程序中,很有可能将表单中的所有产品信息退出到数据库中。然而如果在提交表单后,从新加载页面,执行保留的办法就很有可能再次被调用。同样的产品信息就将可能再次被增加,为了防止这种状况,提交表单后,你能够将用户重定向到一个不同的页面,这样的话,这个网页任意从新加载都没有副作用;
然而,应用重定向不太不便的中央是,应用它无奈将值轻松地传递给指标页面。而采纳转发,则能够简略地将属性增加到 Model, 使得指标视图能够轻松拜访。因为重定向通过客户端,所以 Model 中的所有都会在重定向时失落。但侥幸的是,在 Spring3.1 版本当前,咱们能够通过 Flash 属性,解决重定向时传值失落的问题。
要应用 Flash 属性,必须在 Spring MVC 的配置文件中增加一个 <annotation-driven/>。而后,还必须再办法上增加一个新的参数类型:org.springframework.web.servlet.mvc.support.RedirectAttributes。
如下所示:
@RequestMapping(value=”saveProduct”,method=RequestMethod.POST)
public String saveProduct(ProductForm productForm,RedirectAttributes redirectAttributes){
// 执行产品保留的业务逻辑等
// 传递参数
redirectAttributes.addFlashAttribute("message","The product is saved successfully");
// 执行重定向
return "redirect:/……";
}
版权申明:本文内容由互联网用户自发奉献,该文观点仅代表作者自己。本站仅提供信息存储空间服务,不领有所有权,不承当相干法律责任。如发现本站有涉嫌侵权 / 守法违规的内容,请发送邮件至 举报,一经查实,本站将立即删除。