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。

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