Quelqu’un peut-il expliquer le mappage de servlet?

J’essaie d’écrire une application Web avec SpringMVC. Normalement, je mapperais simplement une extension de fichier créée sur le contrôleur frontal de Spring et je vivrais heureux, mais cette fois-ci, je vais pour les URL de type REST, sans extension de nom de fichier.

Mapper tout ce qui se trouve sous mon chemin de contexte vers le contrôleur frontal (appelons-le ” app “) signifie que je devrais aussi prendre en charge les fichiers statiques, ce que je préfère ne pas faire (pourquoi réinventer un autre weel?) servlet (appelons-le ” tomcat “) semble être la voie à suivre.

J’ai la chose à faire faire quelque chose comme

 app /   tomcat *.ext  

et répéter ce dernier pour chacune des extensions de fichier de mon contenu statique. Je me demande pourquoi les configurations suivantes, qui pour moi sont équivalentes à celles ci-dessus, ne fonctionnent pas.

   app /*   tomcat *.ext    app /   tomcat /some-static-content-folder/*  

Quelqu’un peut-il nous éclairer?

Je pense que je peux savoir ce qui se passe.

Dans votre fichier web.xml fonctionnel, vous avez défini votre servlet comme servlet par défaut (/ par lui-même est le servlet par défaut appelé s’il n’y a pas d’autres correspondances), il répondra à toute requête ne correspondant pas à un autre mappage.

Dans Failed 1, votre mappage / * semble être un mappage de chemin valide. Avec le mappage / * dans web.xml, il répond à toutes les requêtes sauf les autres mappages de chemins. Selon les spécifications, les mappages d’extension sont des mappages implicites écrasés par des mappages explicites. C’est pourquoi le mappage d’extension a échoué. Tout était explicitement associé à l’application.

Dans Failed 2, App est responsable de tout, à l’exception du contenu qui correspond au mappage de contenu statique. Pour montrer ce qui se passe dans le test rapide que j’ai mis en place. Voici un exemple. /some-static-content-folder/ contient test.png

Essayer d’accéder à test.png J’ai essayé:

 /some-static-content-folder/test.png 

et le fichier n’a pas été trouvé. Cependant essayant

 /some-static-content-folder/some-static-content-folder/test.png 

ça revient. Il semble donc que le servlet Tomcat par défaut (au moins 6.0.16) supprime le mappage de servlet et essaiera de trouver le fichier en utilisant le chemin restant. Selon ce post, Servlet pour servir le contenu statique Jetty donne le comportement que vous et moi attendions.

Y a-t-il une raison pour laquelle vous ne pouvez pas faire quelque chose comme mapper un répertoire racine pour vos appels de repos. Quelque chose comme app mappé sur / rest_root / * est responsable de tout ce qui se passe dans le dossier rest_root, mais partout où Tomcat doit le gérer, sauf si vous faites un autre mappage explicite. Je suggère de définir votre servlet de repos sur un mappage de chemin, car il déclare mieux l’intention. Utiliser / ou / * ne semble pas approprié, car vous devez définir les exceptions. En utilisant SO comme exemple, mes mappages restants seraient quelque chose comme

/ users / * pour le servlet utilisateur

/ posts / * pour la servlet de publication

Ordre de cartographie

  1. Explicite (mappages de chemins)
  2. Implicite (mappages d’extension)
  3. Défaut (/)

Veuillez corriger tout ce qui ne va pas.

Pour référence, la “tentative ratée n ° 2” est parfaitement correcte dans la version de Tomcat> = à 6.0.29.

C’était le résultat d’un bug Tomcat qui a été corrigé dans la version 6.0.29:

https://issues.apache.org/bugzilla/show_bug.cgi?id=50026

   app /   default /some-static-content-folder/*  

Je n’ai jamais essayé de mapper une servlet comme celle-ci, mais je dirais que / * commence techniquement à la fois par / et se termine par / *, même si le même caractère est utilisé pour les deux correspondances.