請求轉發和響應重定向
概述
什么是請求轉發和響應重定向
-
請求轉發和響應重定向是web應用中間接訪問項目資源的兩種手段,也是Servlet控制頁面跳轉的兩種手段
-
請求轉發通過HttpServletRequest實現,響應重定向通過HttpServletResponse實現
-
請求轉發生活舉例: 張三找李四借錢,李四沒有,李四找王五,讓王五借給張三
-
響應重定向生活舉例:張三找李四借錢,李四沒有,李四讓張三去找王五,張三自己再去找王五借錢
請求轉發
請求轉發特點(背誦)
-
請求轉發通過HttpServletRequest對象獲取請求轉發器實現
-
請求轉發是服務器內部的行為,對客戶端是屏蔽的
-
客戶端只發送了一次請求,客戶端地址欄不變
-
服務端只產生了一對請求和響應對象,這一對請求和響應對象會繼續傳遞給下一個資源
-
因為全程只有一個HttpServletRequset對象,所以請求參數可以傳遞,請求域中的數據也可以傳遞
-
請求轉發可以轉發給其他Servlet動態資源,也可以轉發給一些靜態資源以實現頁面跳轉
-
請求轉發可以轉發給WEB-INF下受保護的資源
-
請求轉發不能轉發到本項目以外的外部資源
請求轉發測試代碼 ?
ServletA
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求轉發器// 轉發給servlet okRequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");// 轉發給一個視圖資源 ok//RequestDispatcher requestDispatcher = req.getRequestDispatcher("welcome.html");// 轉發給WEB-INF下的資源 ok//RequestDispatcher requestDispatcher = req.getRequestDispatcher("WEB-INF/views/view1.html");// 轉發給外部資源 no//RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.atguigu.com");// 獲取請求參數String username = req.getParameter("username");System.out.println(username);// 向請求域中添加數據req.setAttribute("reqKey","requestMessage");// 做出轉發動作requestDispatcher.forward(req,resp);}
}
ServletB
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求參數String username = req.getParameter("username");System.out.println(username);// 獲取請求域中的數據String reqMessage = (String)req.getAttribute("reqKey");System.out.println(reqMessage);// 做出響應resp.getWriter().write("servletB response"); }
}
響應重定向
響應重定向運行邏輯圖
響應重定向特點(背誦)
-
響應重定向通過HttpServletResponse對象的sendRedirect方法實現
-
響應重定向是服務端通過302響應碼和路徑,告訴客戶端自己去找其他資源,是在服務端提示下的,客戶端的行為
-
客戶端至少發送了兩次請求,客戶端地址欄是要變化的
-
服務端產生了多對請求和響應對象,且請求和響應對象不會傳遞給下一個資源
-
因為全程產生了多個HttpServletRequset對象,所以請求參數不可以傳遞,請求域中的數據也不可以傳遞
-
重定向可以是其他Servlet動態資源,也可以是一些靜態資源以實現頁面跳轉
-
重定向不可以到給WEB-INF下受保護的資源
-
重定向可以到本項目以外的外部資源
響應重定向測試代碼
?ServletA
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求參數String username = req.getParameter("username");System.out.println(username);// 向請求域中添加數據req.setAttribute("reqKey","requestMessage");// 響應重定向// 重定向到servlet動態資源 OKresp.sendRedirect("servletB");// 重定向到視圖靜態資源 OK//resp.sendRedirect("welcome.html");// 重定向到WEB-INF下的資源 NO//resp.sendRedirect("WEB-INF/views/view1");// 重定向到外部資源//resp.sendRedirect("http://www.atguigu.com");}
}
?ServletB
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取請求參數String username = req.getParameter("username");System.out.println(username);// 獲取請求域中的數據String reqMessage = (String)req.getAttribute("reqKey");System.out.println(reqMessage);// 做出響應resp.getWriter().write("servletB response");}
}
打開瀏覽器,輸入以下url測試
http://localhost:8080/web03_war_exploded/servletA?username=atguigu
PS:來源尚硅谷