• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            深入理解Servlet/JSP之“轉發和重定向

            一、轉發

            轉發的原理,可以通過下圖展示:

            瀏覽器的請求發送給組件1,組件1經過一些處理之后,將requestresponse對象傳遞給組件2,由組件2繼續處理,然后輸出響應(當然,也可以繼續向其他組件傳遞),這個傳遞的過程稱之為轉發。整個過程只涉及一次瀏覽器和服務器之間的請求-響應,轉發過程中的組件共享同一個請求(request)和響應(response)對象。

            轉發的意義在于可以實現組件的分工。在基于MVC,多層結構的Web應用中,經常需要多個組件協同完成一次請求-響應工作,例如:用戶要獲取設備列表信息,提交請求至控制器組件(Servlet),該Servlet調用適當的JavaBean獲取了設備列表數據然后再轉發至JSP組件去顯示信息。

            RequestDispatcher對象封裝了轉發操作。通過requestgetRequestDispatcher(String path)方法獲得RequestDispatcher對象,其中String類型參數path表示要轉發到的地址。調用Dispacther對象的forward(request, response)方法實現轉發。關于轉發的具體操作,有如下幾點需要注意:

            1、轉發只能在同一個應用的組件之間進行,不可以轉發給其他應用的地址。

            2、轉發的地址可以用相對地址方式,也可以用絕對地址方式。但需要注意的是:用絕對地址方式時,應從應用名后(Context path)開始。例如:要轉發到的地址為: http://192.168.5.100/tst/jsp/somewhere.jsp (其中tst為應用名),對應的絕對地址為:“/jsp/somewhere.jsp”。這是很好理解的,因為轉發只能轉到本應用內的地址,所以絕對地址是沒有必要包含應用名的。

            3、組件之間通過轉發來分工協作,勢必涉及數據的傳遞,可以通過request對象傳遞數據。request對象的setAttributegetAttribute分別用于以名稱-對象對的形式存取數據。例如:

            request.setAttribute("food", "roast duck");
            RequestDispatcher rd = request.getRequestDispatcher("jsp/somewhere.jsp");
            rd.forward(request, response);

            somewhere.jsp的內容:

            <h1>Hey, <%=request.getAttribute("food")%></h1>

            在轉發之前通過requestsetAttribute(String name,Object obj)方法向request中存入了一個名為“food”的字符串對象“roast duck”。在轉發到的jsp/somewhere.jsp中可以通過request的方法

            getAttribute方法取出名為“food”的對象,然后顯示在頁面上。

            4、在一個組件轉發給另外一個組件之前,通過response輸出的響應內容是沒有意義的。例如:在下面的語句中:

            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<h2>head</h2><hr/>");

            RequestDispatcher rd = request.getRequestDispatcher("jsp/somewhere.jsp");

            rd.forward(request, response);

            用戶看到的是/jsp/somewhere.jsp的內容,而在轉發之前的通過out對象輸出的內容:

            "<h2>head</h2><hr/>" 最終不會輸出到瀏覽器,這是由于RequestDispatcher在轉發之前清空了輸出緩沖區。但如果在轉發之前輸出的信息超出了緩沖區,或者調用了out對象的flush()方法,此響應內容已經輸出到了客戶端(稱之為響應信息已提交),此時如果實施轉發操作會拋出運行時異常:java.lang.IllegalStateException

            二、重定向

            重定向的含義可以由下圖說明:

            瀏覽器向某組件發出請求信息,組件向瀏覽器發回一個重定向響應信息,該響應信息不包含具體的數據內容,只是在響應頭信息中包含了需要重定向到的地址信息,該地址可以是任何有效的URL。瀏覽器收到該重定向響應后會自動的向響應信息頭中所指示的地址發出請求。整個重定向的過程涉及兩次請求-響應。具體的重定向響應格式如下所示:

            HTTP/1.1 302 Moved Temporarily

            Server: Apache-Coyote/1.1

            Location: http://192.168.5.100:8080/tst/jsp/somewhere.jsp

            Content-Length: 0

            Date: Mon, 30 Jun 2008 03:52:54 GMT

            注意:重定向響應中包含重定向地址的部分。

            重定向可以通過responsesendRedirect(String url)方法來實現,注意String類型的參數url表示重定向到的地址,需要注意的是,如果表示重定向到本應用內的一個絕對地址時,要從應用名前開始,例如:tst應用中的某個組件要重定向到本應用內的/jsp/somewhere.jsp,則重定向的絕對地址應該是:“/tst/jsp/somewhere.jsp”這一點和轉發中的絕對地址表示是不同的。

            clip_image002

            clip_image004

             

             

            posted on 2009-06-14 19:21 肥仔 閱讀(905) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            久久亚洲国产欧洲精品一| 亚洲精品国精品久久99热| 久久精品麻豆日日躁夜夜躁| 色婷婷综合久久久久中文一区二区| 久久久久国产精品熟女影院| 女人香蕉久久**毛片精品| 亚洲伊人久久成综合人影院| 亚洲精品无码成人片久久| 一本色道久久88加勒比—综合| 亚洲午夜精品久久久久久浪潮| 国产精品久久久久AV福利动漫| 久久免费香蕉视频| 999久久久无码国产精品| 久久久久这里只有精品 | 久久精品成人免费看| 久久免费99精品国产自在现线| 久久精品国产亚洲av麻豆小说 | 色综合久久无码五十路人妻| 久久99久久无码毛片一区二区| 久久久久久久久久久久中文字幕 | 伊人久久国产免费观看视频| 久久久久夜夜夜精品国产| 亚洲国产另类久久久精品小说| 久久精品国产一区二区电影| 久久本道伊人久久| 久久久亚洲欧洲日产国码二区| 国产精品久久久香蕉| 亚洲国产成人精品女人久久久| 久久久久久噜噜精品免费直播 | 国内精品久久国产| 日日狠狠久久偷偷色综合免费 | 久久久亚洲裙底偷窥综合| 青青草国产97免久久费观看| 久久精品中文字幕一区| 99久久国产综合精品五月天喷水| 色偷偷久久一区二区三区| 午夜不卡久久精品无码免费| 久久永久免费人妻精品下载| 国产69精品久久久久777| 久久精品国产亚洲AV香蕉| 2022年国产精品久久久久|