文章目錄
- JSON資料傳輸參數
-
- JSON普通數組
- JSON對象資料
- JSON對象數組
- 小結
-
- 知識點1:@EnableWebMvc
- 知識點2:@RequestBody
- @RequestBody與@RequestParam差別
- 日期類型參數傳遞
-
- 實作步驟
- @DateTimeFormat
- 内部實作原理
JSON資料傳輸參數
前面我們說過,現在比較流行的開發方式為異步調用。前背景以異步方式進行交換,傳輸的資料使用的是JSON,是以前端如果發送的是JSON資料,後端該如何接收?
對于JSON資料類型,我們常見的有三種:
-
json普通數組(["value1","value2","value3",...])
-
json對象({key1:value1,key2:value2,...})
-
json對象數組([{key1:value1,...},{key2:value2,...}])
對于上述資料,前端如何發送,後端如何接收?
JSON普通數組
步驟1:pom.xml添加依賴
SpringMVC預設使用的是jackson來處理json的轉換,是以需要在pom.xml添加jackson依賴
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
步驟2:PostMan發送JSON資料
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLhRmNzQTOzYDO1gTZ1YGZ4ETZmRjY5MWYiRTNiJzMhR2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
步驟3:開啟SpringMVC注解支援
在SpringMVC的配置類中開啟SpringMVC的注解支援,這裡面就包含了将JSON轉換成對象的功能。
@Configuration
@ComponentScan("com.nefu.controller")
//開啟json資料類型自動轉換
@EnableWebMvc
public class SpringMvcConfig {
}
步驟4:參數前添加@RequestBody
//使用@RequestBody注解将外部傳遞的json數組資料映射到形參的集合對象中作為資料
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println("list common(json)參數傳遞 list ==> "+likes);
return "{'module':'list common for json param'}";
}
步驟5:啟動運作程式
JSON普通數組的資料就已經傳遞完成,下面針對JSON對象資料和JSON對象數組的資料該如何傳遞呢?
JSON對象資料
我們會發現,隻需要關注請求和資料如何發送?後端資料如何接收?
請求和資料的發送:
{
"name":"itcast",
"age":15
}
後端接收資料:
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println("pojo(json)參數傳遞 user ==> "+user);
return "{'module':'pojo for json param'}";
}
啟動程式通路測試
說明:
address為null的原因是前端沒有傳遞資料給後端。
如果想要address也有資料,我們需求修改前端傳遞的資料内容:
{
"name":"itcast",
"age":15,
"address":{
"province":"beijing",
"city":"beijing"
}
}
再次發送請求,就能看到address中的資料
JSON對象數組
集合中儲存多個POJO該如何實作?
請求和資料的發送:
[
{"name":"itcast","age":15},
{"name":"itheima","age":12}
]
後端接收資料:
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json)參數傳遞 list ==> "+list);
return "{'module':'list pojo for json param'}";
}
啟動程式通路測試
小結
SpringMVC接收JSON資料的實作步驟為:
(1)導入jackson包
(2)使用PostMan發送JSON資料
(3)開啟SpringMVC注解驅動,在配置類上添加@EnableWebMvc注解
(4)Controller方法的參數前添加@RequestBody注解
知識點1:@EnableWebMvc
名稱 | @EnableWebMvc |
---|---|
類型 | 配置類注解 |
位置 | SpringMVC配置類定義上方 |
作用 | 開啟SpringMVC多項輔助功能 |
知識點2:@RequestBody
名稱 | @RequestBody |
---|---|
類型 | 形參注解 |
位置 | SpringMVC控制器方法形參定義前面 |
作用 | 将請求中請求體所包含的資料傳遞給請求參數,此注解一個處理器方法隻能使用一次 |
@RequestBody與@RequestParam差別
- 差別
- @RequestParam用于接收url位址傳參,表單傳參【application/x-www-form-urlencoded】
- @RequestBody用于接收json資料【application/json】
- 應用
- 後期開發中,發送json格式資料為主,@RequestBody應用較廣
- 如果發送非json格式資料,選用@RequestParam接收請求參數
日期類型參數傳遞
前面我們處理過簡單資料類型、POJO資料類型、數組和集合資料類型以及JSON資料類型,接下來我們還得處理一種開發中比較常見的一種資料類型,
日期類型
日期類型比較特殊,因為對于日期的格式有N多中輸入方式,比如:
- 2088-08-18
- 2088/08/18
- 08/18/2088
- …
針對這麼多日期格式,SpringMVC該如何接收,它能很好的處理日期類型資料麼?
實作步驟
步驟1:編寫方法接收日期資料
在UserController類中添加方法,把參數設定為日期類型
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date)
System.out.println("參數傳遞 date ==> "+date);
return "{'module':'data param'}";
}
步驟2:啟動Tomcat伺服器
檢視控制台是否報錯,如果有錯誤,先解決錯誤。
步驟3:使用PostMan發送請求
使用PostMan發送GET請求,并設定date參數
http://localhost/dataParam?date=2088/08/08
步驟4:檢視控制台
通過列印,我們發現SpringMVC可以接收日期資料類型,并将其列印在控制台。
這個時候,我們就想如果把日期參數的格式改成其他的,SpringMVC還能處理麼?
步驟5:更換日期格式
為了能更好的看到程式運作的結果,我們在方法中多添加一個日期參數
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,Date date1)
System.out.println("參數傳遞 date ==> "+date);
return "{'module':'data param'}";
}
使用PostMan發送請求,攜帶兩個不同的日期格式,
http://localhost/dataParam?date=2088/08/08&date1=2088-08-08
發送請求和資料後,頁面會報400,控制台會報出一個錯誤
Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ‘2088-08-08’; nested exception is java.lang.IllegalArgumentException]
從錯誤資訊可以看出,錯誤的原因是在将
2088-08-08
轉換成日期類型的時候失敗了,原因是SpringMVC預設支援的字元串轉日期的格式為
yyyy/MM/dd
,而我們現在傳遞的不符合其預設格式,SpringMVC就無法進行格式轉換,是以報錯。
解決方案也比較簡單,需要使用
@DateTimeFormat
使用其中的pattern指定格式
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern="yyyy-MM-dd") Date date1)
System.out.println("參數傳遞 date ==> "+date);
System.out.println("參數傳遞 date1(yyyy-MM-dd) ==> "+date1);
return "{'module':'data param'}";
}
重新啟動伺服器,重新發送請求測試,SpringMVC就可以正确的進行日期轉換了
步驟6:攜帶時間的日期
接下來我們再來發送一個攜帶時間的日期,看下SpringMVC該如何處理?
先修改UserController類,添加第三個參數
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2)
System.out.println("參數傳遞 date ==> "+date);
System.out.println("參數傳遞 date1(yyyy-MM-dd) ==> "+date1);
System.out.println("參數傳遞 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
return "{'module':'data param'}";
}
使用PostMan發送請求,攜帶兩個不同的日期格式,
http://localhost/dataParam?date=2088/08/08&date1=2088-08-08&date2=2088/08/08 8:08:08
重新啟動伺服器,重新發送請求測試,SpringMVC就可以将日期時間的資料進行轉換
@DateTimeFormat
名稱 | @DateTimeFormat |
---|---|
類型 | 形參注解 |
位置 | SpringMVC控制器方法形參前面 |
作用 | 設定日期時間型資料格式 |
相關屬性 | pattern:指定日期時間格式字元串 |
内部實作原理
講解内部原理之前,我們需要先思考個問題:
- 前端傳遞字元串,後端使用日期Date接收
- 前端傳遞JSON資料,後端使用對象接收
- 前端傳遞字元串,後端使用Integer接收
- 背景需要的資料類型有很多種
- 在資料的傳遞過程中存在很多類型的轉換
問:誰來做這個類型轉換?
答:SpringMVC
問:SpringMVC是如何實作類型轉換的?
答:SpringMVC中提供了很多類型轉換接口和實作類
在架構中,有一些類型轉換接口,其中有:
- (1) Converter接口
/**
* S: the source type
* T: the target type
*/
public interface Converter<S, T> {
@Nullable
//該方法就是将從頁面上接收的資料(S)轉換成我們想要的資料類型(T)傳回
T convert(S source);
}
注意:Converter所屬的包為
org.springframework.core.convert.converter
Converter接口的實作類
架構中有提供很多對應Converter接口的實作類,用來實作不同資料類型之間的轉換,如:
請求參數年齡資料(String→Integer)
日期格式轉換(String → Date)
- (2) HttpMessageConverter接口
該接口是實作對象與JSON之間的轉換工作
注意:SpringMVC的配置類把@EnableWebMvc當做标配配置上去,不要省略
因為@EnableWebMvc還有一個功能就是:根據類型比對對應的類型轉換器!