用 SpringBoot 和 SSE 打造動態前端更新的終極指南

来源:https://www.cnblogs.com/lyxlucky/Undeclared/17960973
-Advertisement-
Play Games

用 SpringBoot 和 SSE 打造動態前端更新的終極指南 你知道什麼是開發者的夢魘嗎?慢!慢!慢!在一個需要實時數據更新的應用中,如果數據像烏龜一樣慢吞吞地爬行,那用戶體驗就會像坐過山車一樣直線下降。所以今天,我們要化身為數據傳輸的超級英雄,用 SpringBoot 和 SSE(伺服器發送事 ...


用 SpringBoot 和 SSE 打造動態前端更新的終極指南

你知道什麼是開發者的夢魘嗎?慢!慢!慢!在一個需要實時數據更新的應用中,如果數據像烏龜一樣慢吞吞地爬行,那用戶體驗就會像坐過山車一樣直線下降。所以今天,我們要化身為數據傳輸的超級英雄,用 SpringBoot 和 SSE(伺服器發送事件)打造一個超酷、超快、而且超實時的數據流!

為什麼選擇 SSE?

在開始我們的冒險之前,先讓我們來談談為什麼要選擇 SSE(伺服器發送事件)。簡單來說,SSE 就像是那個總是知道你需要什麼並且在你還沒說之前就把它送到你面前的超級服務員。它允許伺服器主動將信息“推送”到客戶端,而不是等待客戶端來“詢問”。想象一下,你正在看一場激動人心的球賽直播,而不是每五秒刷新一次頁面,SSE 可以幫你實時看到每一個進球。是不是很酷?

創建控制器

好的,現在讓我們開始編寫一些代碼。首先,我們需要創建一個 SpringBoot 控制器。這個控制器就像是魔法世界的大門,讓所有神奇的事情開始發生。
@RestController
@RequestMapping("/user")
public class UserController {

    private final CopyOnWriteArrayList<SseEmitter> emitters = new CopyOnWriteArrayList<>();

    @Autowired
    private UserMapper userMapper;

    @GetMapping(value = "/get",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public  SseEmitter getAllUsers(){
        SseEmitter emitter = new SseEmitter();
        this.emitters.add(emitter);

        emitter.onCompletion(() -> this.emitters.remove(emitter));
        emitter.onError((e) -> this.emitters.remove(emitter));
        emitter.onTimeout(() -> this.emitters.remove(emitter));

        return emitter;
    }
   @GetMapping("/add")
    public void addUser(){
        User user = new User();
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        user.setUsername(formatter.format(now));
        user.setPassword(UUID.randomUUID().toString());
        userMapper.addUser(user);
        sendToClients();
    }
	

我這裡做的是從資料庫查詢數據實時推送到前端,你也可以換成任何你喜歡的方式,在下麵的方法中

發送數據

現在,是時候學習一些發送數據的魔法咒語了。每當後端有新的數據更新時,我們就可以調用 sendToClients 方法,讓這些數據像小精靈一樣飛到每個客戶端。

    public void sendToClients() {
        List<User> users = userMapper.getUsers();
        for (SseEmitter emitter : emitters) {
            try {
                emitter.send(users);
            } catch (IOException e) {
                emitter.completeWithError(e);
            }
        }
    }

前端實現

接下來,在前端的世界里,我們需要打開一個魔法視窗來接收這些數據。這個魔法視窗就是 JavaScript 的 EventSource。

<!DOCTYPE html>
<html>
<head>
    <title>SSE Example</title>
</head>
<body>
<div id="sse-data"></div>

<script>
    const sseData = document.getElementById("sse-data");

    const eventSource = new EventSource("/user/get");

    eventSource.onmessage = (event) => {
        sseData.innerHTML = event.data;
    };

    eventSource.onerror = (error) => {
        console.error("SSE Error:", error);
    };
</script>
</body>
</html>

整合流程

最後,讓我們把這一切魔法整合在一起。啟動你的 SpringBoot 應用,打開你的前端頁面,你就會看到數據像水一樣流暢地在你眼前流淌。不再是冰冷的靜態頁面,你的應用現在生動、活潑,充滿了魔法的力量!


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

-Advertisement-
Play Games
更多相關文章
  • 前言 在日常開發中vue的模版語法在大多數情況都能夠滿足我們的需求,但是在一些複雜的業務場景中使用模版語法就有些麻煩了。這個時候靈活的JSX/TSX渲染函數就能派上用場了,大多數同學的做法都是將*.vue文件改為*.tsx或者*.jsx文件。其實我們可以直接在*.vue文件中直接使用JSX/TSX渲 ...
  • 本篇的性能優化不是八股文類的優化方案,而是針對具體場景,具體分析,從排查卡頓根因到一步步尋找解決方案,甚至是規避等方案來最終解決性能問題的經歷實操 所以,解決方案可能不通用,不適用於你的場景,但這個解決過程是如何一步步去處理的,解決思路是怎麼樣的,應該還是可以提供一些參考、借鑒意義的 當然,也許你還 ...
  • 圖片上傳 使用了element-plus提供的圖片上傳el-upload組件 <el-upload :show-file-list="false" :auto-upload="false" :on-change="(e) => uploadImage(e, 'background')" > <but ...
  • 截止到2024-1-11,使用的主要軟體的版本如下: 軟體實體 版本 react-native 0.73.1 react 18.2.0 react-native-cli 2.0.1 Android Studio 2022.3.1 Patch3 Android SDK Android SDK Plat ...
  • C 語言簡介 C 語言介紹 C 語言的特性 C 語言相對於其他語言的優勢 C 程式的編譯 C 中的 Hello World 程式 參考文章: C 語言入門:如何編寫 Hello World C 語言函數:入門指南 學習變數、數據類型和運算符 C 中的變數和關鍵字 C 語言中的作用域規則 C 中的數據 ...
  • 思路 在基於 Gin 封裝出屬於自己的 Web 框架前,你需要先瞭解 Gin 的基本用法和設計理念。 然後,你可以通過以下步驟來封裝自己的 Web 框架: 封裝路由:Gin 的路由是通過 HTTP 方法和 URL 路徑進行匹配的,你可以根據自己的需求,封裝出符合應用的業務需求的路由。你可以考慮將路由 ...
  • 通過上一篇博客,我們成功將有角度的圖片進行“擺正”,接下來我們來提取圖片中的文字。 我們使用Tesseract來處理圖片並提取文字,相關下載安裝請參考:Python下Tesseract Ocr引擎及安裝介紹 - 黯然銷魂掌2015 - 博客園 (cnblogs.com) 同時我們需要下載第三方Lib ...
  • Java中引用類型及特點 強 引用: 最普通的引用 Object o = new Object() 軟 引用: 垃圾回收器, 記憶體不夠的時候回收 (緩存) 弱 引用: 垃圾回收器看見就會回收 (防止記憶體泄漏) 虛 引用: 垃圾回收器看見二話不說就回收,跟沒有一樣 (管理堆外記憶體) DirectByt ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...