カスタム サーブレットを使用した静的コンテンツの提供
にデプロイされた Web アプリケーションの静的コンテンツ (例: 画像、CSS) を提供するには複数のコンテナの場合、カスタム サーブレットを利用して URL の一貫性を確保できます。
サーブレットの要件
解決策
代替ソリューションが提案されましたが、指定された要件を満たすカスタム サーブレット。考えられる実装は次のとおりです。
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); } } }
使用法
<servlet-mapping> <servlet-name>StaticContentServlet</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping>
利点
このカスタム サーブレットは、指定された要件を満たす、信頼性が高くカスタマイズ可能な静的コンテンツの提供を提供します。 。 If-Modified-Since リクエストを処理して条件付きキャッシュを可能にし、サーブレットの init パラメータを介して他の機能 (gzip エンコーディングなど) をサポートするように構成できます。
以上がカスタム サーブレットはどのようにして複数のコンテナに静的 Web コンテンツを効率的に提供できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。