伺服器端重新導向的兩個技巧

來源:互聯網
上載者:User

重新導向(redirection)是Web編程中的一個重要的技術。運用重新導向,你可以把控制項發送到另一個servlet/JSP頁面,或將Web瀏覽器(使用者)重新導向到一個新的URL。然而,將使用者重新導向到同一個頁面也是很常見的。例如,如果要查看瀏覽器的cookie support是否啟用,你可以把一個cookie發送到瀏覽器,然後將瀏覽器重新導向到同一個頁面。

重新導向可以在伺服器端進行,也可以在用戶端(瀏覽器)進行。因為在servlet/JSP頁面上有伺服器端的代碼,所以可以在伺服器端進行重新導向。用戶端的重新導向可以通過發送JavaScript代碼或者傳送到瀏覽器的HTML頁面的中繼資料來完成。現在,讓我們來看看兩個伺服器端重新導向的技巧。

在servlet/JSP編程中,伺服器端重新導向可以通過下面兩個方法來實現:運用javax.servlet.RequestDispatcher介面的forward方法,或者運用javax.servlet.http.HttpServletResponse介面的sendRedirect方法。

運用RequestDispatcher介面的Forward方法
要運用RequestDispatcher介面的forward方法,首先要得到一個RequestDispatcher對象。servlet技術提供了三種方式來得到它:

1. 通過運用javax.servlet.ServletContext介面的getRequestDispatcher方法,將一個包含路徑的String傳遞給其它資源。該路徑是相對於ServletContext的根路徑的。
2. 通過運用javax.servlet.ServletRequest介面的getRequestDispatcher方法,將一個包含路徑的String傳遞到其它資源。該路徑是相對於當前的HTTP請求的。
3. 通過運用javax.servlet.ServletContext介面的getNamedDispatcher方法,傳遞一個包含其它資源名字的String。

在得到RequestDispatcher對象後,運用forward方法就很容易了。forward方法的定義如下:

public void forward(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response)throws javax.servlet.ServletException, java.io.IOException

但要注意,你只有在用戶端沒有輸出時才可以調用forward方法。如果當前頁面的緩衝區(buffer)不是空的,那麼你在調用forward方法前必須先清空緩衝區。否則,會拋出一個IllegalStateException。forward方法也可以用來將請求發送到一個靜態頁面。

servlet/JSP的初學者在嘗試得到一個RequestDispatcher對象時,常感到困惑,這是因為ServletContext介面的getRequestDispatcher方法和ServletRequest介面的getRequestDispatcher方法有很大的不同。接著閱讀本文你就可以得到一些技巧來避免將這兩者混淆在一起了。

在運用RequestDispatcher對象的forward方法來將一個控制項從一個叫做ABCServlet的servlet傳遞到另一個叫做XYZServlet的servlet時,最簡單的方法就是把ABCServlet和XYZServlet的類檔案放在同一個目錄中。通過這種方法,你就可以從URL http://domain/VirtualDir/servlet/ABCServlet來調用ABCServlet,從URL http://domain/VirtualDir/servlet/XYZServlet來調用XYZServlet了。然後運用forward方法就很簡單了。你可以從ServletRequest介面運用getRequestDispatcher ,傳遞第二個servlet的名字。在ABCServlet中,你可以寫下面的代碼:

  RequestDispatcher rd = request.getRequestDispatcher("SecondServlet");  rd.forward(request, response);

你不需要在XYZServlet前放 / 符號。這種方法是最簡單的,因為你根本不需要擔心兩個servlets的路徑。

稍複雜的方法就是把下面這個String傳遞到ServletRequest的getRequestDispatcher:

"/servlet/XYZServlet"

如果你必須調用一個從ServletContext的getRequestDispatcher得到的RequestDispatcher對象的forward方法,你需要將“/VirtualDir/servlet/XYZServlet”作為路徑參數來傳遞,如下:

  RequestDispatcher rd =    getServletContext().getRequestDispatcher(   "/servlet/XYZServlet");  rd.forward(request, response);

要運用getNamedDispatcher方法,你的代碼就會變成:

  RequestDispatcher rd =    getServletContext().getNamedDispatcher(   "XYZServlet");  rd.forward(request, response);

在運用getNamedDispatcher方法時,你必須在部署描述符中註冊第二個servlet。下面是個例子:

  <web-app>  <servlet>    <servlet-name>ABCServlet</servlet-name>    <servlet-class>ABCServlet</servlet-class>  </servlet>  <servlet>    <servlet-name>XYZServlet</servlet-name>    <servlet-class>XYZServlet</servlet-class>  </servlet></web-app>

如果你改變了所含的servlet,你需要重新啟動Web container以使改變生效。這是因為所包含的servlet從來都不是直接調用的。一旦載入了所包含的servlet,它的時間戳記(time stamp)就不會改變了。

如果你從一個JSP頁面發送控制項,你也可以用<jsp:forward>執行元素,它會終止當前JSP頁面的執行,並將控制項傳遞到另一個資源。它的文法如下:

<jsp:forward page="relativeURL"/>

例如,在JSP頁面被解析後,<jsp:forward page=”OtherPage.jsp”/>在結果servlet中就轉換成了下面的代碼:

pageContext.forward("OtherPage.jsp");

運用HttpServletResponse介面的sendRedirect方法
sendRedirect方法比forward方法要容易。其定義如下:

public void sendRedirect(java.lang.String location)   throws java.iio.IOException

該方法把一個命令發送到瀏覽器,讓瀏覽器對在location中指定的URL提出請求。該方法可以接受絕對的或相對的URLs。如果傳遞到該方法的參數是一個相對的URL,那麼Web container在將它發送到用戶端前會把它轉換成一個絕對的URL。如果地址是相對的,沒有一個’/’,那麼Web container就認為它是相對於當前的請求URI的。

例如,你可以用下面的代碼將使用者重新導向到www.brainysoftware.com:

response.sendRedirect(http://www.brainysoftware.com);

你應該運用哪種技巧?
為了編寫最有效代碼,你應該瞭解這兩種重新導向技巧的不同。forward方法是在Web container內部工作的。sendRedirect方法需要到用戶端的一個往返。所以forward方法比sendRedirect要快。但是,運用forward方法有局限性,你只能重新導向到同一個Web應用程式中的一個資源。而sendRedirect方法可以讓你重新導向到任何URL。結論:如果可以解決你的問題,那麼就用forward方法。只有當你不能用forward方法時才運用sendRedirect方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.