请求转发 —— HttpServletRequest.getRequestDispatcher.forward(hreq,hresp)
————————ServletContext.getRequestDispatcher().forward(hreq,hresp)
重定向 —— HttpServletResponse.sendRedirect
绿色 请求转发 HttpServletRequest.RequestDispatcher.forward:
叫“浏览器”的人写信找servlet借钱,
servlet没有钱,
于是servlet找index.jsp借了一些钱,
甚至还可以加上自己的一些钱,
然后再将这些钱汇给了“浏览器”。
可见,“浏览器”只发 出了一封信和收到了一次回复,
他只知道从servlet那里借到了钱,并不知道有一部分钱出自index.jsp之手。
【在服务器端内部将请求转发给另外一个资源index.jsp,
"浏览器"只知道发出了请求并得到了响应结果,
并不知道在服务器程序内部发生了转发行为。】
红色 响应重定向 HttpServletResponse.sendRedirect:
有个叫“浏览器”的人 写信找servlet借钱,
servlet回信说没有钱,让“浏览器”去找index.jsp借,
并将index.jsp现在的通信地址告诉给了“浏览器”。
于是,“浏览器”又按servlet提供通信地址给index.jsp写信借钱,
index.jsp收到信后就把钱汇给了“浏览器”。
可见,“浏览器”一共发出了两封信和收到了两次回复,
“浏览器”也知道他借到的钱出自index.jsp之手。
小结:
1.转发:服务器行为 重定向 :客户端行为;
2.转发:浏览器URL的地址栏不变 重定向:浏览器URL的地址栏改变;
3.转发:浏览器只做1次访问请求,得到1次响应 重定向:浏览器做了至少2次的访问请求,得到至少2次响应;
4.转发:传输信息不丢失 重定向:传输信息丢失【在Spring3.1版本以后,我们可以通过Flash属性,解决重定向时传值丢失的问题。详见https://blog.csdn.net/liubin5620/article/details/79922692】
5.转发 快于 重定向【毕竟重定向 还得要浏览器再发请求】
——so 当2个都可用时优选 转发
6.转发 仅可访问 当前web的程序
——so 当访问外部web只能选 重定向