二者比较以下:html
跳转类型 | 客户端请求次数 | 服务端响应次数 | URL变化 | 站外跳转 | 做用域 |
服务器跳转 | 1 | 1 | 无 | 否 | pageContext、request、session、application |
客户端跳转 | 2 | 2 | 有 | 能 | session、application |
请求次数与响应次数服务器
服务端跳转:客户端发起一次请求,服务端接收请求后,将结果跳转到另外一个页面,做为这次请求结果返回给客户端
客户端跳转:客户端发起一次请求,服务端返回这次请求的结果,结果内容是一个URL地址,客户端拿到此URL,再次发送一次请求,服务端再次响应最终结果给客户端session
因此,对于服务器跳转,请求次数和响应次数均是1次,对于 客户端跳转,请求次数和响应次数均是2次app
URL是否变化jsp
服务端跳转:只是服务端内部不断进行forward,无论进行多少次forward,客户端是不知情的,服务端将最后的结果返回给客户端,即完成这次请求。客户端的URL没有变化。
客户端跳转:客户端发起两次请求,URL发生变化(PS:除非闲得蛋疼,两次请求的URL地址是同样的)htm
可否进行站外跳转对象
服务端跳转:不能进行站外跳转。服务端请求只能在服务内,将请求响应的结果不断的跳转, 使用的都是服务内部的资源。不能跳到其余服务上去。
客户端跳转:能够。直接跳转到其余服务的URL便可blog
做用域生命周期
以jsp的四大做用域,关于做用域详见地址 http://www.cnblogs.com/mengzhen123/p/5968831.html资源
pageContext:当前页面
request:当前请求
session:当前会话
application:整个应用。狭义的理解为application的生命周期为 服务的开启到关闭
从上面咱们说请求次数和响应次数就能够知道,对于客户端跳转,pageContext、request发生了改变。由于客户端URL发生了变化,pageContext即发生了变化,客户端是发送了是两次请求,request即发生了变化。因此若是使用客户端跳转的时候,共享数据建议存放在session中。
服务端为何没有发生变化,咱们从selvet实现服务端跳转方法forward不难看出, forward方法调用时,带着request、response参数,即不论服务端进行多少次forward,都是使用同一个request、response。因此pageContext、request做用域并无变化。共享数据放在这两个做用域的对象中,依然能够取到。
PS:selvet、Struts二、SpringMVC 实现请求跳转的方式有差别,可是其本质是同样的。