forward 顾名思义:转发,从服务器转发。因此在客户端的浏览器地址里看不出url的变化
redirect 顾名思义:重定向,在客户端重新定向了一次,因此在客户端能看懂啊url的变化。
这两者的区别可以用下面的图来表示(转载)
forward
<%@ page contentType="text/html; charset=gb2312"
%>
<%
String color = request.getParameter("color"
);
if("red".equals(color)) {
request.getRequestDispatcher("red.jsp").forward(request, response);
} else if("green".equals(color)) {
request.getRequestDispatcher("green.jsp").forward(request, response);
}
%>
无论转发至red.jsp还是green.jsp,地址栏上显示的都是test.jsp。
这是为什么呢?通过下面的流程图会让我们容易理解:
-
浏览器向test.jsp发送请求。
-
test.jsp计算客户选择的颜色,将请求转发至red.jsp。
-
red.jsp返回响应给浏览器。
这 下知道为什么浏览器的地址没有变化了吧?因为浏览器只是执行了对test.jsp的请求,test.jsp到red.jsp的部分是在服务器内执行的,浏 览器并不知道服务器里到底发生了什么,它只知道自己获得的响应是test.jsp发回来的,甚至不知道服务器还有个red.jsp。
redirect
test.jsp中需要这样写:
<%@ page contentType="text/html; charset=gb2312"%>
<%
String color = request.getParameter("color"
);
if("red".equals(color)) {
response.sendRedirect("red.jsp");
} else if("green".equals(color)) {
response.sendRedirect("green.jsp");
}
%>
-
浏览器向test.jsp发送请求。
-
test.jsp计算客户选择的颜色,向浏览器发送一个页面重定向(redirect)的响应,响应中包含red.jsp的url地址。
-
浏览器根据页面重定向(redirect)响应中的red.jsp地址,再次向服务器发送请求,这次请求的就是red.jsp了。
-
red.jsp执行,返回响应。