Servlet:请求转发和重定向

410 阅读1分钟

一、请求转发(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.运用场景
    • 转发一般用于用户登录,根据角色转发到相应的模块,而重定向一般用于用户注销登录时返回主页或跳转到其它网站等;