转发和重定向

转发和重定向

页面跳转的两种实现方式:请求转发和重定向;

1.请求转发(forward):转发是发⽣在服务器的

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的*.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的。转发时浏览器的地址是没有变化的,也就是说浏览器是不知道该跳转的动作,转发是对浏览器透明的。请求转发只是⼀次的http请求,⼀次转发中request和response对象都是同⼀个。这也解释了,为什么可以使⽤request作为域对象进⾏Servlet之间的通讯。

2.重定向(redirect):重定向是发⽣在浏览器的

客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。这是由浏览器进⾏的⻚⾯跳转实现重定向会发出两个http请求,request域对象是⽆效的,因为它不是同⼀个request对象。

3.怎么书写源地址?

记住⼀个原则:给服务器⽤的直接从资源名开始写,给浏览器⽤的要把应⽤名写上

  • 请求转发:request.getRequestDispatcher("/资源名 URI").forword(request,response);

    • 转发时"/"代表的是本应⽤程序的根⽬录
  • 重定向:response.sendRedirect("/web应⽤/资源名 URI");

    • 重定向时"/"代表的是webapps⽬录
  • springMvc中可以使用redirect和forward关键字

    • 加了 /,使用是绝对路径(推荐使用),从项目根路径找;
    • 没加 /,使用是相对路径,相对于上一次访问上下文路径的上一级找。
      /response/test.do ---> "redirect:/hello.html" ---> localhost:/hello.html
      /response/test.do ---> "redirect:hello.html" ---> localhost:/response/hello.html

4.区别

1、请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;

2、地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;

3、是否共享数据:重定向两次请求不共享数据,转发的request对象可以传递各种类型的数据,包括对象(在request级别使用信息共享,使用重定向必然出错);

4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;

5、发生行为不同:重定向是客户端行为,转发是服务器端行为;

6、转发时:执⾏到跳转语句时就会⽴刻跳转; 重定向:整个⻚⾯执⾏完之后才执⾏跳转;

5.使用:

1、转发是带着转发前的请求的参数的。重定向是新的请求。
2、转发可以让用户访问到存放在WEB-INF目录中的目标资源,而重定向不可以访问WEB-INF下的资源。
3、重定向的速度比转发慢,因为浏览器还得发出一个新的请求,所以如果在使用转发和重定向都无所谓的时候建议使用转发;
4、因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。

posted @ 2020-11-14 17:00  FM-XP  阅读(123)  评论(0)    收藏  举报