Home > Java > javaTutorial > How Can a Custom Servlet Efficiently Serve Static Web Content Across Multiple Containers?

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

Barbara Streisand
Release: 2024-12-13 10:24:15
Original
742 people have browsed it

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

Serving Static Content with a Custom Servlet

In order to serve static content (e.g., images, CSS) for a web application deployed on multiple containers, a custom servlet can be utilized to ensure consistent URL handling.

Requirements for the Servlet

  • Minimal external dependencies
  • Efficient and reliable
  • Compatibility with If-Modified-Since header (customizable getLastModified method)
  • Optional support for gzip encoding and etags

Solution

While an alternative solution was suggested, it is possible to create a custom servlet that meets the stated requirements. Here's a potential implementation:

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);
    }
  }
}
Copy after login

Usage

  • In the web.xml deployment descriptor, map the servlet to the desired URL patterns. For example:
<servlet-mapping>
  <servlet-name>StaticContentServlet</servlet-name>
  <url-pattern>/static/*</url-pattern>
</servlet-mapping>
Copy after login
  • In the servlet's init() method, initialize the filePath instance variable to the location of the static content directory. This directory should contain the static files relative to the context root.

Benefits

This custom servlet provides reliable and customizable static content serving, meeting the specified requirements. It handles If-Modified-Since requests, allowing for conditional caching, and it can be configured to support other features (e.g., gzip encoding) via the servlet's init parameters.

The above is the detailed content of How Can a Custom Servlet Efficiently Serve Static Web Content Across Multiple Containers?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template