Servlet跳轉到jsp頁面的幾種方法


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等方法里面。

  1. redirect 方式
    response.sendRedirect("/a.jsp");
    頁面的路徑是相對路徑。sendRedirect可以將頁面跳轉到任何頁面,不一定局限於本web應用中,如:
    response.sendRedirect("http://www.jb51.net");
    跳轉后瀏覽器地址欄變化。
    這種方式要傳值出去的話,只能在url中帶parameter或者放在session中,無法使用request.setAttribute來傳遞。
  2. forward方式
    RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
    dispatcher .forward(request, response);
    頁面的路徑是相對路徑。forward方式只能跳轉到本web應用中的頁面上。
    跳轉后瀏覽器地址欄不會變化。
    使用這種方式跳轉,傳值可以使用三種方法:url中帶parameter,session,request.setAttribute
    JSP:
  3. 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的操作已經無意義了;
    如果要跳到相同主機下,此語句后面的語句執行完成后才會跳轉;
  4. response.setHeader("Location","");
    此語句前不允許有out.flush(),如果有,頁面不會跳轉。
    跳轉后瀏覽器地址欄變化
    此語句后面的語句執行完成后才會跳轉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM