在java中实现页面跳转一般有两种方式,一种是请求转发,一种是重定向,那么这两者有什么区别呢?
一、请求转发
请求转发一般是这样的一个过程:客户端发送请求到服务器端,服务器端经过匹配的servlet,并执行,当这个servlet执行完之后,调用getRequestDispacther()方法,把请求转发给指定的页面,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和页面共享的是同一个request,在servlet里面放的所有东西,在页面中都能取出来,整个过程是一个请求,一个响应。
如果以现实生活中的例子来举例,那么以拿快递来举例是比较好的。比如,A有快递到了,但是没有时间,那么A让B帮忙取快递,但是B答应了,想去取得时候B也没有时间,就让C取,C取好快递之后,交给A。
二、重定向
重定向一般是这样的过程:客户端发送请求到服务器端,服务器端经过匹配的servlet,并执行,前面这个步骤是和请求转发一样,处理完之后调用了sendRedirect()方法,这个方法是response的方法,所以调用这个方法会向客户端返回这个响应,客户端会再次发送一个请求,去访问指定页面,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求访问页面。
上面过程中含有两个请求,这两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。整个里面是两个请求,两个响应。
如果以现实生活中的例子来举例,那么还以拿快递来举例是比较好的。比如,A有快递到了,但是没有时间,那么A让B帮忙取快递,但是B没有答应,让A再找人去取,所以A再请C帮忙取,C取好快递之后,交给A。
三、区别
通过上面上面的说明,我们可以总结以下请求转发与重定向的区别:
项目 | 请求转发 | 重定向 |
发送了几次请求? | 1次 | 2次 |
地址栏是否改变 | 不变 | 变,显示的是第二次的地址 |
是否共享request | 是,在request中存的数据,在页面上可以取出 | 否 |
可以跳转的资源 | 项目内部 | 项目内部,外部的资源都可以 |