一、请求转发与重定向
在说请求转发和重定向之前,我们得回顾下JSP九大隐含对象中的 request 对象和 response 对象。
-
request:这个对象是HttpServletRequest 对象,可以对在客户请求中给出的信息进行访问,里面包含了所有有关当前浏览器的请求信息。
请求的转发:
request.getRequestDispatcher(url).forward(request,response)①. 调用request对象的getRequestDispatcher(url)方法,url为要转发的地址。
②. 调用forward(request,response)进行请求的转发。 -
response:将服务器端数据发送到客户端,可在客户端浏览器中显示。
请求的重定向:
response.setRedirect(url)直接调用response.setRedirect(url)方法,url为要重定向的地址。
二、请求转发与重定向的差异
本质区别:请求的转发只发出了一次请求, 而重定向则发出了两次请求。
2.1 请求的次数
首先来看一下请求转发和请求重定向的工作流程:
假设我们有这样一个需求:A首先向B发出请求,然后B再向C发出请求。
-
请求转发:首先A向B发出请求(第一次),然后B通过请求转发的方式跳转到C,C再返回给A,具体看下面这张图。
从图中我们可以看出,在请求的转发过程中,A发出的请求 和 B向C转发发出的请求 是同一个请求,故,请求的转发只发出了一次请求。 -
请求重定向:首先A向B发出请求(第一次),然后B通过重定向的方式跳转到C,但B不会直接向C发出请求,而是先返回到A,然后再由A向C发出请求(第二次),具体看下面这张图。
从图中我们可以看出,在请求的重定向过程中,A发了两次请求,且这两次请求不是同一个请求。
我们再举一个生活中的小例子来加以说明:
假设你去办理某个证件:
重定向:你先去了A局,A局人对你说:“这事不归我们管,归B局管”,然后你就从A退了出来,自己乘车去了B局。
转发:你去了A局,A局人看了后知道这事归B局管,但是他们没有把你退回来,而是让你坐一会,自己到后面办公室联系了B的人,让他们办好后,送回给了你。
2.2 地址栏是否改变
还是以上面的A.jsp,B.jsp,C.jsp为例,如果现在A要请求B,然后B要请求C。
先看重定向方式:首先在浏览器地址栏输入http://localhost:8080/test/A.jsp
然后A会跳转到B,此时的地址就是http://localhost:8080/test/B.jsp
由于是重定向的方式,这时B会先返回给A,A再发请求到C,这时地址为http://localhost:8080/test/C.jsp ,所以地址栏会发生改变。
再看请求转发方式:首先在浏览器地址栏输入http://localhost:8080/test/A.jsp
然后A会跳转到B,此时的地址就是http://localhost:8080/test/B.jsp
最后由B跳转到C,地址为http://localhost:8080/test/B.jsp (由于是请求转发的方式,还是同一个请求,仅仅是服务器的内部跳转,所以地址栏不会改变)。
2.3 是否保留第一次请求时的数据
再说保留数据之前,先回顾一下4个域对象:pageContext,request,session,application
这4个域对象都有几个共同的方法:
- void setAttribute(String