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的封裝是如何實現的。