1.sendRedirect方式
sendRedirect("/a.jsp");
可以將頁面跳轉到任何路徑,不局限於web應用中,跳轉的過程中url地址變化,無法使用request.setAttribute來傳遞。
2.forward方式
request.getRequestDispatcher("/a.jsp").forward(request.response);
url地址不變,只能跳轉到本web應用中的頁面上。可以用request.setAttibute方法
問題:
首頁點擊一個連接,切換div(id = cc_bi)
提交表單后,企圖直接回到div(id = cc_bi)視圖。servlet代碼如下:
request.getRequestDispatcher("TestDirejsp?#cc_bi").forward(request, response);
然而,只能跳轉至jsp首頁,后面的div指定無效
解決方案:
(1)
Servlet:
response.sendRedirect("/AhWeb002/TestDire.jsp?#cc_bi");
(2)給jsp傳個參數(隨便什么),在jsp端取得該參數,根據參數是否取得再做判斷
Servlet: request.getRequestDispatcher("/TestDire.jsp?id='xx'").forward(request, response);
JSP:
【<%out.println(request.getParameter("id") + " XX"); %>】
<% if (request.getParameter("id")!= null) {%>
<%} %>
知識點:
request.getRequestDispatcher().forward()在服務器跳轉,只能指定頁面,不能再指細節;地址欄地址不變;
request, response全部傳給頁面。
request.sendRedirect()在頁面進行跳轉,靈活的多,但要指定項目名(本案例中,加個/AhWeb002);
request, response全部是新的。
servlet使用RequestDispatcher到jsp頁面
String url="/EShop.jsp";
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(req, res);
servlet重定向jsp,並將數據發送到別一個JSP中:
request.setAttubute("messages",aaa);
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/jsp/testbean.jsp");
requestDispatcher.forward(request,response);
【1】response.sendRedirect方式
它可以是相對路徑:response.sendRedirect("/a.jsp");
也可以使絕對路徑:response.sendRedirect("http://www.baidu.com");
說明:跳轉后地址欄會發生變化
【2】request.getRequestDispatcher方式
只能是相對路徑:RequestDispatcher ds = request.getRequestDispatcher("/a.jsp");
說明:跳轉后地址蘭不會發生變化
個人小總結:
1、客戶端跳轉:地址欄內容改變,發生了2次請求,“/”代表服務器路根路徑,即“/”代表服務器目錄下的webapps目錄,webapps目錄下有不同的web應用。一般項目開發中,response.sendRedirect("/test(web應用)/login.jsp")屬於發生在客戶端的跳轉
2、服務器端跳轉:地址欄內容不變,“/”代表站點根路徑,即“/”代表web應用程序下的根路徑,屬於內部跳轉。
一般地,request.getRequestDispatcher("/ulogin.jsp").forward(request, response)屬於發生在服務器端的內部跳轉。
(網上轉載)
服務器端跳轉與客戶端跳轉:
首先我們需要理解什么是服務器端跳轉,什么是客戶端的跳轉。簡單理解所謂服務器端跳轉就是指地址欄內容不變(客戶端瀏覽器的地址欄不會顯示目標地址的URL),而客戶端跳轉是指地址欄內容發生改變(客戶端向服務器發請求,然后服務器再給客戶端一個響應,然后客戶端再根據服務器端給的響應中的URL再向服務器發送請求,所以是兩次請求,因此地址欄改變了顯示最后一次請求地址);
服務器端跳轉:
1、request.getRequestDispatcher("/success.jsp").forward(request,response),它是只要執行到此語句之后則立刻進行跳轉,可以傳遞request屬性;
2、jsp:forward,這種跳轉屬於無條件跳轉,它只能在棧內轉,而sendRedirect中則可以任意轉,甚至可以輸入baidu
客戶端跳轉:
1、response.sendRedirect("fail.jsp"),所有頁面執行完之后再進行跳轉,不能傳遞request范圍的屬性,但是可以通過地址重寫的方式向跳轉頁傳遞參數,因為該方法執行完之后就相當於一次http request的結束,這是服務器會向客戶端發送302狀態碼和新的url,告訴客戶端重新發送request請求到新的url,然后客戶端照此執行,執行即新的請求響應流程開始,服務器再重新創建HttpServletRequest對象和HttpServletResponse對象,此時兩個請求已經不在一個線程了,所以request和response對象都不是開始的那個了;
2、response.setHeader("refresh","2;URL=index.jsp"),2秒后跳轉到其他頁面;
3、百度,超鏈接;
通過以上可以得知,如果現在一個頁面中使用了JDBC,則應該在forward跳轉之前關閉數據庫鏈接,而使用respose則可以在任意的位置處關閉.
Servlet:
當然,在servlet中,一般跳轉都發生在doGet, doPost等方法里面。
- redirect 方式
response.sendRedirect("/a.jsp");
頁面的路徑是相對路徑。sendRedirect可以將頁面跳轉到任何頁面,不一定局限於本web應用中,如:
response.sendRedirect("http://www.jb51.net");
跳轉后瀏覽器地址欄變化。
這種方式要傳值出去的話,只能在url中帶parameter或者放在session中,無法使用request.setAttribute來傳遞。 - forward方式
RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
dispatcher .forward(request, response);
頁面的路徑是相對路徑。forward方式只能跳轉到本web應用中的頁面上。
跳轉后瀏覽器地址欄不會變化。
使用這種方式跳轉,傳值可以使用三種方法:url中帶parameter,session,request.setAttribute
JSP: - response.sendRedirect();
和servlet的response.sendRedirect()方式一樣。
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
...
跳轉后瀏覽器地址欄變化
如果要跳到不同主機下,跳轉后,此語句后面的語句會繼續執行,如同新開了線程,但是對response的操作已經無意義了;
如果要跳到相同主機下,此語句后面的語句執行完成后才會跳轉; - response.setHeader("Location","");
此語句前不允許有out.flush(),如果有,頁面不會跳轉。
跳轉后瀏覽器地址欄變化
此語句后面的語句執行完成后才會跳轉