Servlet 请求转发和重定向

servlet中的请求转发和重定向都是对资源的请求,以前对这两者的区分比较模糊,于是查阅了一些资料,再结合一两个实例,终于在脑海里有了比较明确的区分。

请求转发:
request.getRequsetDispatcher().forward(requset,response),是一种服务器行为,转发时request对象会被保存,也就是说被转发到的另外一个servlet或其他资源中的request对象,跟请求转发的request是通一个对象。又由于这个过程是服务端行为,所以客户端的地址栏不会发生改变。

重定向
response.sendRedirect(url),是一种客户端行为,实际上期间发生的是两次请求,前一次的请求request对象不会作保存,且地址栏地址会发生改变。

现在来看看一个例子:

假设TestServlet是要请求的资源
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Test servlet is showing!");
        System.out.println("my name is : "+ request.getAttribute("name"));
    }

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

}

请求转发servlet:TestForwardServlet

@WebServlet("/TestForwardServlet")
public class TestForwardServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    public TestForwardServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("forward servlet is showing!");
        request.setAttribute("name", "licha");
        System.out.println("my name is : "+request.getAttribute("name"));
        request.getRequestDispatcher("/TestServlet").forward(request, response);
    }

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

}

重定向servlet:TestRedirectServlet

@WebServlet("/TestRedirectServlet")
public class TestRedirectServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("redirect servlet is showing!");
        request.setAttribute("name", "John");
        System.out.println("my name is : "+request.getAttribute("name"));
        response.sendRedirect("TestServlet");
    }

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

}

启动tomcat服务器,先试一下请求转发,在地址栏输入http://localhost:8080/TestSpringmvc/TestForwardServlet ,控制台的输出为:
这里写图片描述

再试一下重定向的例子,在地址栏输入:http://localhost:8080/TestSpringmvc/TestRedirectServlet ,控制台输入为:
这里写图片描述

可见,两者主要体现有两点不同:
1、转发的地址栏url还是原来的http://localhost:8080/TestSpringmvc/TestForwardServlet ,而重定向的地址栏url变成http://localhost:8080/TestSpringmvc/TestServlet
2、TestForwardServlet 中request对象中的属性name跟TestServlet中的一样,说明TestForwardServlet 中的request对象被保存并传到TestServlet。对比之下TestRedirectServlet 中request对象中的属性name并没有传到TestServlet中,因为TestServlet的request对象name属性为null。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章