请求转发和重定向
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");
}
}
输出结果