iT邦幫忙

2023 iThome 鐵人賽

DAY 17
1
Software Development

Spring Boot 零基礎入門系列 第 17

Spring Boot 零基礎入門 (17) - 返回值改成 Json 格式 - @RestController

  • 分享至 

  • xImage
  •  

賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架

哈囉大家好,我是古古

在上一篇文章有先去介紹了 Json 格式,所以我們之後就可以使用 Json 格式,更簡單直覺的去呈現數據了

那麼接著這篇文章,我們就會回到 Spring Boot 程式中,來看一下要怎麼將 MyController 所回傳的值,改成是以 Json 的格式來返回

回顧:到目前為止的返回數據


在上兩篇文章中,我們有添加了一個新的 product 方法,並且為他添加對應的 url 路徑 /product,程式如下:

https://ithelp.ithome.com.tw/upload/images/20231001/20151036CaWRumebDi.png

而我們在上一篇文章中,也有了解到可以將「第一個是蘋果,第二個是橘子」這個人類語言的字串,改成是以下列的 Json 格式來撰寫

{
    "productList": ["蘋果", "橘子"]
}

所以接著這篇文章,我們會實際來修改 product 方法,將 「第一個是蘋果,第二個是橘子」的字串改成是上面的 Json 格式

如何將返回值轉換成是 Json 格式?


如果想要將方法所返回的值,轉換成是 Json 格式 的話,會有兩個步驟:

  1. 在 class 上面加上 @RestController
  2. 將該方法的返回值,改成是一個「Java 中的物件」

以下分別拆成兩點來介紹

步驟一:在 class 上面加上 @RestController


在 Spring Boot 程式中,只要在一個 class 上面加上了 @RestController 之後,就可以使該 class 成為一個 Bean、並且使該 class 中的 @RequestMapping 生效,最後是可以將返回值自動轉成 Json 格式了,因此在使用上可以說是非常的方便,一箭三鵰!

像是我們在 MyController class 中,就有加上 @RestController,所以其實第一個步驟我們已經完成了,接著只要執行第二個步驟即可

https://ithelp.ithome.com.tw/upload/images/20231001/20151036tcrO6MPIEm.png

補充:@Controller 和 @RestController 的差別在哪裡?

只要提到 @RestController,通常就會一起介紹另一個也很像的註解 @Controller

@Controller@RestController 的用途有點類似,不過他們是有一些細微的差別的,以下是他們的共同點和差別:

  • 共同點:都可以將 class 變成 Bean、也都可以將裡面的 @RequestMapping 生效

  • 差別:

    • @Controller:將方法的返回值自動轉換成 前端模板的名字
    • @RestController:將方法的返回值自動轉換成 Json 格式

所以從上面幾點也可以看到,@Controller@RestController 之間最大的差別,就是方法返回值的轉換不同而已

在以前的古老時代,通常都是用 @Controller 來選擇要返回的前端模板給使用者,不過隨著前後端分離的盛行、以及 Json 格式的崛起,因此目前大部分的程式都是使用 @RestController 來實作了

所以大家後續如果需要使用的話,建議優先使用 @RestController 來回傳 Json 格式,而 @Controller 則是有搭配 jsp、thymeleaf...等等這類的前端模板引擎時,再考慮去使用

步驟二:將該方法的返回值,改成是一個「Java 中的物件」


了解了 @RestController 的用法,以及他和 @Controller 之間的差別之後,我們可以說回到「要怎麼將方法的返回值轉換成 Json 格式」這個原本的議題

除了在 MyController class 上面加上 @RestController 之外,下一步我們要做的,就是將方法的返回值,改成是一個「Java 中的物件」

這裡的運作邏輯是這樣的:Spring Boot 程式會將 Java class 中的變數,一一的去對應成 Json 格式中的 Key,而該 Key 的 value 值,就是 Java class 變數中所儲存的值

所以舉一個簡單的例子的話,假設我們有一個 Student 的 class,並且他裡面只有一個 String 類型的變數 name (以及其對應的 getter 和 setter)

public class Student {
    private String name;

    // getter 和 setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

而當我們在 MyController class 中,將這個 Student 的 class 當成返回值直接返回時,Spring Boot 程式到時候就會將 Student 這個 class 中的所有變數,一一轉換成 Json 的 key,然後將該變數的值轉換成對應的 value,最後就可以使用 Json 格式來呈現這個 Java class 中的數據了

https://ithelp.ithome.com.tw/upload/images/20231001/20151036C99P2F7Gkk.png

所以同樣的邏輯,我們一樣是可以為「第一個是蘋果,第二個是橘子」,去創建一個專屬的 class,名字為 Store,並且該 class 中的程式如下:

public class Store {
    public List<String> productList;

    // getter 和 setter
    public List<String> getProductList() {
        return productList;
    }

    public void setProductList(List<String> productList) {
        this.productList = productList;
    }
}

接著,我們就可以透過一樣的邏輯,將 Store 這個 class 當成是返回值,並且在方法中「蘋果」和「橘子」這兩個值,塞到 Store class 中的 productList 裡面,這樣子到時候 Spring Boot 就會自動幫我們把這整個 Store 的 class,一口氣的去轉換成是 Json 格式了!因此結果就會如下圖所示

https://ithelp.ithome.com.tw/upload/images/20231001/20151036cwfpC6ZpMk.png

所以透過這樣子的寫法,我們將來就可以利用 Java class,將我們想要的數據存放在 Java class 中,最後再交由 Spring Boot 一口氣幫我們將該 Java class 轉換成是 Json 格式,這樣不僅可以達到簡潔傳遞數據的目的、同時也降低大家開發的複雜度了!

總結


這篇文章先介紹了 @RestController 的用法,以及介紹了 @Controller@RestController 之間的差別,最後也介紹了要如何透過 Java class 的寫法,讓 Spring Boot 程式一口氣幫我們將該 Java class 轉換成 Json 格式,方便我們進行開發和數據傳遞

那麼到這邊為止,我們算是了解了基本的 Spring MVC 的用法了,我們已經知道要如何使用 @RequestMapping 去進行 url 的路徑對應,以及要如何使用 @RestController 搭配 Java class 的返回值,將返回的數據改成是以 Json 的格式來呈現

那麼在大家對 Spring MVC 有一個初步的認識之後,接著下一篇文章,我們就會接著來介紹 Http 協議中的 http method 部分,介紹什麼是 GET 和 POST,並且要在什麼時機點去使用他們,那我們就下一篇文章見啦!

相關連結



上一篇
Spring Boot 零基礎入門 (16) - Json 格式介紹
下一篇
Spring Boot 零基礎入門 (18) - 常見的 Http method - GET 和 POST
系列文
Spring Boot 零基礎入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言