javaweb之request請求轉發forward方法的細節

package test.request;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//request請求轉發時forward方法的細節,客戶端只發一次請求,而服務器端有多個資源調用,地址欄不會發生變化
/*
 * 	1.	forward方法用於將請求轉發到RequestDispatcher對象封裝的資源,
 *	2.	如果在調用forward方法之前,在servlet程序中寫入的部分內容已經被真正的傳送到了客戶端(調用了flush或者close方法),
 *		forward方法將拋出IllegalStateException異常
 *	3.	如果在調用forward方法之前向Servlet引擎的緩衝區(response)中寫入了內容,
 *		只要寫入到緩衝區的內容還沒有被真正輸出到客戶端,forward方法就可以被正常執行,
 *		原來寫入到緩衝區中的內容將被清空,但是,以寫入到HttpServletResponse對象中的響應頭字段信息保持有效
 */
public class RequestDemo6 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		test3(request, response);
	}
	//細節3
	private void test3(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		String date = "aaaaaa";
		PrintWriter print = response.getWriter();
		print.write(date);
		//以下代碼不會出現問題,但是上面的date是不能在頁面輸出的,頁面中只能看見index.jsp的內容
		request.getRequestDispatcher("/index.jsp").forward(request, response);
	}
	//細節2,轉發了好多次,避免這個問題,forward之後要return
	private void test2(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String date = "aaaaaa";
		if(true) {
			//幾百行代碼
			request.getRequestDispatcher("/index.jsp").forward(request, response);
			//return;   //跳轉之後一定要記得return
		}
		//幾百行代碼
		// 以下代碼將出現:java.lang.IllegalStateException: Cannot forward after response has been committed
		//上面已經轉發一次了
		request.getRequestDispatcher("/index.jsp").forward(request, response);
	}
	//細節2
	private void test1(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		String date = "aaaaaa";
		PrintWriter print = response.getWriter();
		print.write(date);
		print.flush();//print.close();
		// 以下代碼將出現:java.lang.IllegalStateException: Cannot forward after response has been committed
		request.getRequestDispatcher("/index.jsp").forward(request, response);
	}

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

}


index.jsp就是一個最原始的jsp頁面

發佈了58 篇原創文章 · 獲贊 26 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章