誰でもサーブレットマッピングを説明できますか?
-
04-07-2019 - |
質問
SpringMVCを使用してWebアプリケーションを作成しようとしています。通常、作成されたファイル拡張子をSpringのフロントコントローラーにマップし、楽しくライブしますが、今回はファイル名拡張子のないRESTのようなURLを使用します。
コンテキストパスの下にあるすべてをフロントコントローラーにマッピングする(「 app 」と呼びましょう)ということは、静的ファイルも処理する必要があるということです。さらに別のウィール?)ので、Tomcatのデフォルトサーブレットとの組み合わせ(" tomcat "と呼びましょう)が行く方法のようです。
次のようなことをするようになりました
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>tomcat</servlet-name>
<url-pattern>*.ext</url-pattern>
</servlet-mapping>
そして静的コンテンツのファイル拡張子ごとに後者を繰り返します。次のセットアップは、なぜ上記のセットアップと同等であるのか、うまくいかないのではないかと思っています。
<!-- failed attempt #1 -->
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>tomcat</servlet-name>
<url-pattern>*.ext</url-pattern>
</servlet-mapping>
<!-- failed attempt #2 -->
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>tomcat</servlet-name>
<url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>
誰かが光を当てることができますか?
解決
私は何が起こっているのか知っていると思う。
作業中のweb.xmlで、サーブレットをデフォルトサーブレットに設定しました(/が他に一致しない場合に呼び出されるデフォルトサーブレットです)、別のマッピングに一致しない要求に応答します。
Failed 1では、/ *マッピングは有効なパスマッピングのように見えます。 web.xmlの/ *マッピングを使用すると、他のパスマッピングを除くすべての要求に応答します。仕様によれば、拡張マッピングは、明示的なマッピングによって上書きされる暗黙的なマッピングです。それが拡張マッピングが失敗した理由です。すべてがアプリに明示的にマッピングされました。
Failed 2では、静的コンテンツマッピングに一致するコンテンツを除き、アプリがすべてを担当します。私が設定したクイックテストで何が起こっているかを示すために。以下に例を示します。 / some-static-content-folder /
には test.png
test.pngへのアクセスを試みました:
/some-static-content-folder/test.png
そしてファイルが見つかりませんでした。しかし、しようとしています
/some-static-content-folder/some-static-content-folder/test.png
アップします。そのため、Tomcatのデフォルトサーブレット(少なくとも6.0.16)はサーブレットマッピングを削除し、残りのパスを使用してファイルを見つけようとします。この投稿によると、静的コンテンツを提供するサーブレット Jettyは、あなたと私が期待していた動作を提供します。
残りの呼び出しのためにルートディレクトリをマップするようなことをできない理由があります。 / rest_root / *にマップされたappのようなものは、rest_rootフォルダーで行われるすべての処理を担当しますが、別の明示的なマッピングを行わない限り、Tomcatで処理する必要があります。目的をより適切に宣言するため、残りのサーブレットをパスマッピングに設定することをお勧めします。 /または/ *を使用するのは適切ではないようです。例外をマップする必要があるからです。 SOを例にとると、残りのマッピングは次のようになります
ユーザーサーブレットの場合は/ users / *
/ posts / *投稿サーブレット用
マッピング順序
- 明示的(パスマッピング)
- 暗黙的(拡張マッピング)
- デフォルト(/)
間違ったことを修正してください。
他のヒント
参考のため、「失敗した試行#2」 Tomcatのバージョン&gt; = 6.0.29で完全に正しいです。
バージョン6.0.29で修正されたTomcatバグの結果:
https://issues.apache.org/bugzilla/show_bug.cgi? id = 50026
<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>
このようにサーブレットをマップしようとしたことはありませんが、同じ文字が両方に使用されていても、/ *は技術的には/で始まり、//で終わると 主張します一致。