1. ホーム
  2. java

[解決済み] 静的コンテンツ配信用サーブレット

2022-05-09 07:14:33

質問

2 つの異なるコンテナ (Tomcat と Jetty) に Web アプリをデプロイしますが、静的コンテンツを提供するためのデフォルトのサーブレットは、私が使用したい URL 構造を扱う方法が異なっています ( 詳細 ).

したがって、私は、独自の静的コンテンツ(画像、CSSなど)を提供するために、ウェブアプリに小さなサーブレットを含めたいと考えています。サーブレットは、以下のプロパティを持つ必要があります。

  • 外部依存がない
  • シンプルで信頼性の高い
  • 対応機種 If-Modified-Since ヘッダー(つまり、カスタム getLastModified メソッド)
  • (オプション)gzipエンコーディング、etags、...のサポート。

このようなサーブレットはどこかにあるのでしょうか?私が見つけた最も近いものは 例4-10 サーブレットブックから。

更新してください。 私が使いたいURL構造は-一応-シンプルに。

    <servlet-mapping>
            <servlet-name>main</servlet-name>
            <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>/static/*</url-pattern>
    </servlet-mapping>

したがって、すべてのリクエストはメインサーブレットに渡される必要があります。 static というパスがあります。問題は、TomcatのデフォルトのサーブレットはServletPathを考慮しない(だからメインフォルダ内の静的ファイルを探す)のに対して、Jettyは考慮する(だから static フォルダ)。

解決方法は?

結局、自作で StaticServlet . これは If-Modified-Since また、gzipエンコーディングも可能で、war-fileから静的ファイルを提供することもできるはずです。非常に難しいコードではありませんが、全く些細なことでもありません。

コードを公開しています。 StaticServlet.java . お気軽にコメントください。

更新しました。 Khurramは ServletUtils クラスで参照される StaticServlet . これは単に補助的なメソッドを持つクラスで、私のプロジェクトで使用したものです。あなたが必要とする唯一のメソッドは coalesce (SQL関数と同じです COALESCE ). これがそのコードです。

public static <T> T coalesce(T...ts) {
    for(T t: ts)
        if(t != null)
            return t;
    return null;
}