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。