最近直接被安排前后端,前端jsp。。。必须要知道实现页面跳转的两种方式的区别和联系:即转发和重定向的区别。
1.重定向访问过程结束后,浏览器地址栏中显示的URL会发生变化;
转发过程结束后,浏览器地址栏保持初始的URL地址不变。
这个栗子简直不要太形象:
HttpServletResponse.sendRedirect重定向过程,就好比“浏览器”写信找张三借钱,张三回信说没钱,让他找李四借,并告诉了李四的地址,浏览器又写信找李四借钱,李四收到信后把钱汇给了“浏览器”。
由此可见,重定向的时候,“浏览器”一共发出了两封信和收到了两次回复,“浏览器”也知道他借到的钱出自李四之手。
request.getRequestDispatcher().forward()转发过程,就好比“浏览器”写信向张三借钱,张三没钱,找李四借了钱,甚至可以自己加上一些钱(转发信息不会丢失,重定向会丢失),然后汇给“浏览器”。
由此可见,转发的时候,“浏览器”只发 出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。
2.response.sendRedirect()方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程;request.getRequestDispatcher().forward()方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;
不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用response.sendRedirect()方法。
对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用request.getRequestDispatcher().forward()方法。
3.转发是服务器行为,重定向是客户端行为;转发是要比重定向快,因为重定向需要经过客户端,而转发没有。