刚接触javaweb遇到了转发与重定向的问题,在这里总结一下:
总结分三步:1、用法;2、转发与重定向的实现原理;3、不同实现方式引发的区别;
一:用法
1、servlet中的用法:
转发:request.getRequestDispatcher("2.jsp").forward(request,response);//转发到2.jsp
重定向:response.sendRedirect("2.jsp");//重定向到2.jsp
2、jsp中的用法:
转发:<jsp:forward page="2.jsp"/>
重定向:<%response.sendRedirect("2.jsp");/>
二:实现原理
转发:
客户浏览器发送http请求---web服务器接受此请求后调用内部的一个方法在容器内部完成请求处理和转发动作----将目标资源发送给客户。
它只能在同一个web应用中使用,可以共享request范围内的数据。
重定向:
客户浏览器发送http请求---web服务器接收后响应要求客户浏览器发送一个新的http请求----客户端浏览器接受此响应后在发送一个新的http请求到服务器----服务器根据此请求寻找资源并发送给客户。它可以重定向到任意URL,不能共享request范围内的数据。
三:区别
1:重定向访问服务器两次,转发只访问服务器一次;
2:重定向可以看见目标页面的URL,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的;
3:重定向还会执行跳转后的代码,转发之后的代码不会执行;
4:重定向后request发生改变;(注:RequestDispatcher.forward 方法的调用者与被调用者之间共享相同的request 对象和response 对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect 方法调用者与被调用者使用各自的request 对象和response 对象,它们属于两个独立的访问请求和响应过程。)
5:重定向可以访问自己web应用以外的资源