最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MVC如何設(shè)置響應(yīng)

 更新時(shí)間:2025年01月21日 14:40:43   作者:Sunrise_angel  
本文介紹了如何在Spring框架中設(shè)置響應(yīng),并通過(guò)不同的注解返回靜態(tài)頁(yè)面、HTML片段和JSON數(shù)據(jù),此外,還講解了如何設(shè)置響應(yīng)的狀態(tài)碼和Header

本篇文章介紹響應(yīng)相關(guān)的知識(shí), 通過(guò) Spring 來(lái)設(shè)置響應(yīng)中的值, 向客戶(hù)端返回設(shè)置好的響應(yīng).

1. 返回靜態(tài)頁(yè)面

我們首先使用 html 寫(xiě)一個(gè)前端頁(yè)面, 再通過(guò) Spring 方法, 將這個(gè) html 頁(yè)面作為響應(yīng)的內(nèi)容, 展示給用戶(hù).

顯然, 方法返回的只是一個(gè)字符串, 并非 html 展示的頁(yè)面.

如何將 html 頁(yè)面返回給客戶(hù)端呢?? 這需要修改 類(lèi)注解.

若方法返回的是一個(gè)頁(yè)面, 則需要將原來(lái)的類(lèi)注解 @RestController 修改為 @Controller.

接下來(lái), 對(duì)涉及到的幾個(gè)注解逐個(gè)進(jìn)行解釋.

1.1 Spring 默認(rèn)掃描路徑

我們知道, 每一個(gè)路徑, 都對(duì)應(yīng)了一個(gè)方法. 當(dāng)服務(wù)器收到客戶(hù)端的請(qǐng)求時(shí), Spring 就會(huì)根據(jù)請(qǐng)求中的資源路徑, 尋找該路徑對(duì)應(yīng)的方法, 進(jìn)而計(jì)算響應(yīng)結(jié)果, 最后返回響應(yīng).

而 Spring 中有大量的方法存在, 包括使用 Maven 引入的第三方庫(kù), 都存在于 Spring 中. 若 Spring 要掃描所有的方法, 一個(gè)一個(gè)的去進(jìn)行比對(duì), 確定哪個(gè)是資源路徑所對(duì)應(yīng)的方法的話(huà), 那工作量是巨大的.

因此, Spring 有一個(gè)默認(rèn)掃描路徑: 只掃描啟動(dòng)類(lèi)所在的目錄, 及其子目錄.

若請(qǐng)求中資源路徑對(duì)應(yīng)的方法, 屬于啟動(dòng)類(lèi)所在目錄或子目錄時(shí), 會(huì)被 Spring 掃描到:

而當(dāng)請(qǐng)求中資源路徑所對(duì)應(yīng)的方法, 不屬于啟動(dòng)類(lèi)所在目錄或子目錄時(shí), 則 Spring 不會(huì)掃描, 客戶(hù)端就會(huì)顯示錯(cuò)誤:

因此, Spring 也當(dāng)然不會(huì)掃描 Maven 中第三方庫(kù)中的方法.

有了默認(rèn)的掃描路徑, 大大降低了 Spring 的工作量, 提升了開(kāi)發(fā)效率.

1.2 @RestController

雖然 Spring 有默認(rèn)的掃描路徑, 但是當(dāng)項(xiàng)目很大時(shí), 這個(gè)路徑下也是會(huì)有很多的方法存在的.

于是, 可以使用 @RestController 對(duì)類(lèi)進(jìn)行標(biāo)記, Spring 只需掃描被 @RestController 標(biāo)記的類(lèi).

因此, Spring 的掃描對(duì)象為: 默認(rèn)掃描路徑中的類(lèi) && 使用 @RestController 進(jìn)行標(biāo)記的類(lèi)

當(dāng)默認(rèn)路徑下的類(lèi)沒(méi)有使用 @RestController 進(jìn)行標(biāo)記時(shí), 那么 Spring 也不會(huì)進(jìn)行掃描, 進(jìn)一步減少了 Spring 的工作量.

@RestController 的特性如下:

  • 類(lèi)注解. 只能對(duì)類(lèi)進(jìn)行使用
  • 存活于運(yùn)行階段. (整個(gè)項(xiàng)目運(yùn)行時(shí), 都存在)
  • 包含 @Controller 和 @ResponseBody

其中, @Controller 表示返回的是頁(yè)面. @ResponseBody 表示返回的是數(shù)據(jù).

@RestController 也表示返回的是數(shù)據(jù).

由于 @RestController = @Controller + @ResponseBody, 因此, 左右兩側(cè)的注解效果相同:

1.2.1 @Controller => 返回頁(yè)面

@Controller 是一個(gè)類(lèi)注解(只能給類(lèi)使用), 并且使用此注解標(biāo)記類(lèi)時(shí), 表示該類(lèi)中的所有方法(@ResponseBody 標(biāo)記的方法除外, 見(jiàn)下文), 返回的均是頁(yè)面.

因此, 我們將類(lèi)的注釋修改為 @Controller, 就可以返回靜態(tài)頁(yè)面了:

Spring 會(huì)以 resources.static 為該 html 文件的基準(zhǔn)路徑, 掃描指定路徑下的 html 文件, 并返回該 html 構(gòu)造的頁(yè)面. 并且, html 文件的路徑前要加上 /

不過(guò), 現(xiàn)在后端已經(jīng)基本不會(huì)返回頁(yè)面了.

@RequestMapping("/resp")
@Controller // 表示類(lèi)中的方法只能返回頁(yè)面
public class RespController {
    @ResponseBody // 該方法可以返回?cái)?shù)據(jù)
    @RequestMapping("/r1")
    public String returnPage() {
        // 返回頁(yè)面時(shí), 一定要加上 /
        return "/index.html";
    }
}

1.2.2 @ResponseBody

@ResponseBody 既是一個(gè)類(lèi)注解, 也是一個(gè)方法注解, 表示返回的是數(shù)據(jù).

當(dāng)類(lèi)注解為 @Controller 時(shí), 類(lèi)中的方法只能返回頁(yè)面, 若此時(shí)我們想返回?cái)?shù)據(jù), 可以對(duì)方法使用 @ResponseBody 進(jìn)行標(biāo)記, 被標(biāo)記的方法可以返回?cái)?shù)據(jù).

綜上, @RestController, @Controller, @ResponseBody 的使用場(chǎng)景如下:

  • 一個(gè)類(lèi)中, 既有返回頁(yè)面的方法, 也有返回?cái)?shù)據(jù)的方法 ==> 使用 @Controller 對(duì)類(lèi)標(biāo)記, 對(duì)返回?cái)?shù)據(jù)的方法使用 @ResponseBody 標(biāo)記.
  • 如果一個(gè)類(lèi)中所有的方法, 返回的都是數(shù)據(jù) ==> 使用 @RestController 或者 @Controller + @ResponseBody 對(duì)類(lèi)標(biāo)記
  • 如果一個(gè)類(lèi)中所有的方法, 返回的都是頁(yè)面 ==> 使用 @Controller 對(duì)類(lèi)標(biāo)記
  • 類(lèi)必須有 @Controller 注解才能被 Spring 掃描到(@RestController 包含了 @Controller)

2. 返回 HTML

默認(rèn)情況下, 響應(yīng)中的 Content-Type 都是 test/html, 因此, 瀏覽器收到數(shù)據(jù)后, 都會(huì)按照 html 的格式來(lái)解析, 最終展示在頁(yè)面上.

因此, 如果我們想要給客戶(hù)端返回一個(gè) HTML 片段, 那我們無(wú)需任何操作, 直接返回 HTML 代碼即可.

// 返回 HTML 片段
    @ResponseBody
    @RequestMapping("/r3")
    public String returnHTML() {
        return "<h1>這是一個(gè)一級(jí)標(biāo)題</h1>";
    }

2.1 @RequestMapping

@RequestMapping 是一個(gè)類(lèi)注解, 也是一個(gè)方法注解, 既可以對(duì)類(lèi)設(shè)置路徑, 也可以對(duì)方法設(shè)置路徑.

此外, @RequestMapping 還有一些屬性.

2.1.1 produces(修改響應(yīng)的 Content-Type)

但是, 如果我們想要把這個(gè) HTML 代碼, 當(dāng)做一個(gè)普通的字符串去返回, 該怎么辦呢?

顯然, 我們將響應(yīng)的 Content-Type 類(lèi)型修改為純文本格式即可, 即: test/plain

我們可以通過(guò)修改 @RequestMapping 中的 produces 屬性, 來(lái)修改 Content-Type:

這樣, 瀏覽器接收響應(yīng)后, 就會(huì)將 Body 中的內(nèi)容, 以純文本的格式來(lái)解析, 而不是當(dāng)做 HTML .

    // 返回純文本
    @ResponseBody
    @RequestMapping(value = "/r4", produces = "text/plain") // 修改 Content-Type 為純文本格式
    public String returnText() {
        // 當(dāng)成普通字符串返回
        return "<h1>這是一個(gè)一級(jí)標(biāo)題</h1>";
    }

2.1.2 其他屬性

@RequestMapping 中不僅有 produces 這一屬性, 還有其他屬性. 通過(guò)設(shè)置這些屬性值, 可以對(duì)請(qǐng)求或者響應(yīng)中的內(nèi)容做出要求:

  • method: 要求請(qǐng)求的方法必須是什么(如:GET, POST, ....), 否則不處理
  • params: 要求請(qǐng)求中必須包含哪些參數(shù), 否則不處理
  • headers: 要求請(qǐng)求的 header 中必須包含哪些 header 信息, 否則不處理
  • consumes: 要求請(qǐng)求的 Content-Type 必須是什么, 否則不處理
  • produces: 設(shè)置響應(yīng)的 Content-Type 

3. 返回 JSON

Spring 會(huì)根據(jù)返回?cái)?shù)據(jù)的類(lèi)型, 自動(dòng)對(duì) Content-Type 進(jìn)行類(lèi)型的轉(zhuǎn)換.

上文提到, 當(dāng)返回的數(shù)據(jù)是字符串時(shí), 默認(rèn)的 Content-Type 是 text/html; 若想改成其他類(lèi)型, 還需要手動(dòng)進(jìn)行轉(zhuǎn)換.

但是當(dāng)我們返回的數(shù)據(jù)是一個(gè)對(duì)象時(shí), Spring 會(huì)自動(dòng)將這個(gè)對(duì)象序列化為 JSON 格式, 并自動(dòng)將 Content-Type 轉(zhuǎn)換為 application/json:

    // 返回 JSON
    @ResponseBody
    @RequestMapping("/r5")
    public UserInfo returnJson() {
        // 若返回的數(shù)據(jù)是一個(gè)對(duì)象
        // Spring 會(huì)自動(dòng)將響應(yīng)中的 Content-Type 轉(zhuǎn)換為 JSON 格式
        return new UserInfo("dings", "aaa", 1);
    }

4. 設(shè)置狀態(tài)碼

4.1 HttpServletResponse

在后端的 Spring 項(xiàng)目中, 我們既可以通過(guò) HttpServletRequest 來(lái)獲取請(qǐng)求中的信息, 同樣也可以通過(guò) HttpServletResponse 來(lái)設(shè)置響應(yīng)中的信息.

因此, 我們可以拿到 HttpServletResponse 對(duì)象, 進(jìn)而通過(guò) setStatus 方法修改響應(yīng)中的狀態(tài)碼:

    // 設(shè)置狀態(tài)碼
    @ResponseBody
    @RequestMapping("/r6")
    public String setStatus(HttpServletResponse response) {
        // 手動(dòng)將響應(yīng)中的狀態(tài)碼設(shè)置為 404
        response.setStatus(404);
        return "設(shè)置狀態(tài)碼成功!!";
    }

注意: 狀態(tài)碼不影響頁(yè)面的展示!!

不管狀態(tài)碼是什么, 都可以返回我們自定義的內(nèi)容. 至于為什么有些網(wǎng)站的 404 頁(yè)面是一些提示內(nèi)容, 因?yàn)槟莻€(gè)界面也是維護(hù)那個(gè)網(wǎng)站的程序員自己代碼寫(xiě)的.

程序員當(dāng)然也可以將 404 頁(yè)面打扮的很漂亮!! 比如 bilibili:

5. 設(shè)置 Header

后端可以設(shè)置響應(yīng)中的 header, 通過(guò) header 來(lái)向客戶(hù)端傳遞一些信息.

仍然是通過(guò) HttpServletResponse 設(shè)置響應(yīng)中的 header: 

(header 是以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù)的)

    // 設(shè)置 header
    @ResponseBody
    @RequestMapping("/r7")
    public String setHeader(HttpServletResponse response) {
        response.setHeader("myHeader", "hahaha");
        return "設(shè)置 header 成功!!";
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA lombok注解(@Date、@Setter、@Getter)不起作用的解決

    IDEA lombok注解(@Date、@Setter、@Getter)不起作用的解決

    作者在使用Lombok時(shí)遇到問(wèn)題,發(fā)現(xiàn)IntelliJ IDEA需要安裝Lombok插件才能支持Lombok注解,作者通過(guò)安裝Lombok插件并重啟IDEA解決了問(wèn)題,并分享了這一經(jīng)驗(yàn),希望能幫助其他遇到相同問(wèn)題的開(kāi)發(fā)者
    2026-01-01
  • Java從零編寫(xiě)吃貨聯(lián)盟訂餐系統(tǒng)全程講解

    Java從零編寫(xiě)吃貨聯(lián)盟訂餐系統(tǒng)全程講解

    這篇文章主要介紹了Java訂餐系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • Java Collection集合的三種遍歷方式詳解

    Java Collection集合的三種遍歷方式詳解

    Collection集合遍歷的方式有三種,迭代器foreach/增強(qiáng)for循環(huán)lambda表達(dá)式,這篇文章主要介紹了Java Collection集合的三種遍歷方式,需要的朋友可以參考下
    2022-11-11
  • 使用Nexus搭建Maven私服教程的方法步驟

    使用Nexus搭建Maven私服教程的方法步驟

    本文主要介紹了使用Nexus搭建Maven私服教程的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • @Transactional解讀(作用、失效場(chǎng)景與解決方式)

    @Transactional解讀(作用、失效場(chǎng)景與解決方式)

    這篇文章主要介紹了關(guān)于@Transactional作用、失效場(chǎng)景與解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 基于mybatis中<include>標(biāo)簽的作用說(shuō)明

    基于mybatis中<include>標(biāo)簽的作用說(shuō)明

    這篇文章主要介紹了基于mybatis中<include>標(biāo)簽的作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • JAVA十大排序算法之快速排序詳解

    JAVA十大排序算法之快速排序詳解

    這篇文章主要介紹了java中的快速排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • spring單元測(cè)試之@RunWith的使用詳解

    spring單元測(cè)試之@RunWith的使用詳解

    這篇文章主要介紹了spring單元測(cè)試之@RunWith的使用詳解,@RunWith 就是一個(gè)運(yùn)行器,@RunWith(JUnit4.class) 就是指用JUnit4來(lái)運(yùn)行,
    @RunWith(SpringJUnit4ClassRunner.class),讓測(cè)試運(yùn)行于Spring測(cè)試環(huán)境,需要的朋友可以參考下
    2023-12-12
  • JAVA中Collections工具類(lèi)sort()排序方法

    JAVA中Collections工具類(lèi)sort()排序方法

    這篇文章主要介紹了JAVA中Collections工具類(lèi)sort()排序方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-11-11
  • SpringBoot2+Netty+WebSocket(netty實(shí)現(xiàn)websocket支持URL參數(shù))問(wèn)題記錄

    SpringBoot2+Netty+WebSocket(netty實(shí)現(xiàn)websocket支持URL參數(shù))問(wèn)題記錄

    Netty?是一個(gè)利用?Java?的高級(jí)網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個(gè)易于使用的?API?的客戶(hù)端/服務(wù)器框架,這篇文章主要介紹了SpringBoot2+Netty+WebSocket(netty實(shí)現(xiàn)websocket,支持URL參數(shù)),需要的朋友可以參考下
    2023-12-12

最新評(píng)論

綦江县| 兴安县| 垣曲县| 温宿县| 鱼台县| 嫩江县| 桦川县| 浮梁县| 溧水县| 神池县| 伽师县| 海兴县| 九寨沟县| 石狮市| 浙江省| 嫩江县| 通州区| 延长县| 淮阳县| 广宗县| 邛崃市| 安福县| 新建县| 甘谷县| 蒙自县| 连云港市| 托克逊县| 惠来县| 西华县| 庄浪县| 威海市| 巴彦淖尔市| 集安市| 灵宝市| 会宁县| 林口县| 桃江县| 石景山区| 成武县| 麦盖提县| 仙居县|