spring3.0的重要接口:httpmessageconveter為我們提供了強大的資料轉換功能,将我們的請求資料轉換為一個java對象,或将java對象轉化為特定格式輸出等。比如我們常見的從前端系統資料庫單擷取json資料并轉化為user對象,或前端擷取使用者資訊,後端輸出user對象轉換為json格式傳輸給前端等。
spring 為我們提供了衆多的httpmessageconveter實作類,其中我們可能用得最多的三個實作類是:
實作類
功能
formhttpmessageconverter
從請求和響應讀取/編寫表單資料。預設情況下,它讀取媒體類型 application/x-www-form-urlencoded 并将資料寫入<code>multivaluemap<string,string></code>
marshallinghttpmessageconverter
使用 spring 的 marshaller/un-marshaller 讀取/編寫 xml 資料。它轉換媒體類型為 application/xml
mappingjacksonhttpmessageconverter
使用 jackson 的 objectmapper 讀取/編寫 json 資料。它轉換媒體類型為application/json
轉換器的裝配方式有兩種,一種是通過注冊org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter來裝配messageconverters,如下所示:
另一種是啟用注解<code><mvc:annotation-driven /></code>
該注解會會初始化7個轉換器:
- bytearrayhttpmessageconverter
- stringhttpmessageconverter
- resourcehttpmessageconverter
- sourcehttpmessageconverter
- xmlawareformhttpmessageconverter
- jaxb2rootelementhttpmessageconverter
- mappingjacksonhttpmessageconverter
通過以上兩種方法,我們即可完成我們的轉換器注冊。
但我們想要在控制層完成資料的輸入輸出轉換,需要通過下列途徑:
1. 使用@requestbody和@responsebody對處理方法進行标注。其中@requestbody通過合适的httpmessageconverter将http請求正文轉換為我們需要的對象内容。而@responsebody則将我們的對象内容通過合适的httpmessageconverter轉換後作為http響應的正文輸出。
2. 使用httpentity、responseentity作為處理方法的入參或傳回值
通過以上講解,我們已經有足夠的知識準備,來完成我們的執行個體:将json資料轉換為合适的java對象輸入,并将java對象轉換為符合格式的json字元輸出:
裝配mappingjacksonhttpmessageconverter需要我們的jackson相關jar包,我們使用maven來管理項目,在pom.xml中配置如下資訊:
這裡我們使用上面提到的方式二更為便利,在spring容器中加入:
<code><mvc:annotation-driven /></code>
關于springmvc所需的其他配置,可參考我的另一篇文章,或通過文尾的源碼下載下傳擷取
下面是我們的user pojo測試類
下面是我們的控制層測試檔案:
上面分别展示了注解和httpentity的用法。關于httpresponse隻是在htppentity的基礎上進一步對相應資訊進行封裝,如修改一些相應頭資訊等
關于以上的getuser()getuser1()能将我們的json字元串轉換為相應的對象,我們可以任何參數名輸入:
{“id”:10,”password”:”mypassword”,”username”:”myusername”}
在這裡我們需要的是需将請求頭的contenttype設定為”application/json;utf-8“。這樣spring才能找到對應的json解析器對我們的json字元串進行解析。否則會報錯誤:415 unsupported media type
程式中方法調用user的tostring()在控制台列印字段:
user [id=10, username=asd, password=qwe]
對于以上的getuser2()和getuser3()方法,我們通路如:
<code>http://localhost:8080/springmvc/user/getuser3?id=10&password=qwe&username=asd</code>。然後spring會幫我們自動将參數對應user對象的屬性名綁定到方法入參的user對象中(關于複雜對象、集合綁定可參考我後面系列的文章)。根據上面url傳入的參數,spring自動将我們的user對象轉換為json格式字元串輸出,内容如下:
<code>{"id":10,"username":"asd","password":"qwe"}</code>
在前面講解中,我們通過annotationmethodhandleradapter注冊了衆多的資料轉換器,而spring會針對不同的請求響應媒體類型,spring會為我們選擇最恰當的資料轉換器,它是按以下流程進行尋找的:
首先擷取注冊的所有httpmessageconverter集合 然後用戶端的請求header中尋找用戶端可接收的類型,比如 accept application/json,application/xml等,組成一個集合 所有的httpmessageconverter 都有canread和canwrite方法 傳回值都是boolean,看這個httpmessageconverter是否支援目前請求的讀與寫,讀對應@requestbody注解, 寫對應@responsebody注解 周遊httpmessageconverter集合與前面擷取可接受類型進行比對,如果比對直接使用目前第一個比對的httpmessageconverter,然後return(一般是通過accept和傳回值對象的類型進行比對)