重定向
服务器向浏览器发送一个302状态码以及一个Location消息头,浏览器收到返回消息会立即向重定向地址发出请求.
原理:
实现
response.sendRedirect(String url);
特点:
- 重定向地址可以是任意地址
- 重定向后浏览器的地址会发生变化
- web组件不会共享同一个request和response
- 至少两次请求
转发
一个web组件将未完成的处理通过容器转交给另外一个web组件继续完成;
如:一个组件获取数据后,将数据转发给另外一个jsp来展示这些数据
原理:
实现:
- 绑定数据到request对象
request.setAttribute(String name,Object obj);
- 获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String path);//path:目标url
- 转发
rd.forward(request,response);
特点:
- 浏览器地址栏不会发生变化,因为转发过程在服务器内部进行
- 转发的目标必须是同一个应用内部的某个地址
- 所涉及的web组件共享同一个request对象和response对象
- 转发后的语句也会执行
转发和重定向区别
转发 | 重定向 |
---|---|
服务器转向另一个新地址 | 浏览器获取响应后再发一次新的请求 |
一个请求对象,且共享数据 | 两次请求,不共享数据 |
地址栏不变 | 地址栏改变为新的地址 |
新地址必须是应用内部某个地址 | 可以是任意地址 |
路径问题
转发和重定向都会使用到url-路径,现有文件结构:
- 相对路径:从当前文件到目标文件的路径,如:
- current到target1: index2.jsp
- current到target2: ../d2/index.jsp
绝对路径:以一个固定位置作为起始位置到达目标位置,如:
- /scrollDemo/d1/index2.html
- /srcollDemo/d2/index.html
使用绝对路径时:
- 链接地址、表单提交、重定向是从应用名开始写
- 转发路径是从应用名之后开始写
- 获取应用路径 request.getContextPath()