转发和重定向
理解:
都是用于Servlet之间跳转
的技术。只是一个发生在服务器端
,一个发生在客户端
。
(请求)转发
转发功能,找HttpServletRequest对象。
HttpServletRequest
是请求域对象
HttpServletRequest对象,也能作为 “域对象” 存取数据。
涉及的方法,跟ServletContext一致:
java.lang.Object getAttribute(java.lang.String name)
返回具有给动名字的 servlet container 的属性,或者当没有具有所给名字的属性时,返回一个空值。
java.util.Enumeration getAttributeNames()
返回一个包含servlet context中属性名字变量的集合.
void removeAttribute(java.lang.String name)
从请求消息中删除一个属性。
void setAttribute(java.lang.String name, java.lang.Object o)
存储一个请求消息中的属性。
注意: 请求域中存储的数据,仅限于当前HTTP请求。
getRequestDispatcher
指定的是 服务器端路径
用于表示 目标Servlet的映射地址
forward 方法
表示转发 , 要使用相同的请求 和 响应对象。
req.getRequestDispatcher("/to").forward(req, resp);
图解:
(响应)重定向
重定向功能,找HttpServletResponse对象。
处理完成以后,要重定向
到 另一个Servlet中
sendRedirect 方法
就是重定向
注意: 它里面的路径是客户端路径(要带项目名) /0729/to
resp.sendRedirect(req.getContextPath()+"/to");
自己实现的重定向:
resp.setStatus(302);
resp.addHeader(“Location”, req.getContextPath()+"/to");
图解:
转发和重定向的区别
- 转发发生在
服务器端
,而重定向发生在客户端
- 转发是
一次请求,一次响应
。而重定向是两次请求两次响应
。
将来会学到请求域对象,意味着重定向不能用请求域传值。
- 转发只能在
项目内部
进行转发
。而重定向可以是任意位置
(包括站外)
- 转发时,客户端感知不到(
地址栏不变
)。而重定向时浏览器的地址栏
会发生改变
。