spring源碼分析之spring-web http詳解


spring-web是spring webmvc的基礎,它的功能如下:

1. 封裝http協議中client端/server端的request請求和response響應及格式的轉換,如json,rss,xml等。

2. 遠程調用包括jaxws、caucho、httpinvoker

3. web相關的accept/bind/client/context/filter/jsf/method/multipart

先從http協議中的封裝來看:

先了解一下http的基礎:(來自:http://blog.csdn.net/lxzo123/article/details/6708035 HTTP協議——請求格式及方法)

一、HTTP請求格式

當瀏覽器向Web服務器發出請求時,它向服務器傳遞了一個數據塊,也就是請求信息,HTTP請求信息由3部分組成:

① 請求方法 URI 協議/版本

② 請求頭(Request Header)

③ 請求正文

下面是一個HTTP請求的例子:

GET/sample.Jsp HTTP/1.1

Accept:image/gif.image/jpeg,*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

Accept-Encoding:gzip,deflate

 

username=jinqiao&password=1234

 

(1)請求方法URI協議/版本

請求的第一行是“方法URL協議版本”:GET/sample.jsp HTTP/1.1

以上代碼中“GET”代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協議和協議的版本。

根據HTTP標准,HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。

URL完整地指定了要訪問的網絡資源,通常只要給出相對於服務器的根目錄的相對目錄即可,因此總是以“/”開頭,最后,協議版本聲明了通信過程中使用HTTP的版本。

(2)請求頭(Request Header)

請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。

Accept:image/gif.image/jpeg.*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)

Accept-Encoding:gzip,deflate.

(3) 請求正文

請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:

username=jinqiao&password=1234

在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。

四、HTTP請求方法:GET POST

1)GET方法

GET方法是默認的HTTP請求方法,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼,同時它將作為URL的一部分向Web服務器發送,因此,如果使用GET方法來提交表單數據就存在着安全隱患上。例如

Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB

從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之后的內容)另外由於GET方法提交的數據是作為URL請求的一部分所以提交的數據量不能太大

2)POST方法

POST方法是GET方法的一個替代方法,它主要是向Web服務器提交表單數據,尤其是大批量的數據。POST方法克服了GET方法的一些缺點。通過POST方法提交表單數據時,數據不是作為URL請求的一部分而是作為標准數據傳送給Web服務器,這就克服了GET方法中的信息無法保密和數據量太小的缺點。因此,出於安全的考慮以及對用戶隱私的尊重,通常表單提交時采用POST方法。

從編程的角度來講,如果用戶通過GET方法提交數據,則數據存放在QUERY_STRING環境變量中,而POST方法提交的數據則可以從標准輸入流中獲取。

言歸正傳:

http基礎
1. httpRequest繼承自HttpMessage定義了http請求的基本格式:header、method、url,其中httpMethod定義了http協議的所有方法:

public enum HttpMethod {

    GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE

}

2. responseEntity繼承自httpEntity定義了http響應的格式:header、body、status,其中HttpStatus是個枚舉類,定義了1xx、2xx、3xx、4xx、5xx的響應狀態碼

3. MediaType繼承自MimeType,定義了可以接受的請求文件類型。

http client

 1. ClientHttpRequest是客戶端請求的接口,它的抽象類是AbstractClientHttpRequest;SimpleStreamingClientHttpRequest(使用jkd自帶的功能執行流處理請求)、HttpComponentsStreamingClientHttpRequest(使用apache的components組件來處理請求)、AbstractBufferingClientHttpRequest(抽象buffer)繼承自AbstractClientHttpRequest抽象類;BufferingClientHttpRequestWrapper(簡單的ClientRequest實現)、HttpComponentsClientHttpRequest(apache components組件的請求處理實現)、SimpleBufferingClientHttpRequest(使用jdk自帶功能的http請求處理實現)繼承自抽象類AbstractBufferingClientHttpRequest。

從上面的圖中可以清晰的看出clientHttpRequest的族譜關系及其實現類。

2. ClientHttpResponse是客戶端響應的接口,BufferingClientHttpResponseWrapper是ClientHttpResponse的簡單實現,它讀取request的body到內存中,因此支持多次觸發getBody()方法;ClientHttpResponse的抽象類是AbstractClientHttpResponse;該抽象類有三個實現類,其中SimpleClientHttpResponse是使用jkd自帶功能實現的,可以通過SimpleBufferingClientHttpRequest的execute()方法或者SimpleStreamingClientHttpRequest的execute()方法獲取到該對象;HttpComponentsClientHttpResponse是使用apache components組件中HttpComponentsClientHttpRequest請求的返回對象;HttpComponentsAsyncClientHttpResponse是使用apache componets組件中HttpComponentsAsyncClientHttpRequest請求的返回對象。

3. 異步請求AsyncClientHttpRequest是接口,SimpleStreamingAsyncClientHttpRequest使用jdk自帶功能實現的異步流處理請求,可以通過org.springframework.http.client.SimpleClientHttpRequestFactory的createRequest方法獲取;AbstractBufferingAsyncClientHttpRequest是AsyncClientHttpRequest接口的抽象類,它在請求發送前將之緩存到一個byte數組中;SimpleBufferingAsyncClientHttpRequest是上述抽象類的實現類,它使用jkd自定的功能來執行緩存請求。可以通過org.springframework.http.client.SimpleClientHttpRequestFactory的createRequest方法獲取該對象;

HttpComponentsAsyncClientHttpRequest是上述抽象類的實現類,它使用apache httpComponents組件的httpClient去執行request,該對象可以通過org.springframework.http.client.HttpComponentsClientHttpRequestFactory的createRequest方法去獲取。

4. 異步響應HttpComponentsAsyncClientHttpResponse繼承自AbstractClientHttpResponse抽象類,間接繼承自ClientHttpResponse接口。

注意:請求request一般由請求工廠requestFactory來產生。

http server

1. ServletServerHttpRequest繼承並實現了ServerHttpRequest接口,封裝了HttpServletRequest,支持異步。

2. ServletServerHttpResponse繼承並實現了ServerHttpResponse接口,封裝了HttpServletResponse。

3. 異步的處理由ServletServerHttpAsyncRequestControl來完成,它繼承並實現了ServerHttpAsyncRequestControl接口。它在response關閉前處理以異步方式處理httq請求。

 http Converter

首先看一下它的層次結構圖:

默認情況下,有如下一些HttpMessageConverter:

    • ByteArrayHttpMessageConverter –  轉換byte數組
    • StringHttpMessageConverter – 轉換string類型
    • ResourceHttpMessageConverter – 轉換任意類型的8位字節流到org.springframework.core.io.Resource
    • SourceHttpMessageConverter – 轉換 javax.xml.transform.Source
    • FormHttpMessageConverter – 轉換表單到/從MultiValueMap<String, String>類型.
    • Jaxb2RootElementHttpMessageConverter – 轉換java對象到/從xml格式(僅適用在classpath文件增加JAXB2 )
    • MappingJackson2HttpMessageConverter – 轉換JSON類型 (僅適用於clsspath中有jackson2)
    • MappingJacksonHttpMessageConverter –轉換JSON類型 (僅適用於clsspath中有jackson)
    • AtomFeedHttpMessageConverter – 轉換Atom feeds (僅適用於clsspath中有Rome)
    • RssChannelHttpMessageConverter – 轉換RSS feeds (僅適用於clsspath中有Rome)

小結:

   spring-web是spring webmvc的基礎,而spring-web的基礎是spring-web http模塊,它包含四個模塊:

1. http 封裝的基礎如httpRequest、httpResponse、httpStatus、httpHeader等;

2. client端的request請求及響應;

3. server端的request請求及響應;

4. 格式的轉換,如json,rss,xml等。

  這個模塊的學習可以結合http協議及servlet來學習,可以理解spring對http的封裝是如何實現的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM