天天看點

springMVC4(4)json與對象互轉執行個體解析請求響應資料轉換器格式化資料輸入輸出執行個體分析選擇合适的資料轉換器源碼下載下傳

spring3.0的重要接口:httpmessageconveter為我們提供了強大的資料轉換功能,将我們的請求資料轉換為一個java對象,或将java對象轉化為特定格式輸出等。比如我們常見的從前端系統資料庫單擷取json資料并轉化為user對象,或前端擷取使用者資訊,後端輸出user對象轉換為json格式傳輸給前端等。

spring 為我們提供了衆多的httpmessageconveter實作類,其中我們可能用得最多的三個實作類是:

實作類

功能

formhttpmessageconverter

從請求和響應讀取/編寫表單資料。預設情況下,它讀取媒體類型 application/x-www-form-urlencoded 并将資料寫入<code>multivaluemap&lt;string,string&gt;</code>

marshallinghttpmessageconverter

使用 spring 的 marshaller/un-marshaller 讀取/編寫 xml 資料。它轉換媒體類型為 application/xml

mappingjacksonhttpmessageconverter

使用 jackson 的 objectmapper 讀取/編寫 json 資料。它轉換媒體類型為application/json

轉換器的裝配方式有兩種,一種是通過注冊org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter來裝配messageconverters,如下所示:

另一種是啟用注解<code>&lt;mvc:annotation-driven /&gt;</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>&lt;mvc:annotation-driven /&gt;</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&amp;password=qwe&amp;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和傳回值對象的類型進行比對)