一:RequestDispatcher.forward()
是在服務器端起作用,當使用forward()時,Servlet engine 傳遞HTTP請求從當前的Servlet or jsp 到另外一個Servlet JSP 或普通HTML文件
可以進行參數傳遞 如:
RequestDispatcher rd = context.getRequestDispatcher("/jsp/forward.jsp?name=zhangsan");
RequestDispatcher rd = context.getRequestDispatcher("/F?name=jingjing");
重定向後浏覽器地址欄URL不變
<p> 例:在servlet中進行重定向</p><p> </p><pre class="java" name="code">public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
ServletContext context = getServletContext();
//forward()到jsp
RequestDispatcher rd = context.getRequestDispatcher("/jsp/forward.jsp?name=zhangsan");
//forward()到令一個servlet F為servlet的url-pattern servlet也可進行參數傳遞
//RequestDispatcher rd = context.getRequestDispatcher("/F?name=jingjing");
request.setAttribute("info", "hello"); //參數傳遞
rd.forward(request, response);
}
路徑前必須帶有"/" ,"/"的含義時項目名稱 否則報如下異常:
java.lang.IllegalArgumentException: Path F does not start with a "/" character
com.org.MyServlet.doGet(MyServlet.java:31)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
在forward.jsp中取得參數為:
String name = request.getParameter("name");
在servlet中取得參數為:
<pre class="java" name="code"> String name = request.getParameter("name");
String info = (String)request.getAttribute("info");
二:response.sendRedirect()
是在用戶的浏覽器端工作,sendRedirect() 可以帶參數傳遞,比如servlet?name=zhangsan
重定向後在浏覽器地址欄上會出現重定向頁面的URL
例:重定向jsp
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.sendRedirect("jsp/forward.jsp");
//可傳參
//response.sendRedirect("jsp/forward.jsp?name=zhangsan");
重定向servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.sendRedirect("F");
//可傳遞參數
//response.sendRedirect("F?name=zhagnsan");
}
比較:
a) 兩個都可以實現頁面的跳轉forward是容器中控制權的轉向,在客戶端浏覽器地址欄中不會顯示出轉向後的地址
response.sendRedirect()則是完全的跳轉,浏覽器將會得到跳轉的地址,並重新發送請求鏈接,這樣,從浏覽器的地址欄中可以看到跳轉後的鏈接地址
b) 兩者都可以跳轉到jsp或者servlet 都可以傳遞參數
但response.sendRedirect()跳轉後後面的代碼將不會再執行
例:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("hello kity"); //不會輸出
response.sendRedirect("F?name=zhagnsan");
out.println("good"); //不會輸出
}
前者更加高效,在前者可以滿足基本需要時,盡量使用RequestDispatcher.forward()方法
三:其他跳轉方式
a)修改HTTP header的Location屬性來重定向
b)通過設置直接修改地址欄來實現頁面的重定向
c)設置jsp若干秒後 自動重定向
response.setHeader("refresh","3;url=forward2.jsp");
注:有不完善或錯誤之處還請指出。
摘自 itmyhome的專欄