对于转发和重定向
本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求.
用生活例子说明一下:
小明向小王借钱,小王说他没有,但是小王让小明放心,他到别人那里借钱给小明,这就是转发。
小明向小王借钱,小王说没有,手头紧,让他到小丽那里借,然后小明又走到小丽那里借钱,这就是重定向。
下面用一个javaweb例子来说明一下。
对于转发:
首先写一个ForwardServlet:
public class ForwardServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("forwordServlet' doGet");
//请求的转发
//1、调用HttpServletRequest的getRequestDispatcher()方法获取RequestDispatcher对象
//调用getRequestDispatcher()需要传入要转发的地址
String path="testServlet";
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path);
//2.调用HttpServletRequest的forward(request,response)进行请求的转发
requestDispatcher.forward(request, response);
}
}
再给出TestServlet:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet' doGet");
}
}
然后在hello.jsp写个超链接:
<a href="forwardServlet">ForwardServlet</a>
执行,控制台会输出:
地址栏显示:
对于重定向
首先写一个RedirectServlet:
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("RedirectServlet'doGet");
//执行请求的重定向,直接调用response.sendRedirect(path)方法
//path为要重定向的地址
String path = "testServlet";
response.sendRedirect(path);
}
}
再给出TestServlet(和上面转的一样):
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet' doGet");
}
}
然后在hello.jsp写个超链接:
<a href="redirectServlet">RedirectServlet</a>
执行,控制台会输出:
地址栏显示:
很显然,两者控制台输出的结果是一毛一样的,但是差别出在哪里呢?地址栏的url。然后我们再看一下两者的请求,和的doGet()方法最里写两段代码测试一下,代码如下:
在ForwardServlet的doGet()方法最里写两段代码
request.setAttribute("name", "ymfwj");
System.out.println("forwordServlet'name:"+request.getAttribute("name"));
在RedirectServlet的doGet()方法最里写两段代码
request.setAttribute("name", "ymfwj");
System.out.println("RedirectServlet'name:"+request.getAttribute("name"));
在TestServlet的doGet()方法最里写一段代码
最后结果很显然,我们会发现转发的request是同一个,而重定向的request就不是了,他是两个请求了。
总结:
①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址
②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.
③. 请求的转发: 只能转发给当前 WEB 应用的的资源
请求的重定向: 可以重定向到任何资源.
④. 请求的转发: / 代表的是当前 WEB 应用的根目录
请求的重定向: / 代表的是当前 WEB 站点的根目录.
本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求.
用生活例子说明一下:
小明向小王借钱,小王说他没有,但是小王让小明放心,他到别人那里借钱给小明,这就是转发。
小明向小王借钱,小王说没有,手头紧,让他到小丽那里借,然后小明又走到小丽那里借钱,这就是重定向。
下面用一个javaweb例子来说明一下。
对于转发:
首先写一个ForwardServlet:
public class ForwardServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("forwordServlet' doGet");
//请求的转发
//1、调用HttpServletRequest的getRequestDispatcher()方法获取RequestDispatcher对象
//调用getRequestDispatcher()需要传入要转发的地址
String path="testServlet";
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path);
//2.调用HttpServletRequest的forward(request,response)进行请求的转发
requestDispatcher.forward(request, response);
}
}
再给出TestServlet:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet' doGet");
}
}
然后在hello.jsp写个超链接:
<a href="forwardServlet">ForwardServlet</a>
执行,控制台会输出:
地址栏显示:
对于重定向
首先写一个RedirectServlet:
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("RedirectServlet'doGet");
//执行请求的重定向,直接调用response.sendRedirect(path)方法
//path为要重定向的地址
String path = "testServlet";
response.sendRedirect(path);
}
}
再给出TestServlet(和上面转的一样):
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet' doGet");
}
}
然后在hello.jsp写个超链接:
<a href="redirectServlet">RedirectServlet</a>
执行,控制台会输出:
地址栏显示:
很显然,两者控制台输出的结果是一毛一样的,但是差别出在哪里呢?地址栏的url。然后我们再看一下两者的请求,和的doGet()方法最里写两段代码测试一下,代码如下:
在ForwardServlet的doGet()方法最里写两段代码
request.setAttribute("name", "ymfwj");
System.out.println("forwordServlet'name:"+request.getAttribute("name"));
在RedirectServlet的doGet()方法最里写两段代码
request.setAttribute("name", "ymfwj");
System.out.println("RedirectServlet'name:"+request.getAttribute("name"));
在TestServlet的doGet()方法最里写一段代码
System.out.println("testServlet'name:"+request.getAttribute("name"));
对于转发的结果:
对于重定向的结果:
最后结果很显然,我们会发现转发的request是同一个,而重定向的request就不是了,他是两个请求了。
总结:
①. 请求的转发: 地址栏是初次发出请求的地址.
请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址
②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象.
请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.
③. 请求的转发: 只能转发给当前 WEB 应用的的资源
请求的重定向: 可以重定向到任何资源.
④. 请求的转发: / 代表的是当前 WEB 应用的根目录
请求的重定向: / 代表的是当前 WEB 站点的根目录.