[JAVA] J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0

** Servlet 4.0 ** prend en charge HTTP / 2 et implémente ** Server Push ** comme API de servlet. Sever Push est l'une des fonctionnalités de HTTP / 2, qui est la possibilité de renvoyer de manière proactive une réponse du serveur sans attendre une demande du client. Actuellement (20 mai 2017), les spécifications sont en cours de développement, mais nous verrons comment les utiliser à partir des contenus publiés.

La description

La spécification Servlet 4.0 actuellement en cours de développement est publiée sur JSR 369. L'une des nouvelles fonctionnalités incluses dans ce JSR 369 est ** HTTP / 2 Server Push **.

Server Push

Jusqu'à HTTP / 1.1, il s'agissait généralement d'une paire de requêtes / réponses sur une seule connexion TCP.

Avec HTTP / 2, il est désormais possible de renvoyer de manière proactive plusieurs réponses de contenu du côté serveur sans attendre une requête d'un client sur la même connexion TCP.

Cette fonctionnalité est appelée ** Server Push **.

Hypothèse: environnement d'exploitation

Utilisez la version bêta de Glass Fish 5 comme serveur d’applications à exécuter.

Méthode de mise en œuvre

1. Créez un projet

Créez un projet JavaEE dans 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. Modifiez pom.xml

2.1. Ajout de dépendances Servlet 4.0

Modifiez le pom.xml contenu dans le projet Java que vous avez créé. Ajoutez les dépendances d'API Servlet 4.0 suivantes. Glass Fish 5 a un Servlet 4.0 intégré, donc la portée est * fournie *.

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.0-b05</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

2.2. Ajouter une définition de build

Ajoutez une définition de build. Il y a trois points de vue supplémentaires comme suit. --Nom du fichier de sortie

<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. Nom du fichier de sortie

Par défaut, la racine de contexte est le nom du fichier WAR. Il peut être défini sur le serveur, mais le nom du fichier de sortie est fixe de sorte qu'il soit aligné comme valeur par défaut.

2.2.2. Paramètres du compilateur

Définissez ** 1.8 ** pour utiliser l'API Java 8.

2.2.3. Paramètres du fichier WAR

Cette fois, par souci de simplicité, nous n'utiliserons pas web.xml car nous définirons le Servlet dans Annotation. Définissez failOnMissingWebXml de sorte qu'il n'y ait aucun avertissement.

3. Implémentation de Server Push

Il n'y a qu'un seul point pour utiliser l'API Server Push. Cela signifie obtenir un objet ** PushBuiler **. La fonction Server Push est implémentée à partir de PushBuilder.

Push Builder l'obtient à partir de HTTPServletRequest:

PushBuilder pushBuilder = request.newPushBuilder();

Pour cet objet PushBuilder acquis, définissez le chemin de placement du contenu que vous souhaitez envoyer par serveur (envoyer au client à l'avance). Voici comment définir le chemin:

pushBuilder.path("bootstrap/css/bootstrap.min.css")

Il est possible de définir en plus les informations d'en-tête et la chaîne de caractères de requête, mais en appelant simplement ** push () ** tel quel, le contenu défini par path () sera envoyé au client.

pushBuilder.push();

Push () efface les informations sur le chemin du contenu. Une fois effacé, vous pouvez réutiliser l'objet PushBuilder et répéter ServerPush.

État de la mise en œuvre de ServerPush

HTTP/1.1 Le HTML est d'abord acquis et la demande de contenu est à nouveau envoyée à la ressource de contenu (CSS / JavaScript / image) à laquelle le lien est attaché. Vous pouvez également vérifier la recréation de la connexion TCP.

HTTP / 2 Server Push Aucun

HTTP / 2 est un protocole qui permet d'effectuer simultanément plusieurs requêtes / réponses au sein d'une même connexion TCP. En fait, après avoir obtenu le HTML pour la première fois, vous pouvez voir que la demande est émise en même temps pour le contenu auquel le lien est attaché.

Implémentation HTTP / 2 Server Push

Vous pouvez voir que le contenu utilisant Server Push est poussé de manière asynchrone.

Résumé

Je trouve pratique que la fonction Server Push soit fournie dans Servlet 4.0 sous une forme standardisée. Bien que ce soit pratique, ce n'est pas comme si vous pouviez pousser quoi que ce soit avec Server, donc je voulais avoir une idée du type d'écran et du contenu à pousser dans le futur.

Recommended Posts

J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
J'ai essayé d'utiliser la fonction de cache d'Application Container Cloud Service
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé d'utiliser le référentiel GitHub comme serveur de bibliothèque
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
[Rails] Je vais expliquer la procédure d'implémentation de la fonction follow en utilisant form_with.
[API] J'ai essayé d'utiliser l'API de recherche par code postal
J'ai essayé de configurer tomcat pour exécuter le servlet.
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'utiliser Gson
J'ai essayé d'utiliser TestNG
J'ai essayé d'utiliser Galasa
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé le nouveau profileur de fonctionnalités d'IntelliJ IDEA 2019.2.
J'ai essayé d'utiliser la boîte à outils de migration pour les fichiers binaires d'application
J'ai essayé d'utiliser Log4j2 sur un serveur Java EE
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
J'ai essayé d'utiliser azure cloud-init
J'ai essayé d'utiliser Apache Wicket
J'ai essayé d'utiliser Java REPL
J'ai essayé le problème FizzBuzz
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai créé le côté serveur du jeu de cartes en ligne ①
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé JAX-RS et pris note de la procédure
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
J'ai essayé de toucher l'application de gestion d'actifs en utilisant l'émulateur du grand livre distribué Scalar DLT
J'ai essayé de développer la fonction de cache d'Application Container Cloud Service dans l'environnement local
J'ai essayé d'utiliser anakia + Jing maintenant
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
[Metal] J'ai essayé de comprendre le flux jusqu'au rendu avec Metal
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
[Rails] Implémentation de la fonction de catégorie multicouche en utilisant l'ascendance "J'ai essayé de créer une fenêtre avec Bootstrap 3"
J'ai essayé d'utiliser Spring + Mybatis + DbUnit
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai lu la source de ArrayList que j'ai lu
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
J'ai lu la source d'Integer
J'ai essayé d'expliquer la méthode
Essayez d'utiliser la fonction de mesure en deux points de Firebase Performance Monitoring. [Android]
J'ai lu la source de Long
J'ai essayé le framework Java "Quarkus"
[Rails] J'ai essayé de supprimer l'application
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
J'ai essayé de résumer les méthodes de Java String et StringBuilder