转发和重定向
1. 转发
1.1 什么是转发
一个web组件将未完成的处理通过容器交给另外一个web组件继续做
web组件指的是servlet或者是jsp
通常是一个servlet获得数据之后转发给一个jsp来展现
1.2 如何转发
-
绑定数据到请求对象上
//name:绑定名 //obj:绑定值 request.setAttribute(String name,Object obj); String request.getAttribute(String name);
-
获得转发器
//url是转发地址,通常是一个jsp RequestDispatcher rd = request.getRequestDispatcher(String url);
-
转发
rd.forward(request,response);
1.3 转发的特点
- 转发的地址是有限制的,要求属于同一个web应用。
- 转发之后,浏览器地址栏的地址不变
2. 重定向
2.1 什么是重定向
服务器通知浏览器向某个地址发送请求。
服务器可以通过发送302状态码及Location消息头(该消息头的值是一个地址,一般称之为重定向地址)给浏览器,浏览器收到之后,会立即向重定向地址发送请求
2.2 如何重定向
//url用来指定重定向地址
response.sendRedirect(String url);
2.3 重定向的一个细节
重定向之前,容器会先清空response对象上存放的所有数据
实体内容为空
3. 转发和重定向的区别
两种跳转获得对象的方式
//获得转发对象getRequestDispatcher()
HttpServletRequest(httpServletRequest).getRequestDispatcher
ServletContext.getRequestDispatcher();
//获得重定向对象sendRedirect()
HttpServletResponse(httpServletResponse).sendRedirect();
- 转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect()
- 转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变
- 转发是服务器行为,重定向是客户端行为
- 转发更高效。转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求的
- 转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)
- 请求转发的path只能是当前项目中的path,而重定向location可以是项目外的地址
4. 转发和重定向的选择
- 重定向的速度比转发慢,因为浏览器还得发出一个新的请求,所以如果在使用转发和重定向都无所谓的时候建议使用转发
- 因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了