** Servlet 4.0 ** unterstützt HTTP / 2 und implementiert ** Server Push ** als Servlet-API. Sever Push ist eine der Funktionen von HTTP / 2, dh die Möglichkeit, eine Antwort vom Server proaktiv zurückzugeben, ohne auf eine Anforderung vom Client zu warten. Derzeit (20. Mai 2017) befinden sich die Spezifikationen in der Entwicklung, wir werden jedoch anhand der veröffentlichten Inhalte untersuchen, wie sie verwendet werden.
Die derzeit in Entwicklung befindliche Servlet 4.0-Spezifikation wird unter [JSR 369] veröffentlicht (https://www.jcp.org/en/jsr/detail?id=369). Eine der neuen Funktionen in diesem JSR 369 ist ** HTTP / 2 Server Push **.
Server Push
Bis zu HTTP / 1.1 waren es normalerweise zwei Anfragen / Antworten auf einer einzelnen TCP-Verbindung.
Mit HTTP / 2 ist es jetzt möglich, proaktiv mehrere Inhaltsantworten von der Serverseite zurückzugeben, ohne auf eine Anforderung von einem Client über dieselbe TCP-Verbindung zu warten.
Diese Funktion heißt ** Server Push **.
Verwenden Sie die Beta-Version von Glass Fish 5 als Anwendungsserver zum Ausführen.
Erstellen Sie ein JavaEE-Projekt in Maven.
mvn archetype:generate \
-DarchetypeGroupId=org.codehaus.mojo.archetypes \
-DarchetypeArtifactId=webapp-javaee7 \
-DarchetypeVersion=1.1 \
-DinteractiveMode=false \
-DgroupId=${GROUP_ID} \
-DartifactId=${ARTIFACT_ID} \
-Dversion=1.0.0-SNAPSHOT \
-Dpackage=${GROUP_ID} \
--batch-mode \
--update-snapshots
Bearbeiten Sie die Datei pom.xml, die in dem von Ihnen erstellten Java-Projekt enthalten ist. Fügen Sie die folgenden Servlet 4.0-API-Abhängigkeiten hinzu. In Glass Fish 5 ist Servlet 4.0 integriert, daher wird der Umfang * bereitgestellt *.
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0-b05</version>
<scope>provided</scope>
</dependency>
</dependencies>
Fügen Sie eine Build-Definition hinzu. Es gibt drei zusätzliche Gesichtspunkte: --Name der Ausgabedatei
<build>
<finalName>serverpush</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<packagingExcludes>
%regex[WEB-INF/lib/javax.servlet-api-.*.jar]
</packagingExcludes>
<webResources>
<resource>
<directory>src/main/resources</directory>
</resource>
</webResources>
</configuration>
</plugin>
</build>
Standardmäßig ist der Kontextstamm der Name der WAR-Datei. Es kann auf dem Server festgelegt werden, aber der Name der Ausgabedatei ist so festgelegt, dass er als Standardwert ausgerichtet ist.
Stellen Sie ** 1.8 ** ein, um die Java 8-API zu verwenden.
Dieses Mal verwenden wir der Einfachheit halber nicht web.xml, da wir das Servlet in Annotation definieren. Stellen Sie failOnMissingWebXml so ein, dass keine Warnungen angezeigt werden.
Es gibt nur einen Punkt, um die Server-Push-API zu verwenden. Es bedeutet, ein ** PushBuiler ** -Objekt zu erhalten. Die Server-Push-Funktion wird von PushBuilder implementiert.
Push Builder erhält es von HTTPServletRequest:
PushBuilder pushBuilder = request.newPushBuilder();
Legen Sie für dieses erfasste PushBuilder-Objekt den Platzierungspfad des Inhalts fest, den Sie für Server Push verwenden möchten (senden Sie ihn vorab an die Clientseite). So legen Sie den Pfad fest:
pushBuilder.path("bootstrap/css/bootstrap.min.css")
Es ist möglich, zusätzlich Header-Informationen und Abfragezeichenfolgen festzulegen. Durch einfaches Aufrufen von ** push () ** wird der durch path () festgelegte Inhalt jedoch an die Clientseite gesendet.
pushBuilder.push();
Push () löscht die Inhaltspfadinformationen. Nach dem Löschen können Sie das PushBuilder-Objekt wiederverwenden und ServerPush wiederholen.
HTTP/1.1 Der HTML-Code wird zuerst abgerufen und die Inhaltsanforderung erneut an die Inhaltsressource (CSS / JavaScript / Bild) gesendet, an die der Link angehängt ist. Sie können auch die Neuerstellung der TCP-Verbindung überprüfen.
HTTP / 2 ist ein Protokoll, mit dem mehrere Anforderungen / Antworten gleichzeitig innerhalb derselben TCP-Verbindung gestellt werden können. Tatsächlich können Sie nach dem ersten Abrufen des HTML-Codes sehen, dass die Anforderung gleichzeitig für den Inhalt ausgegeben wird, an den der Link angehängt ist.
Sie können sehen, dass der Inhalt mit Server Push asynchron übertragen wird.
Ich finde es praktisch, dass die Server-Push-Funktion in Servlet 4.0 in standardisierter Form bereitgestellt wird. Es ist zwar praktisch, aber es ist nicht so, dass Sie mit Server alles pushen können. Deshalb wollte ich ein Gefühl dafür bekommen, welche Art von Bildschirm und welche Inhalte in Zukunft gepusht werden sollten.
Recommended Posts