重定向是客户端(也就是浏览器)通过一个路径访问服务器,服务器通知浏览器去访问另一个地址,浏览器再发出另一个地址的请求。
转发请求是客户端通过一个路径访问服务器,服务器内部转发给另一个地址。
通俗的讲:A相当于客户端(浏览器),B和C相当于服务器
那么重定向就是:
A向B说:B可以借我点钱吗?
B回复:我没有,你找C去借钱。
A向C说:好的。C能借我点钱吗?
C回复:借给你。
而转发请求是:
A向B说:B可以借我点钱吗?
B向C说:我没钱,你借A点
C直接回复A:借给你
通过上面两个例子,可以看出:重定向中,浏览器对服务器发出了两次请求,而转发请求中,由于服务器内部处理了转发(B向C说),所以浏览器对服务器只发出了一次请求。
具体图例:
而他们的代码是怎么实现的呢?
重定向
第一种写法:用response的方法sendRedirect来设置重定向,其中的参数
response.sendRedirect(request.getContextPath()+"/a");
*request.getContextPath()指的是项目的绝对路径 *+''表示通知回去让浏览去找加上后的新的绝对路径的。
例如重定向去找'/a',新的路径就应该为:
也就是去寻找这个servlet
@WebServlet(name = "该servlet名字",value = "/a")
*name:表示给当前servlet起一个名字 * urlPatterns:路径匹配;当浏览器上面访问的路径和路径匹配的时候,访问当前servlet
可以在检查(F12/Fn+F12)中Network中看到,服务器请求了两次,并且第一次的状态码为302
第二种写法:
response.setStatus(302);
response.setHeader("Location",request.getContextPath() +"/b");
请求转发代码的实现:
同样是服务器要转发到'/a'
request.getRequestDispatcher("a").forward(request,response);
*首先请求转发用的是resquest,用getRequestDispatcher的方法。
*这里的路径是相对路径,并且我们可以看到有(request,response)。也就是请求转发他可以携带参数
参数的携带:用setAttribute(键值对形式)
request.setAttribute("name","zs");
并且我们可以看到,只请求了一次。
总结:重定向和转发请求的区别:
1. 重定向发送两次请求,请求转发一次请求
2.重定向地址栏发生改表,请求转发不变
3.重定向是从浏览器发送,请求转发是服务器内部
4.重定向不存在request域对象,请求转发可以使用request域对象(能携带参数)
5. 重定向是response的方法,请求转发是request的方法
6.重定向可以请求站外资源,请求转发不可以 (重定向写的是绝对路径,例如可以写站外资源百度地址http:///www.baidu.com,而请求转发写的是相对地址,所以不可以请求站外资源)。
对你有帮助的话给个小心心鼓励一下吧~