web-dev-qa-db-ja.com

サーブレットマッピングのURLパターンのダブルワイルドカード(*)はどういう意味ですか?

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個以上の「ディレクトリ」に一致

19
fegemo

サーブレット仕様(バージョン2.5)のセクション11.2には、次のように記載されています。

Webアプリケーションデプロイメント記述子では、次の構文を使用してマッピングを定義します。

  • 「/」文字で始まり「/ *」サフィックスで終わる文字列は、パスマッピングに使用されます。
  • 接頭辞「*。」で始まる文字列は、拡張マッピングとして使用されます。
  • 「/」文字のみを含む文字列は、アプリケーションの「デフォルト」サーブレットを示します。この場合、サーブレットパスはリクエストURIからコンテキストパスを引いたものであり、パス情報はnullです。
  • 他のすべての文字列は、完全一致のみに使用されます。

だから私は2番目のバリアント(**)は意味がありません。

追伸私はそのようなマッピングを設定しようとしたところ、この正確なURLのみが表示されているようです/shop/**が一致します(Tomcat 6.0.32)。

29
Andrew Logvinov

サーブレット仕様自体(バージョン3.0、第12.2章)では、2種類のワイルドカードマッピングのみが定義されています。

  • URLパターンが「/ *」で終わる場合は、前のパスへのすべてのリクエストに一致します。
  • URLパターンが「*。」で始まる場合、次の拡張子で終わるリソースへのすべてのリクエストに一致します。

例えば。 「/ foo/」は「http:// server/context/foo /」で始まるURLのすべてのリクエストに一致し、「。jsp」は「.jsp」で終わるURLのすべてのリクエストに一致します。

仕様に従って、空の文字列( "")と単一のスラッシュ( "/")には特定の意味があります。 「他のすべての文字列は完全一致のみに使用されます。」

仕様に厳密に従うと、2番目の例はワイルドカードパターンではありませんが、「/ shop/**」と完全に一致する必要があります。ただし、ほとんどのサーブレットコンテナはそれほど厳密ではなく、任意の場所で*ワイルドカードを使用できるようにするか、さらに複雑なパターンマッチングオプションを提供します。

7
jarnbjo

2番目のケースについて話している仕様のどこにもありません。

サーブレット仕様12.2に従って

「/」文字で始まり「/ *」サフィックスで終わる文字列は、パスマッピングに使用されます

All other strings are used for exact matches only.

仕様に従って、2番目は完全一致のみと見なされます。サーバープロバイダーによって異なる場合があります。

3
kosa