乐趣区

关于java:页面跳转的两种方式转发和重定向区别及应用场景分析

作为一名 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:/……";

}

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

退出移动版