多個servlet之間的跳轉有兩種方式:
-
請求轉發:request.getRequestDispatcher(“轉發路徑”).forward(request, response);
-
響應重定向:response.sendRedirect("轉發路徑 ");
請求轉發:
@WebServlet("/direct/login") // @WebServlet註解相當於web.xml文件
public class CheckLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(1 == 1){
// 請求轉發
request.getRequestDispatcher("/direct/index").forward(request,response);
}
}
}
@WebServlet("/direct/index") // @WebServlet註解相當於web.xml文件
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("<h1>This is index page</h1>");
}
}
請求轉發原理:
-
請求轉發是服務器跳轉,瀏覽器只產生一次請求
-
請求轉發語句:request.getRequestDispatcher().forward()
請求轉發執行流程:瀏覽器發送一個請求到tomcat服務器,tomcat中CheckLoginServlet
對請求進行處理,當CheckLoginServlet中調用了request.getRequestDispatcher().forward()
方法後,就會將該請求(HttpServletRequest對象)原封不動的發送給IndexServlet
,當indexServlet處理完該請求後產生的響應,將響應的結果返回給瀏覽器。這裏我們可以看到瀏覽器地址欄的URL地址沒有發生變化,證明瀏覽器只產生了一次請求。
響應重定向轉發:
@WebServlet("/direct/login") // @WebServlet註解相當於web.xml文件
public class CheckLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(1 == 1){
// 響應重定向
response.sendRedirect("/direct/index");
}
}
}
@WebServlet("/direct/index") // @WebServlet註解相當於web.xml文件
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("<h1>This is index page</h1>");
}
}
響應重定向原理:
-
響應重定向是瀏覽器端跳轉,會產生兩次請求
-
響應重定向語句:response.sendRedirect()
響應重定向執行流程:瀏覽器發送一個請求到tomcat服務器,tomcat中CheckLoginServlet
對請求進行處理,當CheckLoginServlet中調用了response.sendRedirect()
方法後,會馬上返回一個響應給瀏覽器。然後瀏覽器會重寫發送一個請求給IndexServlet
,(注意這個請求和瀏覽器發送的第一個請求沒有任何關聯),當indexServlet處理完該請求後產生的響應,將響應的結果返回給瀏覽器。這裏我們可以看到瀏覽器地址欄的URL地址發生了變化,證明瀏覽器產生了兩次請求。