20

シングルまたはダブルのワイルドカードを使用してサーブレットマッピングの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つのワイルドカード(*)についてのみ説明しています。

コードを再確認したところ、二重のワイルドカード(**)が見つかった場所がSpringSimpleUrlHandlerMappingBeanにあることに気付きました。

その場合、それは理にかなっています。クラスdocに従って、 AntPathMatcherを使用します。これは次のように述べています。

マッピングは、次のルールを使用してURLと一致します。1文字に一致*0個以上の文字に一致**パス内の0個以上の「ディレクトリ」に一致

4

3 に答える 3

34

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

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

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

したがって、2番目のバリアント(**)は意味がないと思います。

PSこのようなマッピングを設定しようとしましたが、この正確なURLのみ/shop/**が一致するようです(Tomcat6.0.32)。

于 2012-12-12T15:50:03.447 に答える
8

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

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

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

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

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

于 2012-12-12T16:10:12.553 に答える
4

仕様のどこで2番目のケースについて話しているのかはわかりません。

サーブレット仕様12.2による

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

All other strings are used for exact matches only.

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

于 2012-12-12T16:04:43.603 に答える