一、请求转发(Forward)
1-1.含义
是服务器跳转行为
1-2.特点
- url地址栏不会变化;
- request前和request后,用同一个request
- 会将request的信息带到被定向的Servet或JSP中使用(request对象可以实现数据会共享)
- 只会产生一次请求
1-3 图解
//ForwardDemo
public class ForwardDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name", "zs");
resp.setContentType("text/html;charset=utf-8");
req.getRequestDispatcher("/otherForward").forward(req, resp);
}
}
//OtherForward
public class OtherForward extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name =(String) req.getAttribute("name");
resp.getWriter().println(name); //zs
}
}
二、重定向(Redirect)
2-1.含义
是浏览器跳转行为
2-2 特点
- url地址栏变化
- request前和request后,不是同一个request
- request前和request后的数据不会共享
- 会产生两次请求
2-3 图解
//RedirectDemo
public class RedirectDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name", "zs");
resp.setContentType("text/html;charset=utf-8");
resp.sendRedirect("/web03/otherRedirect");
}
}
//OtherRedirect
public class OtherRedirect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name =(String) req.getAttribute("name");
resp.getWriter().println(name);//null
}
}
三、请求转发和重定向的区别
- 1.本质的区别:
- 转发是服务器跳转行为,而重定向是浏览器跳转行为;
- 2.URL地址栏显示
- 转发的URL地址栏无变化,而重定向的URL地址栏变化的;
- 3.数据共享
- 转发共享request里面的数据,而重定向则不能共享数据;
- 4.效率
- 转发效率高,而重定向效率低;
- 5.运用场景
- 转发一般用于用户登录,根据角色转发到相应的模块,而重定向一般用于用户注销登录时返回主页或跳转到其它网站等;