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頁面