Maison > Java > javaDidacticiel > Comment un servlet personnalisé peut-il servir efficacement du contenu Web statique sur plusieurs conteneurs ?

Comment un servlet personnalisé peut-il servir efficacement du contenu Web statique sur plusieurs conteneurs ?

Barbara Streisand
Libérer: 2024-12-13 10:24:15
original
742 Les gens l'ont consulté

How Can a Custom Servlet Efficiently Serve Static Web Content Across Multiple Containers?

Servir du contenu statique avec un servlet personnalisé

Afin de servir du contenu statique (par exemple, des images, CSS) pour une application Web déployée sur plusieurs conteneurs, un servlet personnalisé peut être utilisé pour garantir une gestion cohérente des URL.

Exigences pour le Servlet

  • Dépendances externes minimales
  • Efficace et fiable
  • Compatibilité avec l'en-tête If-Modified-Since (méthode getLastModified personnalisable)
  • Prise en charge facultative de l'encodage gzip et etags

Solution

Bien qu'une solution alternative ait été suggérée, il est possible de créer une servlet personnalisée qui répond aux exigences énoncées. Voici une implémentation potentielle :

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class StaticContentServlet extends HttpServlet {

  private Path filePath;

  @Override
  public void init() throws ServletException {
    super.init();
    String filePathString = getServletConfig().getInitParameter("filePath");
    if (filePathString == null) {
      throw new ServletException("Missing filePath init parameter");
    }
    filePath = Paths.get(filePathString);
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String path = request.getRequestURI().substring(request.getContextPath().length());
    File file = filePath.resolve(path).toFile();
    if (file.exists()) {
      response.setStatus(HttpServletResponse.SC_OK);
      response.setContentType(Files.probeContentType(file.toPath()));
      if (request.getDateHeader("If-Modified-Since") <= file.lastModified()) {
        response.setDateHeader("Last-Modified", file.lastModified());
      } else {
        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        return;
      }
      Files.copy(file.toPath(), response.getOutputStream());
    } else {
      response.sendError(HttpServletResponse.SC_NOT_FOUND);
    }
  }
}
Copier après la connexion

Utilisation

  • Dans le descripteur de déploiement web.xml, mappez le servlet aux modèles d'URL souhaités. Par exemple :
<servlet-mapping>
  <servlet-name>StaticContentServlet</servlet-name>
  <url-pattern>/static/*</url-pattern>
</servlet-mapping>
Copier après la connexion
  • Dans la méthode init() du servlet, initialisez la variable d'instance filePath à l'emplacement du répertoire de contenu statique. Ce répertoire doit contenir les fichiers statiques relatifs à la racine du contexte.

Avantages

Cette servlet personnalisée fournit un service de contenu statique fiable et personnalisable, répondant aux exigences spécifiées . Il gère les requêtes If-Modified-Since, permettant la mise en cache conditionnelle, et il peut être configuré pour prendre en charge d'autres fonctionnalités (par exemple, l'encodage gzip) via les paramètres d'initialisation de la servlet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal