重定向和转发的区别
-
在代码上
-
转发
-
// 第一步:获取请求转发器对象 RequestDispatcher dispatcher = request.getRequestDispatcher("/b"); // 第二步:调用转发器的forward方法完成跳转/转发 dispatcher.forward(request,response); // 第一步和第二步代码可以联合在一起。 request.getRequestDispatcher("/b").forward(request,response); //注意:转发的时候是一次请求,会将当前的request和response对象传递给下一个servlet.
-
-
重定向
-
response.sendRedirect("servlet02/b") //注意:重定向地址需要加上 项目名 //因为浏览器发送请求是需要加上项目名的
-
-
-
在形式上
- 转发
- 利用转发跳转页面后,会发现浏览器地址栏上,是第一次的访问地址。
- 例如:我在AServlet上通过转发的方式跳转到BServlet,浏览器地址栏上写的是localhost:8080/servlet01/a
- 重定向
- 利用重定向跳转页面,会发现浏览器地址栏上,是最后一此跳转资源的访问地址
- 例如:我在AServlet上通过转发的方式跳转到BServlet,浏览器地址栏上写的是localhost:8080/servlet01/b
- 转发
-
在原理上
- 转发
- 转发的整个过程其实都是WEB服务器自己所完成,是由WEB服务器自己完成的跳转。浏览器只发送了一次请求
- 重定向
- 重定向是浏览器完成的。重定向是一个将地址响应给浏览器的过程,你可以从调方法时用的response对象就可以看出来,重定向是将需要跳转的地址发送给浏览器,浏览器接收到地址后,再次向服务器发送一次跳往该地址的请求。也就是说跳转到一个新的页面,浏览器发送了两次请求。
- 转发
-
注意:
- 转发仍然还在一个请求域当中,而转发的话,到新资源后就不在同一个请求域当中了。
- 浏览器发送请求,地址一定要加项目名,所以在重定向里面写地址时,加上了项目名。
- 转发在同一个请求当中,也就是说前一个和后一个Servlet必须有相同的处理方式,也就是说都重写了doGet或者都重写了doPost。
- 而重定向是两次请求,也就是说第一次是get还是post于第二次请求没关系
-
如何选择转发和重定向
- 如果前一个Servlet在请求域中绑定了数据,并且跳转到下一个Servlet需要取这个数据,就用转发
- 其他情况都用重定向
-
转发会出现一个问题,比如有一个Servlet类,完成的是向数据库插入一个数据,插入成功后会跳转到一个新的页面,如果用转发的方式话,在新的页面上刷新浏览器时,会再次插一条数据到数据库当中,转发是一次请求,你在新页面刷新就是重新执行这个请求。 而如果用重定向则不会出现该问题。