singleまたはdouble wildcardsを使用してサーブレットマッピングのURLパターンを記述することの違いは何ですか?.
例:以下の違いは何ですか?
1)
<servlet-mapping id="...">
<servlet-name>BuyServlet</servlet-name>
<url-pattern>/buy/*</url-pattern>
</servlet-mapping>
2)
<servlet-mapping id="...">
<servlet-name>ShopServlet</servlet-name>
<url-pattern>/shop/**</url-pattern>
</servlet-mapping>
編集:@Andrewは正しい、仕様は1つのワイルドカード(*)についてのみ述べています。
コードをダブルチェックしたところ、ダブルワイルドカード(**)が見つかった場所は、Spring SimpleUrlHandlerMapping Beanにあることがわかりました。
その場合、それは理にかなっています。 クラスドキュメント のように、それは AntPathMatcher を使用します。
マッピングは、次のルールを使用してURLと一致します。 1文字に一致* 0個以上の文字に一致**パス内の0個以上の「ディレクトリ」に一致
サーブレット仕様(バージョン2.5)のセクション11.2には、次のように記載されています。
Webアプリケーションデプロイメント記述子では、次の構文を使用してマッピングを定義します。
- 「/」文字で始まり「/ *」サフィックスで終わる文字列は、パスマッピングに使用されます。
- 接頭辞「*。」で始まる文字列は、拡張マッピングとして使用されます。
- 「/」文字のみを含む文字列は、アプリケーションの「デフォルト」サーブレットを示します。この場合、サーブレットパスはリクエストURIからコンテキストパスを引いたものであり、パス情報はnullです。
- 他のすべての文字列は、完全一致のみに使用されます。
だから私は2番目のバリアント(**
)は意味がありません。
追伸私はそのようなマッピングを設定しようとしたところ、この正確なURLのみが表示されているようです/shop/**
が一致します(Tomcat 6.0.32)。
サーブレット仕様自体(バージョン3.0、第12.2章)では、2種類のワイルドカードマッピングのみが定義されています。
例えば。 「/ foo/」は「http:// server/context/foo /」で始まるURLのすべてのリクエストに一致し、「。jsp」は「.jsp」で終わるURLのすべてのリクエストに一致します。
仕様に従って、空の文字列( "")と単一のスラッシュ( "/")には特定の意味があります。 「他のすべての文字列は完全一致のみに使用されます。」
仕様に厳密に従うと、2番目の例はワイルドカードパターンではありませんが、「/ shop/**」と完全に一致する必要があります。ただし、ほとんどのサーブレットコンテナはそれほど厳密ではなく、任意の場所で*ワイルドカードを使用できるようにするか、さらに複雑なパターンマッチングオプションを提供します。
2番目のケースについて話している仕様のどこにもありません。
「/」文字で始まり「/ *」サフィックスで終わる文字列は、パスマッピングに使用されます
All other strings are used for exact matches only.
仕様に従って、2番目は完全一致のみと見なされます。サーバープロバイダーによって異なる場合があります。