跳轉和重定向
有的時候客戶端請求到達服務端后需要對請求重新轉發到其它Servlet甚至別的服務器,這就需要跳轉和重定向。
區別
一般來說,跳轉是服務器內部跳轉,例如將請求從一個Servlet轉發給另外一個Servlet處理,是內部之間的轉發。而重定向是告訴客戶端去別的地方請求資源。舉個例子,某人需要去找人事部門打印收入證明,而收入證明需要去財務部蓋章。跳轉的處理方式是:人事部門的人告訴你,你等一下,我去把收入證明打印出來,然后我再去找財務部蓋章,所有資料准備好后,我再全部交給你。重定向的處理方式是:人事部門把收入流水給你打印出來,然后告訴你說,他們的工作已經做完了,現在需要你自己去找財務部蓋章。
這就是跳轉和重定向的本質區別,服務器跳轉的時候,客戶端地址欄不改變,而客戶端重定向的時候,地址欄改變。
跳轉示例
跳轉需要用到RequestDispacher對象,該對象可以從HttpRequest或者ServletContext中獲取。
下面是從HttpRequest對象中調用getRequestDispacher()方法獲取RequestDispacher並跳轉示例代碼:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher rd = null; String region = req.getParameter("region"); System.out.println("region: " + region); switch (region) { case "asia": { System.out.println("asia~~~"); rd = req.getRequestDispatcher("/asiaHandler.jsp"); break; } case "emea": { System.out.println("emea~~~"); rd = req.getRequestDispatcher("/emeaHandler.jsp"); break; } case "ams": { System.out.println("ams~~~"); rd = req.getRequestDispatcher("/amsHandler.jsp"); break; } default: { System.out.println("default~~~"); rd = req.getRequestDispatcher("/html/error.html"); break; } }
try { rd.forward(req, resp); } catch (ServletException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} |
下面是從ServletContext對象中調用getNamedDispacher()方法獲取RequestDispacher對象並跳轉示例代碼:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher rd = null; ServletContext ctx = this.getServletContext(); String region = req.getParameter("region"); System.out.println("region: " + region); switch (region) { case "asia": { rd = ctx.getNamedDispatcher("AsiaHandler"); break; } case "emea": { rd = ctx.getNamedDispatcher("EmeaHandler"); break; } case "ams": { rd = ctx.getNamedDispatcher("AMSHandler"); break; } }
try { rd.forward(req, resp); } catch (ServletException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
下面演示了用ServletContext對象調用getRequestDispacher()方法獲取RequestDispacher對象,然后實現跳轉:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher rd = null; ServletContext ctx = this.getServletContext(); String region = req.getParameter("region"); System.out.println("region: " + region); switch (region) { case "asia": { rd = req.getRequestDispatcher("/asiaHandler.jsp"); break; } case "emea": { rd = req.getRequestDispatcher("/emeaHandler.jsp"); break; } case "ams": { rd = req.getRequestDispatcher("/amsHandler.jsp"); break; }
}
try { rd.forward(req, resp); } catch (ServletException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
請求重定向是服務器發給瀏覽器一個新的地址,讓瀏覽器去請求新的地址。重定向需要用到HttpResponse對象調用sendRedirect()方法。
重定向示例:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { try { resp.sendRedirect("http://www.bing.com"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |