sendRedirect和RequestDispatcher的區(qū)別?
sendRedirect和RequestDispatcher的區(qū)別:
馬克- to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。
馬克-to-win:response.sendRedirect()與request.getRequestDispatcher().forward ()區(qū)別:response.sendRedirect(url)是先回到客戶端,再重新請求url,和過去的請求沒關(guān)系。可以訪問任何地方。瀏覽器的地址欄也變成了新的url。request.getRequestDispatcher().forward()就干脆沒回到客戶端,就一直在服務(wù)器里,從本個web應(yīng)用的一個資源(servlet,jsp,或html)跳到另一個資源。(所以不能隨便訪問什么地方)。而且瀏覽器地址欄沒有變。同時可以用request.setAttribute("requestkey","requstvalue1");來傳遞參數(shù)。
以上幾點是大家經(jīng)常談到的幾點不同。底下就是我專門(exclusively)寫給大家的,一點不
同。也許初學(xué)者難于理解,望留點印象。
RequestDispatcher會block,因為同在服務(wù)器端。當程序需要從資源1跳到資源2時,資源1
會等資源2運行完,回來以后,再繼續(xù)執(zhí)行下面沒執(zhí)行的部分。所謂的block。
例:3.4.1
package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello1 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletHello1 before");
request.getRequestDispatcher("/ServletHello2").forward(request,
response);
System.out.println("這里會block5秒,ServletHello1 after");
}
}
package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello2 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ServletHello2");
}
}
當運行ServletHello1時,console的輸出是:
ServletHello1 before
ServletHello2
這里會block5秒,ServletHello1 after
換做response做實驗:
例:3.4.2
package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello1 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletHello1 before");
//request.getRequestDispatcher("/ServletHello2").forward(request,response);
response.sendRedirect("http://localhost:8080/ServletHello/ServletHello2");
System.out.println("這里不會block5秒,立即運行ServletHello1 after");
}
}
package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello2 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ServletHello2");
}
}
內(nèi)置瀏覽器有bug,換成火狐以后實驗:
地址欄輸入: localhost:8080/ServletHello/MarkToWinServlet
eclipse的console內(nèi)的輸出結(jié)果是:
ServletHello1 before
這里不會block5秒,立即運行ServletHello1 after
ServletHello2