Servlet转发和重定向区别

转发(forward)

1.新建AServlet通过转发器转发到BServlet:

@WebServlet(name = "AServlet", urlPatterns = "/AServlet")
public class AServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //转发到Bservlet
        request.getRequestDispatcher("BServlet").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2.新建BServlet,输出到网页

@WebServlet(name = "BServlet",urlPatterns = "/BServlet")
public class BServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("this is Bservlet");
    }

结果:
结果显示 ip地址栏并未发生改变

在这里插入图片描述

重定向(sendRedirect):

1.新建AServlet重定向到BServlet

@WebServlet(name = "AServlet", urlPatterns = "/AServlet")
public class AServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //重定向到BServlet
        response.sendRedirect("BServlet");
    }

结果:
我们可以看到ip地址栏发生了改变
在这里插入图片描述

总结:

1.请求转发之间是共享同一个request(一次请求)
原理:当浏览器向服务器请求AServlet时,tomcat服务器会指向Aservlet,之后内部转发(Fword)到BServlet

我们在AServlet中保存一个键值对转发到BServlet中,会发现在BServlet中可以拿到键值对的值:

在这里插入图片描述

在这里插入图片描述

2.重定向servlet之间有各自独立的request对象**(两次请求)
原理:当浏览器向服务器请求AServlet时,tomcat服务器会指向AServlet中,通过SendREdirect重定向至BServlet,此时服务器会向客户端返回一为302的状态码,要求客户端重新请求BServlet,客户端会再次发送请求BServlet;
我们同样的保存键值对后重定向到BServlet中发现拿不到键值对的值:

在这里插入图片描述
在这里插入图片描述


版权声明:本文为jefferyfg原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。