[JAVA] Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden

** 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.

Erläuterung

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 **.

Annahme: Betriebsumgebung

Verwenden Sie die Beta-Version von Glass Fish 5 als Anwendungsserver zum Ausführen.

Implementierungsmethode

1. Erstellen Sie ein Projekt

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

2. Bearbeiten Sie pom.xml

2.1 Hinzufügen von Servlet 4.0-Abhängigkeiten

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>

2.2 Build-Definition hinzufügen

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>
2.2.1 Name der Ausgabedatei

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.

2.2.2. Compilereinstellungen

Stellen Sie ** 1.8 ** ein, um die Java 8-API zu verwenden.

2.2.3. WAR-Dateieinstellungen

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.

3. Implementierung von Server Push

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.

ServerPush-Implementierungsstatus

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-Server-Push Keine

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.

HTTP / 2 Server Push-Implementierung

Sie können sehen, dass der Inhalt mit Server Push asynchron übertragen wird.

Zusammenfassung

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

Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Ich habe versucht, die Cache-Funktion des Application Container Cloud Service zu verwenden
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, das GitHub-Repository als Bibliotheksserver zu verwenden
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe den neuen Feature-Profiler von IntelliJ IDEA 2019.2 ausprobiert.
Ich habe versucht, das Migration Toolkit für Anwendungsbinärdateien zu verwenden
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe das FizzBuzz-Problem ausprobiert
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe die Serverseite des Online-Kartenspiels gemacht made
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe versucht, die Asset-Management-Anwendung mit dem Emulator des verteilten Hauptbuchs Scalar DLT zu berühren
Ich habe versucht, die Cache-Funktion von Application Container Cloud Service in der lokalen Umgebung zu entwickeln
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
[Metall] Ich habe versucht, den Fluss bis zum Rendern mit Metall herauszufinden
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
[Rails] Implementierung einer mehrschichtigen Kategoriefunktion unter Verwendung der Abstammung "Ich habe versucht, ein Fenster mit Bootstrap 3 zu erstellen"
Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Map Edition ~ ausprobiert
Ich habe die Quelle von Integer gelesen
Ich habe versucht, die Methode zu erklären
Versuchen Sie es mit der Zweipunktmessfunktion von Firebase Performance Monitoring. [Android]
Ich habe die Quelle von Long gelesen
Ich habe das Java-Framework "Quarkus" ausprobiert.
[Rails] Ich habe versucht, die Anwendung zu löschen
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen