当前位置: 首页 > >

重定向和请求转发的区别

发布时间:

请求转发和重定向

1、请求转发是tomcat服务器内部的跳转,所以浏览器的地址栏的地址不会发生变化,不会丢失request对象
2、重定向地址栏会发生变化,会产生两次请求,消耗资源大,效率很低,而且还会丢失request对象。


用代码展示

1、请求转发的Servlet


/**
* 转发的Servlet
* @author 紫炎易霄
*/
@WebServlet("/forwardServlet")
public class ForwardServlet extends HttpServlet{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求转发
req.setAttribute("username", "紫炎易霄");
//请求转发到数据打印中心
req.getRequestDispatcher("/dataPrint").forward(req, resp);
}
}

2、重定向的Servlet


/**
* 重定向的Servlet
* @author 紫炎易霄
*/
@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("username", "紫炎易霄");
//重定向
resp.sendRedirect(this.getServletContext().getContextPath()+"/dataPrint");
}
}

3、打印数据的Servlet


/**
* 打印请求转发和重新向中的username数据
* @author 紫炎易霄
*/
@WebServlet("/dataPrint")
public class DataPrintCenter extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//拿到request对象中的数据
String username = (String) req.getAttribute("username");
System.out.println(username);
}
}

请求转发打印结果

重定向的结果

值得一提的是重定向的实现原理


/**
* 重定向
* @author 紫炎易霄
*/
@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向的实现原理
resp.setStatus(302);
resp.setHeader("Location", this.getServletContext().getContextPath()+"/dataPrint");
}
}

输出结果



友情链接: