Frage

Ich versuche, eine Web-Anwendung mit SpringMVC zu schreiben. Normalerweise würde ich Karte nur einige hergerichtete Dateierweiterung Spring Front Controller und glücklich leben, aber diesmal bin ich für REST-ähnliche URLs gehen, ohne Dateinamenerweiterungen.

Mapping alles unter meinem Kontextpfad an den Front Controller (nennen wir es „ App “) bedeutet, dass ich Pflege von statischen Dateien nehmen sollte, was würde ich lieber nicht tun (warum neu erfinden noch eine weitere weel?), also eine Kombination mit Standard-Servlets tomcat (nennen wir es " Kater ") erscheint der Weg, um zu gehen.

habe ich die Sache etwas zu tun arbeiten wie

<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>

und für jeden der Dateierweiterungen meiner statischen Inhalt der letzteren zu wiederholen. Ich frage mich nur, warum die folgenden Einstellungen, die oben auf die man mir gleichwertig sind, nicht funktionieren.

<!-- 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>

Kann jemand etwas Licht?

War es hilfreich?

Lösung

Ich glaube, ich kann wissen, was los ist.

In Ihrem Arbeits web.xml Sie Ihr Servlet zu der Standard-Servlet festgelegt haben (/ von selbst ist der Standard-Servlet aufgerufen, wenn es keine anderen Spiele sind), wird es jede Anfrage beantworten, die nicht eine andere Zuordnung entspricht.

In fehlgeschlagen 1 Ihr / * Mapping erscheint eine gültige Pfadzuordnung zu sein. Mit der / * Zuordnung in web.xml beantwortet er alle Anfragen außer anderen Pfadzuordnungen. Gemäß der Spezifikation Erweiterungszuordnungen sind implizite Zuordnungen, die durch explizite Zuordnungen überschrieben werden. Deshalb ist die Erweiterung Zuordnung schlug fehl. Alles wurde explizit App abgebildet.

In fehlgeschlagen 2 ist App verantwortlich für alles, außer Inhalt, der die statische Content Mapping übereinstimmt. Um zu zeigen, was in dem Schnelltest geschieht ich eingerichtet. Hier ist ein Beispiel. /some-static-content-folder/ enthält test.png

Der Versuch, test.png zuzugreifen Ich habe versucht:

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

und die Datei wurde nicht gefunden. Allerdings versuchen

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

es kommt. So scheint es, dass die Tomcat-Servlet-Standard (6.0.16 mindestens) fällt die Servletzuordnung und versucht, die Datei zu finden, indem die verbleibende Pfad. Nach diesem Beitrag Servlets für statischen Inhalt Jetty gibt das Verhalten, das Sie und ich erwartet hatten.

Gibt es einen Grund, warum Sie nicht so etwas wie Karte ein Stammverzeichnis für Ihre Erholung Anrufe tun können. So etwas wie App abgebildet / rest_root / * als Sie für alles verantwortlich sind, die in der rest_root Ordner geht weiter, aber nirgendwo sonst sollte von Tomcat behandelt werden, es sei denn, Sie eine andere explizite Zuordnung zu machen. Ich schlage vor, Ihr Rest-Servlet auf ein Pfad-Mapping einstellen, weil es die Absicht besser erklärt. Die Verwendung von / oder / * nicht geeignet erscheinen, da Sie die Ausnahmen kartieren haben. Mit SO als Beispiel, würden meine Ruhe Zuordnungen so etwas wie

  

/ users / * für den Benutzer Servlet

     

/ posts / * für die Beiträge Servlet

Mapping, um

  1. Explicit (Path Mappings)
  2. Implicit (Erweiterung Mappings)
  3. Standard (/)

Bitte korrigieren Sie alles, was ich habe falsch.

Andere Tipps

Als Referenz der "gescheiterte Versuch # 2" ist vollkommen richtig in Tomcat-Version> = 6.0.29 auf.

Es war das Ergebnis eines Tomcat Fehlers, der in der Version 6.0.29 gefixt:

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>

Ich habe noch nie ein Servlet wie dies abzubilden versucht, aber ich würde argumentieren, dass / * ist sowohl technisch beginnt mit / und enden mit / *, obwohl das gleiche Zeichen für beide verwendet wird Streichhölzer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top