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-mvc和servlet-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
方法時,視圖和資源由客戶端使用拉技術發布和使用:
當我們調用demoWithPush
方法時,我們可以看到推送服務器的使用以及服務器如何提前交付資源,從而縮短了加載時間:
在許多情況下,服務器推送技術可以縮短應用程序頁面的加載時間。話雖如此,我們確實需要考慮,儘管我們減少了延遲,但是我們可以增加帶寬-取決於我們服務的資源數量。
最好將此技術與其他策略(例如緩存,資源最小化和CDN)相結合,並在我們的應用程序上運行性能測試,以確定使用服務器推送的理想端點。
六,結論
在本快速教程中,我們看到了一個示例,該示例說明瞭如何通過PushBuilder
接口將服務器推送技術與Spring MVC一起使用,並且將使用它與標準拉技術的加載時間進行了比較。
與往常一樣,源代碼可以在GitHub上找到。