Servlet(二)——客户端跳转与服务器端跳转(原理)

目录

 

一、客户端跳转

二、服务端跳转

三、两者区别


一、客户端跳转

客户端跳转也叫重定向(外部跳转),是调用HttpServletResponse对象中的sendRedirect()方法;

这是一个响应对象的方法,调用这个方法表明整个请求已经结束,服务器开始向客户端返回执行的结果;

//客户端跳转response
response.sendRedirect("target.jsp");

注意:

此跳转只能传递sessionapplication范围的属性,而无法传递request范围的属性;

客户端会发送两个请求,并且页面的路径会改变

重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

重定向过程:

(1)客户浏览器发送http请求

(2)web服务器接受后发送302状态码响应及对应新的location给客户浏览器

(3)客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址

(4)服务器根据此请求寻找资源并发送给客户。

          在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

客户端跳转的过程: 

二、服务端跳转

服务端跳转也叫请求转发(内部跳转),是RequestDispatcher接口的forward()方法来实现的;

RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的。 

//服务器跳转,调用RequestDispatcher接口
RequestDispatcher rd=request.getRequestDispatcher("target.jsp");
rd.forward(request, response);

注意:

服务器端跳转页面的路径不会发生改变,所以可以request范围的属性。

 传输的信息不会丢失。

转发过程:

(1)客户浏览器发送http请求

(2)web服务器接受此请求

(3)调用内部的一个方法在容器内部完成请求处理和转发动作

(4)将目标资源发送给客户;

        在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

 服务端跳转的过程:

三、两者区别

 一句话,转发是服务器行为,重定向是客户端行为。

(1)转发的速度快,重定向的速度慢;

(2)转发不会执行转发后的代码,重定向会执行重定向之后的代码

(3)转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成

通俗解释:

假如你去办理某项业务;

重定向: 你先去了A局,A局看了说:“这个业务不归我管,你要去B局。”,然后你就从A局退了出来,自己去了B局。

转发:你先去了A局,A局看了之后明白这个要B局弄,但是他并没有叫你走,而是让你等了一会儿,自己去办公室打电话叫B局的人弄好后送过来了,然后交给你。

猜你喜欢

转载自blog.csdn.net/qq_37084904/article/details/93161648