本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求.
具体:
①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址
②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.
③. 请求的转发: 只能转发给当前 WEB 应用的的资源
请求的重定向: 可以重定向到任何资源.
④. 请求的转发: / 代表的是当前 WEB 应用的根目录
请求的重定向: / 代表的是当前 WEB 站点的根目录.
例如:
新建三个jsp文件 1.jsp,2.jsp,3.jsp
在1.jsp中 执行转发和重定向3.jsp 观察结果
1.jsp
<body>
<h1>1111</h1>
<a href="2.jsp"> To 2.jsp</a>
</body>
2.jsp
<body>
<h1>2222</h1>
<%
//分别执行转发和重定向
//1、转发
// request.getRequestDispatcher("3.jsp").forward(request, response);
//2、重定向
response.sendRedirect("3.jsp");
%>
</body>
3.jsp
<body>
<h1>3333</h1>
</body>
在1.jsp界面先点击超链接转到2.jsp,
执行转发后,跳到3.jsp 地址栏显示的是2.jsp
执行重定向后,跳到3.jsp,但地址栏显示的是3.jsp
所以验证了开头的结论。
如图:
转发 (看地址栏 )
重定向 (看地址栏)