Spring 5和Servlet 4 – PushBuilder

1.簡介

服務器推送技術是HTTP / 2( RFC 7540 )的一部分,它使我們能夠從服務器端主動向客戶端發送資源。與基於HTTP / 1.X拉取的方法相比,這是一個重大變化。

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

2. Maven依賴

讓我們從定義將要使用的依賴關係開始:

<dependency>

 <groupId>org.springframework</groupId>

 <artifactId>spring-webmvc</artifactId>

 <version>5.2.8.RELEASE</version>

 </dependency>

 <dependency>

 <groupId>javax.servlet</groupId>

 <artifactId>javax.servlet-api</artifactId>

 <version>4.0.0</version>

 <scope>provided</scope>

 </dependency>

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

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) –指示我們將用於推送資源的標頭

5.快速範例

為了演示集成,我們將使用一種資源( logo.png創建demo.jsp頁面:

<%@ 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控制器公開兩個終結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方法時,視圖和資源由客戶端使用拉技術發布和使用:

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

Spring
在許多情況下,服務器推送技術可以縮短應用程序頁面的加載時間。話雖如此,我們確實需要考慮,儘管我們減少了延遲,但是我們可以增加帶寬-取決於我們服務的資源數量。

最好將此技術與其他策略(例如緩存,資源最小化和CDN)相結合,並在我們的應用程序上運行性能測試,以確定使用服務器推送的理想端點。

六,結論

在本快速教程中,我們看到了一個示例,該示例說明瞭如何通過PushBuilder接口將服務器推送技術與Spring MVC一起使用,並且將使用它與標準拉技術的加載時間進行了比較。

與往常一樣,源代碼可以在GitHub上找到