重定向
什么是重定向
服务器发送一个302状态码及一个Location消息头(值是一个地址,称为重定向地址),通知浏览器立即向重定向地址发请求。
- 浏览器请求服务器地址A(servletA)
- 服务器解析地址A(servletA)请求,返回302状态码、一个Location消息头值存放地址B(servletB)
- 浏览器拿到返回信息,解析出Location=地址B。
- 浏览器请求地址B(servletB)。
如何重定向
使用response.sendRedirect(String url);
注意两个问题
1)重定向之前,不要调用out.close();会报错!
out.println("添加成功");//能看到这个输出!(如果不写这个输出,则响应为空白页)
out.close();
response.sendRedirect("list");//看不到重定向结果!
2)重定向之前,服务器会先清空response对象上缓存的数据。Servlet只允许同时发送一个响应。
out.println("添加成功");//看不到这个输出!缓存数据被清空(响应一)
response.sendRedirect("list");//能看到重定向结果!(响应二)
out.close();
重定向的特点
- 重定向是两次请求。
- 重定向之后,浏览器地址栏的地址会变成重定向地址。
- 重定向的地址是任意的(前提要存在否则报404)。
何时用重定向
1)比如用户作删除操作时,删除操作已做完,重定向访问list.do
转发
什么是转发
服务器内部servlet将请求转发到另外的servlet方法中,由其他servlet进行处理并返回结果。
- 浏览器请求服务器地址A(servletA)
- 服务器解析地址A请求(servletA),将request内容一并请求至地址B(servletB)
- 由地址B(servletB)完成请求处理,并返回结果
- 浏览器拿到结果response
如何转发
@RequestMapping("demo")
public void demo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/list").forward(request, response);
}
转发的特点
- 转发是一次请求,访问了多个servlet
- 转发之后,地址栏不变
- 转发所涉及的各个Web组件可以共享同一个request对象和response对象
何时用转发
1)用户调用list.do
2)有ListServlet到数据库查询数据
3)ListServlet将查询到的结果通过Servlet引擎(通信模块)转发给负责显示的empList.jsp
4)empList.jsp将数据通过友好的界面显示给用户,比如用户作删除操作时,删除操作已做完,重定向访问list.do
转发和重定向的区别
1)转发的目的地只能是同一个应用内部某个组件的地址,而重定向的目的地是任意的。
2)转发之后,浏览器地址栏的地址不变,而重定向会变。
3)转发所涉及的各个Web组件可以共享request对象,而重定向不可以。
4)转发是一件事情未做完,而重定向是一件事情已经做完。
网友评论