51 votes

Quelqu'un peut-il expliquer le servlet de la cartographie?

Je suis en train d'écrire une application web à l'aide de spring mvc. Normalement, je venais de la carte un fichier de l'extension de Printemps avant du contrôleur et de vivre heureux, mais cette fois, je vais pour le RESTE-comme Url, sans extensions de nom de fichier.

La cartographie de tout sous mon chemin de contexte pour le contrôleur frontal (appelons-le "app") signifie que je dois prendre soin de fichiers statiques, aussi, quelque chose que je préfère ne pas le faire (pourquoi réinventer encore un autre bien?), donc une combinaison avec tomcat par défaut de servlet (appelons-le "tomcat") semble être la voie à suivre.

J'ai eu la chose à 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 en répétant le dernier pour chacune des extensions de fichier de mon contenu statique. Je me demandais simplement pourquoi les paramétrages suivants, 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 jeter un peu de lumière?

43voto

Philip T. Points 1493

Je pense que je peut savoir ce qui se passe.

Dans votre travail web.xml vous avez défini votre servlet par défaut servlet (/ par lui-même est la valeur par défaut de servlet appelle si il n'y a pas d'autres matchs), il répondra à toute demande qui ne correspond pas à un autre de la cartographie.

À l'Échec de l'1 /* cartographie ne semble pas être un chemin d'accès valide la cartographie. Avec l' /* cartographie web.xml il répond à toutes les demandes sauf les autres mappages de chemin d'accès. Selon les spécifications de l'extension des mappages sont implicites mappages sont remplacés par les mappages explicites. C'est pourquoi l'extension de la cartographie a échoué. Tout a été explicitement mappé à l'application.

À l'Échec de l'2, App est responsable de tout, sauf pour le contenu qui correspond au contenu statique de la cartographie. Pour montrer ce qui se passe dans le test rapide j'ai configuré. Ici est un exemple. /some-static-content-folder/ contient test.png

En essayant de test d'accès.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

il se lève. Il semble donc que le par défaut de Tomcat servlet (6.0.16 au moins) les gouttes de la servlet de cartographie et va essayer de trouver le fichier en utilisant le reste du tracé. Selon ce post Servlet pour servir du contenu statique Jetée donne le comportement que vous et moi attendions.

Est-il une raison pour laquelle vous ne pouvez pas faire quelque chose comme la carte d'un répertoire racine de vos appels de repos. Quelque chose comme l'app mappé /rest_root/* que vous êtes responsable de tout ce qui se passe dans le rest_root dossier, mais n'importe où ailleurs, doivent être manipulés par Tomcat, sauf si vous prenez un autre mappage explicite. Je suggère de réglage de votre servlet pour un mappage de chemin d'accès, car il déclare l'intention de mieux. À l'aide de / ou /* ne semble pas appropriée, puisque vous avez à la carte les exceptions. En utilisant par exemple, mon repos mappages serait quelque chose comme

/utilisateurs/* pour les utilisateurs de servlet

/posts/* pour les postes de servlet

La cartographie de l'ordre

  1. Explicite (mappages de Chemin d'accès)
  2. Implicite (mappages d'Extension)
  3. Par défaut (/)

Merci de corriger tout ce que j'ai eu tort.

2voto

Adam Crume Points 7444

Je n'ai jamais essayé de mapper un servlet comme ça, mais je voudrais soutenir que /* est-ce que, techniquement, les deux commencent par / et à la fin avec /*, même si le même caractère est utilisé pour les deux matchs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X