1. 程式人生 > >javaweb之請求轉發和請求包含

javaweb之請求轉發和請求包含

·關於請求轉發和請求包含我們首先得知道無論是請求轉發還是請求包含,都表示由多個Servlet共同來處理一個請求。

  例如Servlet1來處理請求,然後Servlet1又轉發給Servlet2來繼續處理這個請求。下面用例子測試下:

 -----請求轉發

在AServlet中,把請求轉發到BServlet:

public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("AServlet");
		RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
		rd.forward(request, response);
	}
}

public class BServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("BServlet");
	}
}

結果:

Aservlet

BServlet

 -----請求包含

在AServlet中,把請求包含到BServlet:

public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("AServlet");
		RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
		rd.include(request, response);
	}
}

public class BServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("BServlet");
	}
}

結果:

Aservlet

BServlet

請求轉發與請求包含比較

1.如果在AServlet中請求轉發到BServlet,那麼在AServlet中就不允許再輸出響應體,即不能再使用response.getWriter()和response.getOutputStream()向客戶端輸出,這一工作應該由BServlet來完成;如果是使用請求包含,那麼沒有這個限制;

2.請求轉發雖然不能輸出響應體,但還是可以設定響應頭的,例如:response.setContentType(”text/html;charset=utf-8”);

3.請求包含大多是應用在JSP頁面中,完成多頁面的合併;

4.請求請求大多是應用在Servlet中,轉發目標大多是JSP頁面

最後來比較一下請求轉發與重定向:

--- 請求轉發是一個請求,而重定向是兩個請求;

--- 請求轉發後瀏覽器位址列不會有變化,而重定向會有變化,因為重定向是兩個請求;

---請求轉發的目標只能是本應用中的資源,重定向的目標可以是其他應用;

---請求轉發對AServlet和BServlet的請求方法是相同的,即要麼都是GET,要麼都是POST,因為請求轉發是一個請求;

---重定向的第二個請求一定是GET。