ホームページ > Java > &#&チュートリアル > カスタム サーブレットはどのようにして複数のコンテナに静的 Web コンテンツを効率的に提供できるのでしょうか?

カスタム サーブレットはどのようにして複数のコンテナに静的 Web コンテンツを効率的に提供できるのでしょうか?

Barbara Streisand
リリース: 2024-12-13 10:24:15
オリジナル
740 人が閲覧しました

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

カスタム サーブレットを使用した静的コンテンツの提供

にデプロイされた Web アプリケーションの静的コンテンツ (例: 画像、CSS) を提供するには複数のコンテナの場合、カスタム サーブレットを利用して URL の一貫性を確保できます。

サーブレットの要件

  • 最小限の外部依存関係
  • 効率的で信頼性が高い
  • If-Modified との互換性- ヘッダー以降 (カスタマイズ可能な getLastModifiedメソッド)
  • gzip エンコーディングと etag のオプションのサポート

解決策

代替ソリューションが提案されましたが、指定された要件を満たすカスタム サーブレット。考えられる実装は次のとおりです。

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);
    }
  }
}
ログイン後にコピー

使用法

  • web.xml デプロイメント記述子で、サーブレットを目的の URL パターンにマップします。例:
<servlet-mapping>
  <servlet-name>StaticContentServlet</servlet-name>
  <url-pattern>/static/*</url-pattern>
</servlet-mapping>
ログイン後にコピー
  • サーブレットの init() メソッドで、静的コンテンツ ディレクトリの場所に filePath インスタンス変数を初期化します。このディレクトリには、コンテキスト ルートに関連する静的ファイルが含まれている必要があります。

利点

このカスタム サーブレットは、指定された要件を満たす、信頼性が高くカスタマイズ可能な静的コンテンツの提供を提供します。 。 If-Modified-Since リクエストを処理して条件付きキャッシュを可能にし、サーブレットの init パラメータを介して他の機能 (gzip エンコーディングなど) をサポートするように構成できます。

以上がカスタム サーブレットはどのようにして複数のコンテナに静的 Web コンテンツを効率的に提供できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート