getRequestDispatcher是服務器內部跳轉,地址欄信息不變,只能跳轉到web應用內的網頁。
sendRedirect是頁面重定向,地址欄信息改變,可以跳轉到任意網頁。
這兩條網上都查得到,但看着比較亂,現提供我測試的結果(僅供參考):
1.getRequestDispatcher分成兩種,可以用request調用,也可以用getServletContext()調用
不同的是request.getRequestDispatcher(url)的url可以是相對路徑也可以是絕對路徑。
而this.getServletContext().getRequestDispatcher(url)的url只能是絕對路徑。
sendRedirect是頁面重定向,地址欄信息改變,可以跳轉到任意網頁。
這兩條網上都查得到,但看着比較亂,現提供我測試的結果(僅供參考):
1.getRequestDispatcher分成兩種,可以用request調用,也可以用getServletContext()調用
不同的是request.getRequestDispatcher(url)的url可以是相對路徑也可以是絕對路徑。
而this.getServletContext().getRequestDispatcher(url)的url只能是絕對路徑。
注:request.getRequestDispatcher(url)之所以可以使用相對路勁,是因為在getRequestDispatcher(url)方法中封裝了ServletContext.getRealPath()以獲得相應的項目根路徑,再通過字符串相加,從而可以獲得一個完整的路徑
- SecondServlet
- request.setAttribute("lover", "tom");
- request.getSession().setAttribute("lovered", "joe");
- request.getRequestDispatcher("/third?name=jay").forward(request, response);
- 或
- request.getRequestDispatcher("third?name=jay").forward(request, response);
- 或
- this.getServletContext().getRequestDispatcher("/third?name=jay").forward(request, response);
- ThirdServlet
- PrintWriter out = response.getWriter();
- String name = request.getParameter("name");
- out.println(request.getContextPath()+"<hr/>");
- out.println("name="+name+"<hr/>");
- out.println("lover="+request.getAttribute("lover")+"<hr/>");
- out.println("lovered="+request.getSession().getAttribute("lovered")+"<hr/>");
結果顯示,地址欄信息仍為http://localhost:8080/Test/second,這三種方式都可以傳值到第二個Servlet。
2.sendRedirect只能用response調用,可以用相對路徑(直接用),也可以用相對路徑(需加應用路徑)
- SecondServlet
- request.setAttribute("lover", "tom");
- request.getSession().setAttribute("lovered", "joe");
- response.sendRedirect("third?name=jay");
- 或
- response.sendRedirect(request.getContextPath()+"/third?name=jay");
- ThirdServlet
- PrintWriter out = response.getWriter();
- String name = request.getParameter("name");
- out.println(request.getContextPath()+"<hr/>");
- out.println("name="+name+"<hr/>");
- out.println("lover="+request.getAttribute("lover")+"<hr/>");
- out.println("lovered="+request.getSession().getAttribute("lovered")+"<hr/>");
結果顯示,地址欄信息變為http://localhost:8080/Test/third?name=jay,只有request.getAttribute("lover")獲取不到值,session范圍及url路徑后的傳值在第二個Servlet都可以獲取到值。
- response.sendRedirect("http://www.baidu.com");