因为上一篇文章涉及到重定向与请求转发,现在这里加以说明:
1、重定向与请求转发均有两种使用方式:
方式一为在servlet中调用:
转发:request.getRequestDispatcher("index.jsp").forward(request, response);
重定向:response.sendRedirect("index.jsp");
方式二为在JSP中使用:
转发:<jsp:forward page="/WEB-INF/public/index.jsp"></jsp:forward>
或者:<%request.getRequestDispatcher("/WEB-INF/public/index.jsp").forward(request,response); %>
重定向:<%response.sendRedirect("new.jsp");%>
2、区别:
转发是服务器行为,重定向是客户端行为。二者的流程如下:
转发:浏览器发送http请求——>服务器接受请求——>服务器完成请求并转发——>将目标资源发送给客户。。。所以:转发request是由服务器执行的,可以传递数据,客户端只需要发出一次请求,因此地址栏并不变化。
重定向:浏览器发送http请求——>web服务器接受后发送302状态码及对应新的location给客户浏览器(相当于两句代码:response.setStatus(302);respopse.setHeader("Location","url"))——>客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是服务器发送过来的location地址——>服务器根据此请求寻找资源并发送给客户。。。所以:重定向response是由客户端执行的,并不能传递数据,客户端发出了两次请求,因此地址栏发生了变化。
3、举例:
重定向:我去A的家里找A借钱,A告诉我说他没有钱,并且告诉我B有钱,我可以去找B借钱。于是我从A家里离开去了B的家里找B借钱,最后我从B处借到了钱。{即重定向是两次请求}
请求转发:我去A的家里找A借钱,A告诉我说他也没有钱,但是他老婆有钱,但是A并没有直接让我去找他老婆借,而是跟他老婆说明了情况,最后他老婆把钱给了A,A把钱借给了我。{即请求转发是一次请求}