天天看點

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

文章目錄

  • 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資料

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

步驟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:啟動運作程式

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

JSON普通數組的資料就已經傳遞完成,下面針對JSON對象資料和JSON對象數組的資料該如何傳遞呢?

JSON對象資料

我們會發現,隻需要關注請求和資料如何發送?後端資料如何接收?

請求和資料的發送:

{
	"name":"itcast",
	"age":15
}
           
[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

後端接收資料:

@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
    System.out.println("pojo(json)參數傳遞 user ==> "+user);
    return "{'module':'pojo for json param'}";
}
           

啟動程式通路測試

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

說明:

address為null的原因是前端沒有傳遞資料給後端。

如果想要address也有資料,我們需求修改前端傳遞的資料内容:

{
	"name":"itcast",
	"age":15,
    "address":{
        "province":"beijing",
        "city":"beijing"
    }
}
           

再次發送請求,就能看到address中的資料

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

JSON對象數組

集合中儲存多個POJO該如何實作?

請求和資料的發送:

[
    {"name":"itcast","age":15},
    {"name":"itheima","age":12}
]
           
[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

後端接收資料:

@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資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

小結

SpringMVC接收JSON資料的實作步驟為:

(1)導入jackson包

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

(2)使用PostMan發送JSON資料

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

(3)開啟SpringMVC注解驅動,在配置類上添加@EnableWebMvc注解

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

(4)Controller方法的參數前添加@RequestBody注解

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

知識點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

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

步驟4:檢視控制台

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

通過列印,我們發現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

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

發送請求和資料後,頁面會報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

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

使用其中的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就可以正确的進行日期轉換了

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

步驟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]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

重新啟動伺服器,重新發送請求測試,SpringMVC就可以将日期時間的資料進行轉換

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

@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接口的實作類

[SpringMVC]請求與響應③(JSON資料傳輸參數、日期類型參數傳遞)JSON資料傳輸參數日期類型參數傳遞

架構中有提供很多對應Converter接口的實作類,用來實作不同資料類型之間的轉換,如:

請求參數年齡資料(String→Integer)

日期格式轉換(String → Date)

  • (2) HttpMessageConverter接口

該接口是實作對象與JSON之間的轉換工作

注意:SpringMVC的配置類把@EnableWebMvc當做标配配置上去,不要省略

因為@EnableWebMvc還有一個功能就是:根據類型比對對應的類型轉換器!