作为一名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:/……";
}
版权申明:本文内容由互联网用户自发奉献,该文观点仅代表作者自己。本站仅提供信息存储空间服务,不领有所有权,不承当相干法律责任。如发现本站有涉嫌侵权/守法违规的内容, 请发送邮件至 举报,一经查实,本站将立即删除。