10、SpringMVC之處理Ajax請求

来源:https://www.cnblogs.com/Javaer1995/archive/2023/11/01/17792497.html
-Advertisement-
Play Games

創建名為spring_mvc_ajax的新module,過程參考9.1節和9.5節 10.1、SpringMVC處理Ajax請求 10.1.1、頁面請求示例 <input type="button" value="測試SpringMVC處理Ajax請求" onclick="testAjax()"> ...


創建名為spring_mvc_ajax的新module,過程參考9.1節和9.5節

10.1、SpringMVC處理Ajax請求

10.1.1、頁面請求示例

image

<input type="button" value="測試SpringMVC處理Ajax請求" onclick="testAjax()">

<script type="text/javascript">
    function testAjax() {
        // 實例化 XMLHttpRequest 對象
        var xhr = new XMLHttpRequest()

        // 設置請求方式和請求路徑
        // 因為thymeleaf語法只能應用於html的屬性,所以在js中的請求要包含上下文信息
        xhr.open("post","/spring_mvc_ajax/test/ajax?id=1001")

        // 設置請求頭
        // 一般 get 不需要設置,而 post 必須設置請求頭
        // 必須寫在在open()和send()之間
        xhr.setRequestHeader("Content-Type", "application/json")

        // 發送請求
        // JSON.stringify() 是用來將合法的JSON數據字元串化的
        xhr.send( JSON.stringify( {"username":"admin","password":123} ) )

        // 設置 XMLHttpRequest 對象狀態變化事件的處理函數
        xhr.onreadystatechange = function () {
            // readyState的值為4時,表示已獲取到伺服器的響應
            if (xhr.readyState == 4){
                // 在瀏覽器控制台輸出伺服器響應的內容
                console.log(xhr.responseText)
            }
        }
    }
</script>

10.1.2、控制器方法示例

image

    @RequestMapping("/test/ajax")
    public void testAajx(Integer id , HttpServletResponse response) throws IOException {
        // 通過形參獲取 url 中的請求參數
        System.out.println("id:"+id);
        // 通過 HttpServletResponse 對象為 Ajax 請求響應(字元串)數據
        response.getWriter().write("hello,ajax");
    }

10.1.3、測試效果

image

image

image

image

image

10.2、@RequestBody註解的基礎示例

10.2.1、作用

@RequestBody 註解用於將請求體中的內容和控制器方法中的形參進行綁定

10.2.2、控制器方法示例

頁面請求示例,見10.1.1節

image

    @RequestMapping("/test/ajax")
    public void testAajx(Integer id ,@RequestBody String requestBody ,HttpServletResponse response) throws IOException {
        // 通過形參獲取 url 中的請求參數
        System.out.println("id:"+id);

        // 通過 @RequestBody 註解後的形參,獲取請求體中的內容
        System.out.println("requestBody:"+requestBody);

        // 通過 HttpServletResponse 對象為 Ajax 請求響應(字元串)數據
        response.getWriter().write("hello,ajax");
    }

10.2.3、測試效果

image

image

image

10.3、@RequestBody註解的進階示例

10.3.1、前提條件一(引入jackson依賴)

image

        <!--jackson-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.1</version>
        </dependency>

10.3.2、前提條件二(開啟mvc的註解驅動)

image

mvc的註解驅動,在配置視圖控制器和預設的servlet處理器的時候,已經開啟;其重要性不言而喻

    <!--開啟mvc的註解驅動-->
    <mvc:annotation-driven></mvc:annotation-driven>

10.3.3、前提條件三(一個匹配json格式的Java類型)

image

匹配json格式的Java類型,一般是自定義實體類或map類型

package online.liaojy.pojo;

import java.io.Serializable;

/**
 * @author liaojy
 * @date 2023/10/30 - 0:02
 */
public class User implements Serializable {

    private Integer id;

    private String username;

    private String password;

    private Integer age;

    private String gender;

    public User() {
    }

    public User(Integer id, String username, String password, Integer age, String gender) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

10.3.4、頁面請求示例

image

<input type="button" value="測試使用@RequestBody註解處理json格式的請求參數" onclick="testRequestBody()">

<script type="text/javascript">
    function testRequestBody() {
        // 實例化 XMLHttpRequest 對象
        var xhr = new XMLHttpRequest()

        // 設置請求方式和請求路徑
        // 因為thymeleaf語法只能應用於html的屬性,所以在js中的請求要包含上下文信息
        xhr.open("post","/spring_mvc_ajax/test/RequestBody/json")

        // 設置請求頭
        // 一般 get 不需要設置,而 post 必須設置請求頭
        // 必須寫在在open()和send()之間
        xhr.setRequestHeader("Content-Type", "application/json")

        // 發送請求
        // JSON.stringify() 是用來將合法的JSON數據字元串化的
        xhr.send( JSON.stringify( {"username":"admin","password":"123","age":18,"gender":"男"} ) )

        // 設置 XMLHttpRequest 對象狀態變化事件的處理函數
        xhr.onreadystatechange = function () {
            // readyState的值為4時,表示已獲取到伺服器的響應
            if (xhr.readyState == 4){
                // 在瀏覽器控制台輸出伺服器響應的內容
                console.log(xhr.responseText)
            }
        }
    }
</script>

10.3.5、控制器方法示例(自定義實體類)

image

    // 通過 @RequestBody 註解形參,將json格式的請求參數轉換為Java對象(自定義實體類)
    @RequestMapping("/test/RequestBody/json")
    public void testRequestBody(@RequestBody User user,HttpServletResponse response) throws IOException {
        System.out.println("user:"+user);
        response.getWriter().write("hello,RequestBody");
    }

10.3.6、測試效果(自定義實體類)

image

image

image

因為json格式的請求參數中,沒有包含id的鍵值對,所以轉換後的Java實體類對象的id值為null

10.3.7、控制器方法示例(map集合)

image

    // 通過 @RequestBody 註解形參,將json格式的請求參數轉換為Java對象(map集合)
    @RequestMapping("/test/RequestBody/json")
    public void testRequestBody(@RequestBody Map<String,Object> map, HttpServletResponse response) throws IOException {
        System.out.println("map:"+map);
        response.getWriter().write("hello,RequestBody");
    }

10.3.8、測試效果(map集合)

image

image

image

10.4、@ResponseBody註解的基礎示例

10.4.1、作用

@ResponseBody 註解用於將控制器方法的返回值,作為響應報文的響應體,響應到瀏覽器

10.4.2、頁面請求示例

image

<a th:href="@{/test/ResponseBody}">測試通過@ResponseBody註解響應瀏覽器數據</a>

10.4.3、控制器方法示例(沒使用@ResponseBody註解)

image

    @RequestMapping("/test/ResponseBody")
    public String testResponseBody(){
        return "success";
    }

10.4.4、測試效果(沒使用@ResponseBody註解)

image

image

沒使用@ResponseBody註解時,return "success"響應的是success邏輯視圖所對應的頁面

10.4.5、控制器方法示例(有使用@ResponseBody註解)

image

    @RequestMapping("/test/ResponseBody")
    @ResponseBody
    public String testResponseBody(){
        return "success";
    }

10.4.6、測試效果(有使用@ResponseBody註解)

image

image

有使用@ResponseBody註解時,return "success"響應的是success字元串

10.5、@ResponseBody註解的進階示例

10.5.1、前提條件

  • 引入jackson依賴,參考10.3.1節

  • 開啟mvc的註解驅動,參考10.3.2節

  • 一個匹配json格式的Java類型,參考10.3.3節

10.5.2、頁面請求示例

image

<input type="button" value="測試使用@ResponseBody註解響應瀏覽器json格式的數據" onclick="testResponseBody()">

<script type="text/javascript">
    function testResponseBody() {
        // 實例化 XMLHttpRequest 對象
        var xhr = new XMLHttpRequest()

        // 設置請求方式和請求路徑
        // 因為thymeleaf語法只能應用於html的屬性,所以在js中的請求要包含上下文信息
        xhr.open("get","/spring_mvc_ajax/test/ResponseBody/json")

        // 設置請求頭
        // 一般 get 不需要設置,而 post 必須設置請求頭

        // 發送請求
        xhr.send()

        // 設置 XMLHttpRequest 對象狀態變化事件的處理函數
        xhr.onreadystatechange = function () {
            // readyState的值為4時,表示已獲取到伺服器的響應
            if (xhr.readyState == 4){
                // 在瀏覽器控制台輸出伺服器響應的內容
                // JSON.parse()用來將JSON字元串,解析成字元串描述的JavaScript值或對象
                console.log(JSON.parse(xhr.responseText))
            }
        }
    }
</script>

10.5.3、Java對象與Json數據的轉換關係

Java對象 Json數據
實體類 Json對象
map集合 Json對象
list集合 Json數組

10.5.4、控制器方法示例(實體類)

image

使用@ResponseBody註解,可以取代將Java對象通過第三方類庫轉換為Json字元串的繁瑣過程

    @RequestMapping("/test/ResponseBody/json")
    @ResponseBody
    public User testResponseBodyjson(){
        User user = new User(1001, "admin", "123456", 28, "男");
        return user;
    }

10.5.5、測試效果(實體類)

image

image

image

10.5.6、控制器方法示例(map集合)

image

    @RequestMapping("/test/ResponseBody/json")
    @ResponseBody
    public Map<String,Object> testResponseBodyjson(){
        User user1 = new User(1001, "admin1", "123456", 28, "男");
        User user2 = new User(1002, "admin2", "123456", 28, "男");
        User user3 = new User(1003, "admin3", "123456", 28, "男");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("1001",user1);
        map.put("1002",user2);
        map.put("1003",user3);
        return map;
    }

10.5.7、測試效果(map集合)

image

image

image

10.5.8、控制器方法示例(list集合)

image

    @RequestMapping("/test/ResponseBody/json")
    @ResponseBody
    public List<User> testResponseBodyjson(){
        User user1 = new User(1001, "admin1", "123456", 28, "男");
        User user2 = new User(1002, "admin2", "123456", 28, "男");
        User user3 = new User(1003, "admin3", "123456", 28, "男");
        LinkedList<User> users = new LinkedList<User>();
        users.add(user1);
        users.add(user2);
        users.add(user3);
        return users;
    }

10.5.9、測試效果(list集合)

image

image

與map集合轉換後的json相比,list集合轉換後的json外面用的是中括弧(數組的符號),而且還有長度

![image](https://img2023.cnblogs.com/blog/2052479/202311/2052479-20231101173920863-1481359634.png

10.6、@RestController註解

  • @RestController 註解是springMVC提供的一個複合註解;

  • 其標識的位置是在類上面;

  • 其效果相當於為類添加了 @Controller 註解,並且為其中的所有方法都添加了 @ResponseBody 註解

@Controller
public class TestAjaxController {

    @RequestMapping("/test/ResponseBody")
    @ResponseBody
    public String testResponseBody(){
        return "success";
    }

    @RequestMapping("/test/ResponseBody/json")
    @ResponseBody
    public User testResponseBodyjson(){
        User user = new User(1001, "admin", "123456", 28, "男");
        return user;
    }

}
@RestController
public class TestAjaxController {

    @RequestMapping("/test/ResponseBody")
    public String testResponseBody(){
        return "success";
    }

    @RequestMapping("/test/ResponseBody/json")
    public User testResponseBodyjson(){
        User user = new User(1001, "admin", "123456", 28, "男");
        return user;
    }

}

本文來自博客園,作者:Javaer1995,轉載請註明原文鏈接:https://www.cnblogs.com/Javaer1995/p/17792497.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、if語句的分支 分類:單分支,雙分支,多分支,分支嵌套 ()中可以是一個值,也可以是一個表達式 // 單分支 if (條件表達式){ 代碼段 } // 雙分支 if (條件表達式) { 代碼段1 }else { 代碼段2 } // 多分支 if (條件表達式1){ 代碼段1 } else if ...
  • 本文簡介 點贊 + 關註 + 收藏 = 學會了 這幾天在整理書櫃時看到這套書,看到梵高,想起他的點彩畫。 想到點彩畫派,不得不提的一個畫家叫喬治·皮埃爾·秀拉。據說梵高也模仿過他的畫作。 我引用一下維基百科對點彩畫派的解析: 點彩畫派(又稱點描派;英文:Pointillism)是一種用很粗的彩點堆砌 ...
  • OpenKey.Cloud 作為 ChatGPT 生態圈內的重要基礎設施,提供官方 API 的轉發,長久以來一直保持著高穩定性,這是如何做到的?今天就來揭秘 OpenKey 系統的詳細架構圖。 ...
  • 網關上的請求頭和響應頭 當您通過MSE網關將請求轉發到後端服務時,在網關中添加的請求頭(例如 "hello")會在到達後端服務時一併發送給後端服務。您可以在後端服務中通過請求頭獲取該值。 當您在MSE網關中添加響應頭(例如 "good"),該響應頭會在後端服務完成響應之後,由MSE網關添加到響應中。 ...
  • 1. 基礎介紹 ThreadPoolExecutor是Python標準庫concurrent.futures模塊中的一個類,用於實現線程池的功能。 ThreadPoolExecutor模塊相比於threading等模塊,通過submit方法返回的是一個Future對象,它代表了一個未來可期的結果。通 ...
  • 一、寫在前面 使用過chatGPT的同學,可能都會有過這樣的經歷?遇到代碼不會的問題,本能的就會去求助chatGPT,然後並根據chatGPT的回答去優化代碼。但是,沒了梯子的話,chatGPT是不是也幫不上忙了?還是只有我是這樣的情況 ̄□ ̄|| 當然,這也讓我偶然發現這個插件,對於我這種代碼渣渣來 ...
  • 寫來寫去,發現還是寫博客比較隨意,不用考慮那麼的邏輯和語法什麼的,比寫SCI要舒服多了。言歸正傳,這一次我主要做了一個遙感影像生產線,如何理解呢? 它主要就是用來將原始的L1產品,自動處理融合影像,也就是常說的正射影像或者DOM影像,而且支持底圖配準與勻光勻色處理,使用非常方便,支持大批量數據全 自 ...
  • JSON 是一種用於存儲和交換數據的語法。JSON 是文本,使用 JavaScript 對象表示法編寫。 Python 中的 JSON Python 有一個內置的 json 包,可用於處理 JSON 數據。 示例:導入 json 模塊: import json 解析 JSON - 從 JSON 轉換 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...