• <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之“轉發(fā)和重定向

            一、轉發(fā)

            轉發(fā)的原理,可以通過下圖展示:

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

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

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

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

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

            3、組件之間通過轉發(fā)來分工協作,勢必涉及數據的傳遞,可以通過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>

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

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

            4、在一個組件轉發(fā)給另外一個組件之前,通過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的內容,而在轉發(fā)之前的通過out對象輸出的內容:

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

            二、重定向

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

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

            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”這一點和轉發(fā)中的絕對地址表示是不同的。

            clip_image002

            clip_image004

             

             

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

            久久人人爽人人爽人人av东京热| 久久久久香蕉视频| 国产精品久久久久国产A级| 久久综合给久久狠狠97色| 久久精品中文闷骚内射| 久久久中文字幕| 久久精品不卡| 国产综合久久久久久鬼色| 久久精品亚洲福利| 久久丫精品国产亚洲av不卡| 国产午夜精品久久久久九九电影| 97香蕉久久夜色精品国产 | 精品多毛少妇人妻AV免费久久| 久久国产亚洲高清观看| 久久久久人妻一区精品果冻| 人妻少妇久久中文字幕| 亚洲国产成人久久精品99| 国产精品久久久久久久| 久久人人添人人爽添人人片牛牛| 99国产精品久久| 狠狠综合久久综合88亚洲| 久久久久国产精品嫩草影院| 狠狠色丁香久久婷婷综合五月 | 亚洲精品乱码久久久久66| 久久精品国产亚洲精品| 成人国内精品久久久久影院| 中文字幕无码免费久久| yy6080久久| 国产精品久久久久久久app | 久久线看观看精品香蕉国产| 麻豆亚洲AV永久无码精品久久| 亚洲婷婷国产精品电影人久久| 国产成人久久精品麻豆一区| 亚洲午夜久久影院| 四虎国产精品免费久久久| 久久亚洲欧美日本精品| 久久不射电影网| 久久久久一区二区三区| 日本久久久精品中文字幕| 久久精品国产亚洲麻豆| 久久综合综合久久狠狠狠97色88|