web-dev-qa-db-fra.com

Que signifie le double caractère générique (*) sur un modèle d'URL de mappage de servlet?

Je me demande quelle est la différence d'utiliser un simple ou double caractères génériques pour décrire un modèle d'URL sur un mappage de servlet.

Par exemple: quelle est la différence ci-dessous?

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>

EDIT: @Andrew a raison, la spécification ne parle que d'un caractère générique (*).

J'ai revérifié mon code et j'ai remarqué que l'endroit où j'ai trouvé des doubles caractères génériques (**) était dans un bean Spring SimpleUrlHandlerMapping.

Dans ce cas, cela a du sens. Selon la classe doc , il utilise AntPathMatcher , qui déclare:

Le mappage correspond aux URL en utilisant les règles suivantes:? correspond à un caractère * correspond à zéro ou plusieurs caractères ** correspond à zéro ou plusieurs "répertoires" dans un chemin

19
fegemo

La section 11.2 de la spécification de servlet (version 2.5) indique ce qui suit:

Dans le descripteur de déploiement d'application Web, la syntaxe suivante est utilisée pour définir les mappages:

  • Une chaîne commençant par un caractère "/" et se terminant par un suffixe "/ *" est utilisée pour le mappage de chemin.
  • Une chaîne commençant par un préfixe ‘*.’ Est utilisée comme mappage d’extension.
  • Une chaîne contenant uniquement le caractère ‘/’ indique le servlet "par défaut" de l'application. Dans ce cas, le chemin du servlet est l'URI de la demande moins le chemin du contexte et les informations sur le chemin sont nulles.
  • Toutes les autres chaînes sont utilisées uniquement pour les correspondances exactes.

Je suppose donc que la deuxième variante (**) n'a pas de sens.

P.S. Je viens d'essayer de configurer un tel mappage et il semble que seule cette URL exacte /shop/** sera mis en correspondance (Tomcat 6.0.32).

29
Andrew Logvinov

La spécification Servlet elle-même (version 3.0, chapitre 12.2) ne définit que deux types de mappage générique:

  • Si le modèle d'URL se termine par "/ *", il correspond à toutes les demandes du chemin précédent.
  • Si le modèle d'URL commence par "*.", Il fait correspondre toutes les demandes à toute ressource se terminant par l'extension suivante.

Par exemple. "/ foo/" correspondra à toutes les demandes d'URL commençant par "http: // server/context/foo /" et ". jsp" correspondra à toutes les demandes d'URL se terminant par ".jsp".

Suite à la spécification, la chaîne vide ("") et une barre oblique unique ("/") ont des significations spécifiques. "Toutes les autres chaînes sont utilisées uniquement pour les correspondances exactes."

En suivant strictement les spécifications, votre deuxième exemple n'est pas du tout un modèle générique, mais doit correspondre exactement à "/ shop/**". La plupart des conteneurs de servlets sont cependant moins stricts et permettent d'utiliser le caractère générique * à un emplacement arbitraire ou offrent des options de correspondance de modèle encore plus complexes.

7
jarnbjo

Nulle part dans les spécifications en parlant du deuxième cas.

Selon spécification de servlet 12.2

Une chaîne commençant par un caractère "/" et se terminant par un suffixe "/ *" est utilisée pour le mappage de chemin

All other strings are used for exact matches only.

Selon la spécification, la seconde ne sera prise en compte que pour la correspondance exacte. Il peut varier en fonction des fournisseurs de serveurs.

3
kosa