请求转发
request.getRequestDispatcher(target).forward(request, response);
和
request.getRequestDispatcher(target).include(request, response);
都是request.RequestDispatcher
发起的,include的流程如下图:
forward的工作流程如下:
include是在服务器,从servlet1直接转发到servlet2,由2返回结果给1,再由1产生最终返回结果给客户端。
forward是在服务器,从servlet1直接转发到servlet2,并且由2直接返回结果给客户端。
因为请求转发都是在服务器发生,所以导航栏是看不到地址的变化的,对于浏览器来说,它只发起了一次请求,并不清楚服务器内部做了什么。
转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递,但也只能将请求转发给本站点内部。
重定向
response.sendRedirect(target);
服务器告诉浏览器,你重新发起一个请求,去访问target这个链接。因为是客户端浏览器发起的,因此导航栏可以看到地址的变化。
重定向的工作过程是这样的:
因此,你可以看到sendRedirect
是response调用的,就是用response告诉客户端,让客户端重新向另一个连接发起请求。
因为是浏览器发起的新请求,所以前后两次访问的信息会丢失(request范围内),甚至可以指向任何资源,包括非当前站点,比如重定向到百度。