forward请求转发和sendRedirect重定向

目前已经学习了两种资源跳转的方式:分别是request对象的请求转发和response的重定向,那么这两者各自有什么特点以及它们之间的区别是什么呢?

request请求转发

一种在服务器内部的资源跳转方式,举个例子:浏览器向服务器发出请求,服务器中的AServlet收到了请求,但是AServlet无法单独完成这个请求,如果要完成这个请求,还需要服务器内BServlet的参与,这时候就会用到请求转发,AServlet执行完自己能执行的部分后跳转到BServlet中继续执行,(这中间还涉及到了共享数据,文章后面会将)

请求转发的特点

  • 浏览器地址栏路径不发生变化:就是说,浏览器请求访问AServlet,Aservlet执行完自己能执行的部分后跳转到BServlet,在这个过程中浏览器地址栏的路径还是AServlet的路径,并不会发生改变
  • 只能转发到当前服务器内部资源中。
  • 转发是一次请求:从上面的例子可以看出,整个转发的过程中,无论在服务器内部资源跳转多少次,浏览器只发出过一次请求,而服务请经过多次跳转处理完浏览器的请求后只会做出一次响应

共享数据

上面说到了,AServlet和BServlet一起完成浏览器的请求,那么 这两者之间必定是有数据交互的,因为AServlet要告诉BServlet自己做了哪些部分(修改了那些数据..),并将这些部分共享给BServlet
说共享数据之前,先说一个概念
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,即在一个请求的范围内各个服务器资源可以共享数据。因为上面说到了请求转发这个过程是一次请求响应的过程,所以 请求转发过程中的多个资源可以共享数据
  1. 存储数据,在当前资源中调用此方法(转发之前调用)void setAttribute(String name, Object o)
    参数:
    String name:给数据起一个名,在后面取出数据用到
    Object o:要共享的数据
  2. 在跳转后的资源调用此方法,可以达到共享数据的目的:Object getAttribute(String name)
    参数:
    String name:存储数据时起的名
       还有一个相关的方法:通过键来移除键值对 void removeAttribute(String name)


以上就是request请求转发的步骤和特点


response重定向

一种资源跳转的方式,不限于服务器内部,可以跳转到其他服务器资源(如跳转到百度)
重定向实现步骤
  1. 设置状态码为302(代表重定向)
  2. 设置响应头location:response.setHeader("location","目的资源的路径");
以上是分步实现,后面会说sendRedirect方法来实现,但实际上步骤还是这样的,只不过把步骤封装为一个方法

重定向的原理

  1. 浏览器向服务器发出请求,AServlet接收到了这个请求,AServlet表示无法处理服务器的这个请求,但AServlet却知道BServlet(可以是服务器内部的资源也可以是其他服务器的资源)
  2. 所以AServlet在在响应消息中干了两件事情
    1. 设置状态码为302,告诉服务器重定向
    2. 告诉浏览器BServlet的路径,(设置响应头location为BServlet的路径)
  3. 浏览器收到了AServlet的响应消息后,根据AServlet给出的location路径去访问BServlet

重定向的特点

  • 地址栏发生变化:在资源跳转的过程中,浏览器地址栏会发生变化
  • 重定向可以访问其他站点(服务器)的资源
  • 重定向是两次请求。不能使用request对象来共享数据

重定向的简单方法

调用response的sendRedirect方法,方法中传递跳转资源的路径
response.sendRedirect("https://www.baidu.com");

关于重定向和请求转发中资源路径的写法,会另外介绍

发布了28 篇原创文章 · 获赞 1 · 访问量 2127

猜你喜欢

转载自blog.csdn.net/weixin_42387411/article/details/100531703
今日推荐