天天看點

Servlet程式設計執行個體2

上次實驗中利用HttpServletRespon.sendRedict()方法來實作頁面的轉跳,而這種重定向請求的方法無法傳遞緩存的内容。是以為了做出改進,這次使用RequestDispatcher()方法來轉發請求。

dopost()方法修改如下:

Servlet程式設計執行個體2
 實驗結果如下:
Servlet程式設計執行個體2

 可以看到此次隻産生了一個請求響應。而且表單送出的資訊能完整顯示。

整個處理流程總結如下:浏覽器的請求首先發送給LoginServlet,LoginServlet處理完畢之後會将requset和response對象傳遞給success.jsp(這個傳遞的過程被稱為請求轉發),整個過程隻涉及一次伺服器與浏覽器之間的互動,也就是說隻有一次請求響應,在整個轉發過程中,各元件共享同一組請求和響應對象。

缺點:

轉發隻能在同一應用的元件之間進行,而不能在不同應先的元件之間進行。而sendRedict()方法是可以轉發給其他應用位址的。

差別:

那麼sendRedict()方法和forword方法的不同在于:

RequestDispatcher是一個Web資源的包裝器,可以用來把目前request傳遞到該資源,或者把新的資源包括到目前響應中。RequestDispatcher接口中定義了兩個方法:include/forward

由于<jsp:include>隻能指定固定的jsp檔案名,不能動态指定jsp檔案名。我們需要把<jsp:include>翻譯為

Java

code – RequestDispatcher.include();

用法:

<% request.getRequestDispatcher(filename).include(request, response); />

伺服器端的重定向可以有兩種方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.

HttpServletResponse.sendRedirect()方法将響應定向到參數location指定的、新的URL。location可以是一個絕對的URL,如response.sendRedirect("http: //

.sun.com")也可以使用相對的URL。如果location以“/”開頭,則容器認為相對于目前Web應用的根,否則,容器将解析為相對于目前請求的URL。這種重定向的方法,将導緻用戶端浏覽器的請求URL跳轉。從浏覽器中的位址欄中可以看到新的URL位址,作用類似于上面設定

HTTP響應頭資訊的實作。

RequestDispatcher.forward()方法将目前的request和response重定向到該

RequestDispacher指定的資源。這在實際項目中大量使用,因為完成一個業務操作往往需要跨越多個步驟,每一步驟完成相應的處理後,轉向到下一個步驟。比如,通常業務處理在Servlet中處理,處理的結果轉向到一個JSP頁面進行顯示。這樣看起來類似于Servlet鍊的功能,但是還有一些差別。一個RequestDispatcher對象可以把請求發送到任意一個伺服器資源,而不僅僅是另外一個Servlet。

include()方法将把Request Dispatcher資源的輸出包含到目前輸出中。

注意,隻有在尚未向用戶端輸出響應時才可以調用forward()方法,如果頁面緩存不為空,在重定向前将自動清除緩存。否則将抛出一個IllegalStateException異常。

簡單用法:

RequestDispatcher rd;

       rd = getServletContext().getRequestDispatcher("/Expired.jsp");

       rd.forward(request,response);

來源: 

http://blog.csdn.net/renhui999/article/details/8496222 null
上一篇: IOC了解
下一篇: 無标題