目前已经学习了两种资源跳转的方式:分别是request对象的请求转发和response的重定向,那么这两者各自有什么特点以及它们之间的区别是什么呢?
request请求转发
一种在服务器内部的资源跳转方式,举个例子:浏览器向服务器发出请求,服务器中的AServlet收到了请求,但是AServlet无法单独完成这个请求,如果要完成这个请求,还需要服务器内BServlet的参与,这时候就会用到请求转发,AServlet执行完自己能执行的部分后跳转到BServlet中继续执行,(这中间还涉及到了共享数据,文章后面会将)请求转发的特点
- 浏览器地址栏路径不发生变化:就是说,浏览器请求访问AServlet,Aservlet执行完自己能执行的部分后跳转到BServlet,在这个过程中浏览器地址栏的路径还是AServlet的路径,并不会发生改变
- 只能转发到当前服务器内部资源中。
- 转发是一次请求:从上面的例子可以看出,整个转发的过程中,无论在服务器内部资源跳转多少次,浏览器只发出过一次请求,而服务请经过多次跳转处理完浏览器的请求后只会做出一次响应
共享数据
上面说到了,AServlet和BServlet一起完成浏览器的请求,那么 这两者之间必定是有数据交互的,因为AServlet要告诉BServlet自己做了哪些部分(修改了那些数据..),并将这些部分共享给BServlet说共享数据之前,先说一个概念
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,即在一个请求的范围内各个服务器资源可以共享数据。因为上面说到了请求转发这个过程是一次请求响应的过程,所以 请求转发过程中的多个资源可以共享数据
- 存储数据,在当前资源中调用此方法(转发之前调用)void setAttribute(String name, Object o)
参数:
String name:给数据起一个名,在后面取出数据用到
Object o:要共享的数据 - 在跳转后的资源调用此方法,可以达到共享数据的目的:Object getAttribute(String name)
参数:
String name:存储数据时起的名
以上就是request请求转发的步骤和特点
response重定向
一种资源跳转的方式,不限于服务器内部,可以跳转到其他服务器资源(如跳转到百度)
重定向实现步骤
- 设置状态码为302(代表重定向)
- 设置响应头location:response.setHeader("location","目的资源的路径");
重定向的原理
- 浏览器向服务器发出请求,AServlet接收到了这个请求,AServlet表示无法处理服务器的这个请求,但AServlet却知道BServlet(可以是服务器内部的资源也可以是其他服务器的资源)
- 所以AServlet在在响应消息中干了两件事情
- 设置状态码为302,告诉服务器重定向
- 告诉浏览器BServlet的路径,(设置响应头location为BServlet的路径)
- 浏览器收到了AServlet的响应消息后,根据AServlet给出的location路径去访问BServlet
重定向的特点
- 地址栏发生变化:在资源跳转的过程中,浏览器地址栏会发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据