知識庫 / Spring / Spring MVC RSS 訂閱

Spring 和 Servlet 4 – PushBuilder 介紹

Jakarta EE,Spring MVC
HongKong
4
02:08 PM · Dec 06 ,2025

1. 簡介

Server Push 技術——是 HTTP/2 的一部分 (RFC 7540) —— 允許我們主動從服務器端向客户端發送資源。這與 HTTP/1.X 的基於拉取的(pull-based)方法代表了重大變化。

Spring 5 帶來的新功能之一是與 Jakarta EE 8 Servlet 4.0 API 提供的 Server Push 支持。 在本文中,我們將探討 如何使用 Server Push 並將其集成到 Spring MVC 控制器中

2. Maven 依賴

讓我們首先定義我們將使用的依賴項:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>6.1.5</version>
</dependency>
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.1.0-M2</version>
    <scope>provided</scope>
</dependency>

最新版本的 spring-mvcservlet-api 可在 Maven Central 上找到。

3. HTTP/2 要求

為了使用服務器推送功能,我們需要在支持 HTTP/2 和 Servlet 4.0 API 的容器中運行我們的應用程序。 各種容器的配置要求可以在這裏找到,在 Spring wiki

此外,我們需要客户端支持 HTTP/2;當然,大多數 當前瀏覽器 已經支持該功能。

4. PushBuilder 功能

PushBuilder 接口負責實現服務器推送。在 Spring MVC 中,我們可以將PushBuilder 作為@RequestMapping 註解方法參數注入。

此時,需要考慮的是——如果客户端不支持 HTTP/2,則引用將被髮送為 null

以下是PushBuilder 接口提供的核心 API:

  • path (String path) – 指示我們將要發送的資源
  • push() – 將資源發送到客户端
  • addHeader (String name, String value) – 指示我們將用於推送資源的 HTTP 頭

5. 快速示例

為了演示集成,我們將創建一個名為 demo.jsp 的頁面,其中包含一個資源——logo.png

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PushBuilder demo</title>
</head>
<body>
    <span>PushBuilder demo</span>
    <br>
    <img src="<c:url value="/resources/logo.png"/>" alt="Logo" 
      height="126" width="411">
    <br>
    <!--Content-->
</body>
</html>

我們還將暴露兩個端點,使用 PushController 控制器 — 一個使用服務器推送,另一個不使用:

@Controller
public class PushController {

    @GetMapping(path = "/demoWithPush")
    public String demoWithPush(PushBuilder pushBuilder) {
        if (null != pushBuilder) {
            pushBuilder.path("resources/logo.png").push();
        }
        return "demo";
    }

    @GetMapping(path = "/demoWithoutPush")
    public String demoWithoutPush() {
        return "demo";
    }
}

使用 Chrome 開發者工具,我們可以通過調用兩個端點來查看差異。

當調用 demoWithoutPush 方法時,視圖和資源會被客户端使用拉式技術發佈並消費:

當我們調用 demoWithPush 方法時,我們可以看到推送服務器的使用以及資源如何在服務器端提前交付,從而降低了頁面加載時間:

推送技術可以改善應用程序頁面的加載時間,在許多場景下發揮作用。 然而,我們也需要考慮,雖然我們降低了延遲,但可能會增加帶寬——這取決於我們提供的資源數量。

同時,將這項技術與其他策略相結合,例如緩存、資源混淆和 CDN,並在應用程序上運行性能測試,以確定最佳端點以進行服務器推送也是一個好主意。

6. 結論

在本快速教程中,我們演示瞭如何使用 Spring MVC 和 PushBuilder 接口來使用服務器推送技術,並對比了使用它與標準拉取技術時的加載時間。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.