什么是转发与重定向
日常我们使用浏览器最常用的就是在不同的页面中跳转,而在Servlet
中的页面跳转使用的就是转发和重定向,也可以简单的认为转发和重定向就是实现页面的跳转,但是肯定是有区别的
转发
request.getRequestDispatcher("xxx.jsp").forward(request,response);
这个例子就是一个简单携带request和response的转发,从这句代码分析我们可以得知,这个转发需要request对象
,我们加入源码查看.getRequestDispatcher(String path)
这个方法的返回值是一个RequestDispatcher对象,百度得知这个类是一个Web资源包装器,查看源码发现有两个方法forward()
和include()
(那肯定是主要介绍forward()方法哈,有兴趣可以自行百度两个方法的详解)forward()
用来转发request和response给指定的web资源,看到这里应该对这个代码有了一点理解了,首先将web资源路径传递到RequestDispatcher对象中,再调用forward方法将request和response一起传递给指定的web资源,实现携带请求转发
重定向
response.sendRedirect("https://www.baidu.com");
实现简单的重定向,本质也是跳转
共同点
本质都是实现页面的跳转
不同点
- 地址栏
- 转发的地址栏不会改变由于转发是在服务端进行的,浏览器并不知道,所以只会显示浏览器请求的页面地址
- 重定向的地址栏会改变,跳转发送在客户端
- 请求次数
- 转发没有产生新的请求,是同一个请求
- 重定向产生了新的请求
- request域
- 转发由于是同一个请求,所以request域不变
- 重定向request域发生改变
- 跳转范围
- 转发只限制在当前web项目中
- 重定向没有限制,任何web资源(包括网络上的web资源)
- 跳转方式
- 转发使用
RequestDispatcher
对象的forward()
- 重定向用
response.sendRedirect()
- 转发使用
转发与重定向的浅层原理
转发原理
重定向原理
-
什么时候用转发,什么时候用重定向?
当我们需要携带数据存进request域中保存,跳转界面读取request域中的数据,这个时候我们需要用到转发。
不需要携带数据,只进行请求处理并不暴露Servlet进行跳转,可以用重定向
判断什么时候用转发还是重定向可以从以下几点判断
- request域
- 地址栏
当然这只是一个参考,具体业务具体分析,还需要注意的是无论是转发还是重定向,后续代码还是会运行,并不会跳转而停止,除非手动return