51

SpringMVC を使用して Web アプリケーションを作成しようとしています。通常は、作成したファイル拡張子を Spring のフロント コントローラーにマッピングするだけで、うまくいきますが、今回は、ファイル名拡張子のない REST のような URL を使用します。

コンテキスト パスの下にあるすべてのものをフロント コントローラー (" app "と呼びましょう) にマッピングするということは、静的ファイルも処理する必要があることを意味します。サーブレット (「 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>

誰でも光を当てることができますか?

4

3 に答える 3

43

何が起こっているのかを知ることができると思います。

作業中の web.xml で、サーブレットをデフォルトのサーブレットに設定しました (/ それ自体が、他に一致するものがない場合に呼び出されるデフォルトのサーブレットです)。別のマッピングと一致しない要求に応答します。

Failed 1 では、/* マッピングは有効なパス マッピングのように見えます。web.xml の /* マッピングを使用すると、他のパス マッピングを除くすべての要求に応答します。仕様によると、拡張マッピングは、明示的なマッピングによって上書きされる暗黙的なマッピングです。そのため、拡張子のマッピングが失敗しました。すべてがアプリに明示的にマップされました。

Failed 2 では、静的コンテンツ マッピングに一致するコンテンツを除いて、App がすべての責任を負います。私が設定したクイックテストで何が起こっているかを示すために。ここに例があります。 /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/* にマップされたアプリのようなものは、rest_root フォルダーで行われるすべてのことに対して責任がありますが、別の明示的なマッピングを作成しない限り、Tomcat によって処理される必要があります。残りのサーブレットをパス マッピングに設定することをお勧めします。これは、インテントをより適切に宣言するためです。例外をマッピングする必要があるため、/ または /* の使用は適切ではないようです。例として SO を使用すると、残りのマッピングは次のようになります。

/users/* ユーザー サーブレットの場合

/posts/* 投稿サーブレット用

マッピング順序

  1. 明示的 (パス マッピング)
  2. 暗黙的 (拡張マッピング)
  3. デフォルト (/)

私が間違っていたことを修正してください。

于 2008-10-28T22:36:29.960 に答える
2

私はこのようなサーブレットをマップしようとしたことはありませんが、両方の一致に同じ文字が使用されている場合でも、技術的には/*は/で始まり/*で終わると主張します

于 2008-10-28T20:32:52.457 に答える