Question

J'essaie d'écrire une application Web à l'aide de SpringMVC. Normalement, je mappais simplement une extension de fichier créée sur le contrôleur frontal de Spring et je vivais heureux, mais cette fois, je choisis des URL de type REST, sans extension de nom de fichier.

Mapper tout le contenu de mon chemin de contexte sur le contrôleur frontal (appelons-le " app ") signifie que je devrais également gérer les fichiers statiques, ce que je préférerais ne pas faire (pourquoi réinventer encore une combinaison supplémentaire?), donc une combinaison avec le servlet par défaut de Tomcat (appelons-le " tomcat ") semble être la solution.

J'ai la chose au travail à faire quelque chose comme

<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

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

<!-- failed attempt #1 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

<!-- failed attempt #2 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

Quelqu'un peut-il nous éclairer?

Était-ce utile?

La solution

Je pense pouvoir savoir ce qui se passe.

Dans votre fichier web.xml de travail, vous avez défini votre servlet comme étant le servlet par défaut (/ lui-même est le servlet par défaut appelé s'il n'y a pas d'autre correspondance), il répondra à toute demande ne correspondant à aucun autre mappage.

En cas d'échec 1, votre mappage / * semble être un mappage de chemin valide. Avec le mappage / * dans web.xml, il répond à toutes les demandes sauf les autres mappages de chemin. Selon la spécification d'extension, les mappages sont des mappages implicites qui sont remplacés par des mappages explicites. C'est pourquoi le mappage d'extension a échoué. Tout a été explicitement mappé à l'application.

Dans Échec 2, App est responsable de tout, à l'exception du contenu correspondant 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 essayer

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

ça revient. Il semble donc que le servlet par défaut de Tomcat (au moins 6.0.16) supprime le mappage du servlet et tente de trouver le fichier en utilisant le chemin restant. Selon ce message, servlet pour la diffusion de contenu statique , Jetty décrit le comportement que nous 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 restants. Quelque chose comme app mappée sur / rest_root / * que vous êtes responsable de tout ce qui se passe dans le dossier rest_root, mais n'importe où d'autre devrait être géré par Tomcat, à moins que vous ne fassiez 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 cartographier les exceptions. En utilisant SO comme exemple, mes mappages de repos seraient quelque chose comme

  

/ users / * pour le servlet utilisateur

     

/ posts / * pour le servlet de messages

Ordre de mappage

  1. Explicit (mappages de chemins)
  2. implicite (mappages d'extension)
  3. Par défaut (/)

S'il vous plaît, corrigez tout ce que je me suis trompé.

Autres conseils

Pour référence, la "tentative infructueuse # 2" est parfaitement correct dans la version de Tomcat > = à 6.0.29.

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

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

<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top