<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ☆藍色夢想☆

    世界總是反反覆覆錯錯落落地飄去 來不及嘆息 生活不是平平淡淡從從容容的東西 不能放棄
    posts - 57, comments - 5, trackbacks - 0, articles - 0

    服務(wù)器端重定向

    Posted on 2005-12-06 09:39 ☆藍色夢想☆ 閱讀(490) 評論(0)  編輯  收藏 所屬分類: J2EE


         重定向(redirection)是Web編程中的一個重要的技術(shù)。運用重定向,你可以把控件發(fā)送到另一個servlet/JSP頁面,或?qū)eb瀏覽器(用戶)重定向到一個新的URL。然而,將用戶重定向到同一個頁面也是很常見的。例如,如果要查看瀏覽器的cookie support是否激活,你可以把一個cookie發(fā)送到瀏覽器,然后將瀏覽器重定向到同一個頁面。

    重定向可以在服務(wù)器端進行,也可以在客戶端(瀏覽器)進行。因為在servlet/JSP頁面上有服務(wù)器端的代碼,所以可以在服務(wù)器端進行重定向??蛻舳说闹囟ㄏ蚩梢酝ㄟ^發(fā)送JavaScript代碼或者傳送到瀏覽器的HTML頁面的元數(shù)據(jù)來完成。現(xiàn)在,讓我們來看看兩個服務(wù)器端重定向的技巧。

    在servlet/JSP編程中,服務(wù)器端重定向可以通過下面兩個方法來實現(xiàn):運用javax.servlet.RequestDispatcher接口的forward方法,或者運用javax.servlet.http.HttpServletResponse接口的sendRedirect方法。

    運用RequestDispatcher接口的Forward方法
    要運用RequestDispatcher接口的forward方法,首先要得到一個RequestDispatcher對象。servlet技術(shù)提供了三種方式來得到它:
    1. 通過運用javax.servlet.ServletContext接口的getRequestDispatcher方法,將一個包含路徑的String傳遞給其它資源。該路徑是相對于ServletContext的根路徑的。
    2. 通過運用javax.servlet.ServletRequest接口的getRequestDispatcher方法,將一個包含路徑的String傳遞到其它資源。該路徑是相對于當(dāng)前的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

    但要注意,你只有在客戶端沒有輸出時才可以調(diào)用forward方法。如果當(dāng)前頁面的緩沖區(qū)(buffer)不是空的,那么你在調(diào)用forward方法前必須先清空緩沖區(qū)。否則,會拋出一個IllegalStateException。forward方法也可以用來將請求發(fā)送到一個靜態(tài)的頁面。
           

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

    在運用RequestDispatcher對象的forward方法來將一個控件從一個叫做ABCServlet的servlet傳遞到另一個叫做XYZServlet的servlet時,最簡單的方法就是把ABCServlet和XYZServlet的類文件放在同一個目錄中。通過這種方法,你就可以從URL http://domain/VirtualDir/servlet/ABCServlet來調(diào)用ABCServlet,從URL http://domain/VirtualDir/servlet/XYZServlet來調(diào)用XYZServlet了。然后運用forward方法就很簡單了。你可以從ServletRequest接口運用getRequestDispatcher ,傳遞第二個servlet的名字。在ABCServlet中,你可以寫下面的代碼:
      RequestDispatcher rd = 
    request.getRequestDispatcher("SecondServlet");
      rd.forward(request, response);
    

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

    稍復(fù)雜的方法就是把下面這個String傳遞到ServletRequest的getRequestDispatcher:
    "/servlet/XYZServlet"

    如果你必須調(diào)用一個從ServletContext的getRequestDispatcher得到的RequestDispatcher對象的forward方法,你需要將“/VirtualDir/servlet/XYZServlet”作為路徑參數(shù)來傳遞,如下:
      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從來都不是直接調(diào)用的。一旦加載了所包含的servlet,它的時間戳(time stamp)就不會改變了。

    如果你從一個JSP頁面發(fā)送控件,你也可以用<jsp:forward>執(zhí)行元素,它會終止當(dāng)前JSP頁面的執(zhí)行,并將控件傳遞到另一個資源。它的語法如下:
    <jsp:forward page="relativeURL"/>

    例如,在JSP頁面被解析后,<jsp:forward page=”O(jiān)therPage.jsp”/>在結(jié)果servlet中就轉(zhuǎn)換成了下面的代碼:
    pageContext.forward("OtherPage.jsp");


    運用HttpServletResponse接口的sendRedirect方法
    sendRedirect方法比forward方法要容易。其定義如下:
    public void sendRedirect(java.lang.String location)
       throws java.iio.IOException
    

    該方法把一個命令發(fā)送到瀏覽器,讓瀏覽器對在location中指定的URL提出請求。該方法可以接受絕對的或相對的URLs。如果傳遞到該方法的參數(shù)是一個相對的URL,那么Web container在將它發(fā)送到客戶端前會把它轉(zhuǎn)換成一個絕對的URL。如果地址是相對的,沒有一個’/’,那么Web container就認(rèn)為它是相對于當(dāng)前的請求URI的。

    例如,你可以用下面的代碼將用戶重定向到www.brainysoftware.com:
    response.sendRedirect(http://www.brainysoftware.com);
    

    你應(yīng)該運用哪種技巧?
    為了編寫最有效的代碼,你應(yīng)該了解這兩種重定向技巧的不同。forward方法是在Web container內(nèi)部工作的。sendRedirect方法需要到客戶端的一個往返。所以forward方法比sendRedirect要快。但是,運用forward方法有局限性,你只能重定向到同一個Web應(yīng)用程序中的一個資源。而sendRedirect方法可以讓你重定向到任何URL。結(jié)論:如果可以解決你的問題,那么就用forward方法。只有當(dāng)你不能用forward方法時才運用sendRedirect方法。

    主站蜘蛛池模板: 日韩免费观看的一级毛片| 久久成人a毛片免费观看网站| 国产四虎免费精品视频| 亚洲a在线视频视频| 国产成人精品免费久久久久| 国产精品亚洲а∨无码播放| 日韩一级在线播放免费观看| 亚洲男人天堂2018av| 免费看片免费播放| 最新亚洲人成网站在线观看| 99久久99久久精品免费观看| 久久精品国产亚洲AV麻豆网站| 57pao国产成永久免费视频| 亚洲日本乱码一区二区在线二产线| 18以下岁毛片在免费播放| 亚洲免费在线观看视频| 中国在线观看免费的www| 亚洲av无码一区二区三区不卡| 四虎影视成人永久免费观看视频| 亚洲狠狠狠一区二区三区| 成人毛片18女人毛片免费| 老司机免费午夜精品视频| 亚洲午夜免费视频| 激情综合亚洲色婷婷五月 | 曰批全过程免费视频免费看| 222www在线观看免费| 亚洲精品国产国语| 亚洲最大av无码网址| 一级毛片**不卡免费播| 亚洲欧洲精品成人久久曰| 亚洲视频在线一区二区| 50岁老女人的毛片免费观看| 亚洲经典千人经典日产| 国产亚洲精品资在线| 成人免费激情视频| 免费大片av手机看片| 亚洲视频在线观看地址| 国产精品免费_区二区三区观看| 在线观看免费视频网站色| 亚洲一卡2卡3卡4卡国产网站 | 久久夜色精品国产亚洲av|