1. 程式人生 > >servlet轉發與重定向基本概念與區別

servlet轉發與重定向基本概念與區別

1.轉發與重定向概念介紹

1.1轉發

瀏覽器的請求傳送給元件1,元件1經過一些處理之後,將request和response物件“傳遞”給元件2,由元件2繼續處理,然後輸出響應(當然,也可以繼續向其他元件“傳遞”),這個傳遞的過程稱之為“轉發”。

轉發過程:客戶瀏覽器傳送http請求—-》web伺服器接受此請求–》呼叫內部的一個方法在容器內部完成請求處理和轉發動作—-》將目標資源傳送給客戶。

整個過程只涉及一次瀏覽器和伺服器之間的“請求-響應”,轉發過程中的元件共享同一個請 求(request)和響應(response)物件。

轉發的意義在於可以實現元件的“分工”。在基於MVC,多層結構的Web應用中,經常需要多個元件協同完成一次“請求-響應”工作。

RequestDispatcher物件封裝了轉發操作。通過request的getRequestDispatcher(String path)方法獲得RequestDispatcher物件,其中String型別引數path表示要轉發到的地址。呼叫Dispacther物件的 forward(request, response)方法實現轉發。關於轉發的具體操作,有如下幾點需要注意:

  • 轉發只能在同一個應用的元件之間進行,不可以轉發給其他應用的地址。
  • 轉發的地址可以用“相對地址”方式,也可以用“絕對地址”方式。但需要注意的是:用絕對地址方式時,應從應用名後(Context path)開始。例如:要轉發到的地址為:
    http://192.168.5.100/tst/jsp/somewhere.jsp
    (其中tst為應用名),對應的絕對地址為:“/jsp/somewhere.jsp”。這是很好理解的,因為轉發只能轉到本應用內的地址,所以絕對地址是沒有必要包含應用名的。
  • 元件之間通過轉發來分工協作,勢必涉及資料的傳遞,可以通過request物件傳遞資料。request物件的setAttribute和getAttribute分別用於以“名稱-物件對”的形式存取資料。
  • 在一個元件轉發給另外一個元件之前,通過response輸出的響應內容是沒有意義的。在轉發之前的通過out物件輸出的內容最終不會輸出到瀏覽器,這是由於RequestDispatcher在轉發之前清空了輸出緩衝區。但如果在轉發之前輸出的資訊超出了緩衝區,或者呼叫了 out物件的flush()方法,此響應內容已經輸出到了客戶端(稱之為響應資訊已提交),此時如果實施轉發操作會丟擲執行時異 常:java.lang.IllegalStateException。

1.2重定向

瀏覽器向某元件發出請求資訊,元件向瀏覽器發回一個重定向響應資訊,該響應資訊不包含具體的資料內容,只是在響應頭資訊中包含了需要重定向到的地址資訊,該地址可以是任何有效的URL。瀏覽器收到該重定向響應後會自動的向響應資訊頭中所指示的地址發出請求。整個重定向的過程涉及兩次“請求-響應”。

重定向過程:客戶瀏覽器傳送http請求—-》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器–》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址—-》伺服器根據此請求尋找資源併發送給客戶。

重定向可以通過response的sendRedirect(String url)方法來實現,注意String型別的引數url表示重定向到的地址,需要注意的是,如果表示重定向到本應用內的一個絕對地址時,要從應用名前開始,例如:tst應用中的某個元件要重定向到本應用內的/jsp/somewhere.jsp,則重定向的絕對地址應該是:“/tst/jsp /somewhere.jsp”這一點和轉發中的絕對地址表示是不同的。關於重定向的具體操作,有如下幾點需要注意:

  • 使用response.sendRedirect時,前面不能有HTML輸出。這並不是絕對的,不能有HTML輸出其實是指不能有HTML被送到了瀏覽器。事實上現在的server都有cache機制,一般在8K(我是說JSP  SERVER),這就意味著,除非你關閉了cache,或者你使用了out.flush()強制重新整理,那麼在使用sendRedirect之前,有少量的 HTML輸出也是允許的。
  • response.sendRedirect之後,應該緊跟一句return;
    我們已經知道response.sendRedirect是通過瀏覽器來做轉向的,所以只有在頁面處理完成後,才會有實際的動作。既然你已經要做轉向了,那麼後的輸出還有什麼意義呢?而且有可能會因為後面的輸出導致轉向失敗。

1.3轉發與重定向的區別

  • (1)請求轉發是一次請求一次響應,而重定向是兩次請求兩次響應;

  • (2)請求轉發位址列不會改變,而重定向位址列會顯示第二次請求的地址;

  • (3)請求轉發只能轉發給本專案的其他資源,而重定向不僅可以重定向到本專案的其他資源, 還可以重定向到其他專案;

  • (4)請求轉發是伺服器端的行為,轉發時只需要給出轉發的資源路徑即可,如Servlet的訪問路徑;而重定向需要給出全路徑,即路徑要包含專案名;

  • (5)請求轉發比重定向的效率高,因為請求轉發是一個請求。在以後的開發中,如果需要位址列的地址發生改變,就選擇重定向;如果需要在Servlet之間通過request域進行資料通訊,就選擇請求轉發。

2.請求轉發與響應重定向的種類

有兩種方式獲得Servlet 轉發物件(RequestDispatcher):

1)一種是通過HttpServletRequest的getRequestDispatcher()方法獲得;
2)一種是通過ServletContext的getRequestDispatcher()方法獲得。 Servlet

重定向的方法只有一種:HttpServletResponse的sendRedirect()方法。

3.請求轉發與響應重定向中路徑引數區別

假設通過http://localhost/myApp/cool/bar.do 請求到達該方法所屬的Servlet。
3.1請求轉發
◆HttpServletRequest.getRequestDispatcher(String)
引數可以指定為相對路徑或絕對路徑。

  • 絕對路徑與Servlet重定向不同,容器將相對於Web應用的根目錄加引數生成完整的URL(即“/”根路徑就是相對於虛擬路徑)這是因為轉發是在伺服器內部進行的,寫絕對路徑/開頭指的是當前的Web應用程式。即:request.getRequestDispatcher(“/foo/stuff.do”)生成的URL是http://localhost/myApp/foo/stuff.do

◆ ServletContext.getRequestDispatcher(String)
- 引數只能指定為絕對路徑,生成的完整URL與HttpServletRequest.getRequestDispatcher(String)相同。

3.2響應重定向
◆ HttpServletResponse.sendRedirect(String)
引數可以指定為相對路徑、絕對路徑或其它Web應用。

  • 相對路徑:response.sendRedirect(“foo/stuff.do”),容器相對於原來請求URL的目錄加引數來生成完整的URL——http://localhost/myApp/cool/foo/stuff.do

  • 絕對路徑:response.sendRedirect(“/foo/stuff.do”),容器相對於Web應用本身加引數建立完整的URL,這是因為
    重定向response.sendRedirect(“”)是伺服器向客戶端傳送一個請求頭資訊,由客戶端再請求一次伺服器,請求是在伺服器外進行的,即完整的url是——http://localhost/foo/stuff.do

  • 其它Web應用:response.sendRedirect(“http://www.xxx.com “)容器直接定向到該URL。

3.3JSP 提交表單給 Servlet 路徑問題
JSP頁面提交表單給Servlet時,路徑的寫法要格外注意。

假如說,你工程名字為HibernateApp3,JSP頁面提交表單給servlet時有兩種寫法:

  • 相對路徑: <form action=servlet/addStudent method=post>...</form>
  • 絕對路徑: <form action="/HibernateApp3/servlet/addStudent"
    method=post>...</form>
    或者 <form action="<%=request.getContextPath() %>/servlet/addStudent" method=post>...</form>

注意:/代表根目錄,如果路徑是使用/開頭,Tomcat就是webApp那個目錄,如果你不是/開頭代表你從當前工程的目錄開始,例如:webApp/HibernateApp3/。

附、<a href>的路徑如果是”/”開頭,則表示相對於主機,如果不是則表示相對於當前請求。

綜上所述:這裡最最關鍵的要能清楚 發出請求目的資源的請求是在伺服器內部還是伺服器外部:內部時,“/”就是專案的虛擬目錄;外部時,“/”就是代表主機的根目錄

相關推薦

servlet轉發定向基本概念區別

1.轉發與重定向概念介紹 1.1轉發 瀏覽器的請求傳送給元件1,元件1經過一些處理之後,將request和response物件“傳遞”給元件2,由元件2繼續處理,然後輸出響應(當然,也可以繼續向其他元件“傳遞”),這個傳遞的過程稱之為“轉發”。

Servlet學習筆記(四)之請求轉發定向(RequestDispatchersendRedirect)

ServletContext可以實現請求轉發(ServletContext請求轉發相關內容見之前部落格:http://blog.csdn.net/megustas_jjc/article/details/53191657),request也可以。HttpServletRequest 和 ServletCont

請求轉發定向,ForwordRedirect的區別是什麼

先說一下這兩個的概念: 轉發過程:客戶瀏 覽器傳送http請求----》web伺服器接受此請求--》呼叫內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源傳送給客戶;在這 裡,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間

servlet轉發定向

strong 技術 過程 std 進行 logs font request java 1 轉發 RequestDispatcher getRequestDispatcher(java.lang.String path) 1)地址欄不會改變 2)轉發只能轉發到當前web應用內

JSP及Java中轉發定向概念

jsp小指令碼: .語法規則:<%......%> .語法內容:能夠寫在方法裡的java程式碼片段都可以作為小指令碼 .轉譯成Servlet時的規則:原封不動成為Servlet類的service()方法裡面的一段程式碼 jsp宣告 .語法規則:<%!....%> .合法內

深入理解Servlet轉發定向

一、轉發     轉發的原理,可以通過下圖展示:     瀏覽器的請求傳送給元件1,元件1經過一些處理之後,將request和response物件“傳遞”給元件2,由元件2繼續處理,然後輸出響應(當然,也可以繼續向其他元件“傳遞”),這個傳遞的過程稱之為“轉發”。整

請求轉發定向、包含的區別

概述 Servlet的service()方法是由Servlet容器來呼叫的,使用者不能在一個Servlet物件中直接呼叫另一個Servlet物件的servie()方法,因為一個Servlet物件無法得到另一個Servlet物件的引用。為了能夠得到另一個serv

servlet轉發定向

服務 響應 瀏覽器 etc tco cap rect mil 頁面   HttpServletRequest:   表示瀏覽器向服務器發送的請求報文,由Tomcat創建然後作為參數傳遞給我們doget,dopost方法。   功能:getParameter()獲取請求參數

JavaWeb(一)Servlet中亂碼解決轉發定向區別

這也 charset 都是 war 不一定 調用 技術 請求方式 註冊 前言   前面其實已經把Servlet中所有的內容都介紹完了,這篇講補充一點亂碼和重定向與轉發之間的區別! 一、request請求參數出現亂碼問題 1.1、get請求   1)亂碼示例   g

Servlet 及 請求轉發定向

style pattern load 需要 shutdown att nbsp host 瀏覽器 Servlet: Java編寫的服務器端程序,處理客戶端的http請求並將其結果發送到客戶端。Servlet容器Tomcat: 最熟悉的是容器就是tomcat。在tomcat中

Servlet 請求轉發定向

請求轉發和重定向 重定向 /* 之前的寫法 response.setStatus(302); response.setHeader("Location", "login_success.html");*/ //重定向寫法: 重新定位方向

Servlet轉發定向的資源路徑問題解析

一. 問題引入        轉發和重定向可以說是Servlet中最重要的知識點也不為過,因為它決定著整個向Servlet體系中,執行流程的問題。      轉發:       &nb

servlet轉發請求定向小結

請求轉發: 方式:request.getRequestDispacther("/test.jsp").forword(request,response);  過程分析:客戶端發出一個請求reqeust到伺服器,伺服器找到相應的Servlet處理資料,然後呼叫 request

Servlet應用中定向請求轉發區別

首先重定向和請求轉發的區別在大多數面試題裡面會考到,這篇文章是總結一下個人的理解。本文不講程式碼 第一,我們要明白這兩個東西的作用。Servlet在對客戶端請求的資料處理完成後,會向客戶端返回相應的響應結果(Servlet辦事兒)。 關於重定向

servlet中請求轉發(forword)定向(sendredirect)的區別

             客戶傳送一個請求到伺服器,伺服器匹配servlet,這都和請求轉發一樣,servlet處理完之後呼叫了sendRedirect()這個方法,這個方法是response的方法,所以,當這個servlet處理完之後,看到response.senRedirect()方法,立即向客戶端返回這

Struts2配置使用參數接收,轉發定向,多方法,ognl使用值傳遞,struts標簽使用

isp -name users .org 填充 導航 建模 尋址 XML 本文檔包括了 Struts2配置使用參數接收,轉發與重定向,多方法,ognl使用與值傳遞,struts標簽使用 (1)首先加入jar包(最小jar組合) (1) 在web.xml中註冊

註解 轉發定向

sys javax println web admin 數據 let out int package controller; import java.util.HashMap; import java.util.Map; import javax.servlet.ht

轉發定向

工作原理 發的 結果 san 原理 rect() 初學者 定向 pat 轉發和重定向   先是看上去不同,他們的調用分別如下:    equest.getRequestDispatcher("apage.jsp").forward(request, response);//

轉發定向學習代碼

轉發與重定向學習代碼html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>用戶登錄</title> &l

Spring MVC溫故而知新 – 參數綁定、轉發定向、異常處理、攔截器

單獨 UC exclude require 加載 pre buffered nts 節點 請求參數綁定 當用戶發送請求時,根據Spring MVC的請求處理流程,前端控制器會請求處理器映射器返回一個處理器,然後請求處理器適配器之心相應的處理器,此時處理器映射器會調用Spr