<url-pattern>/*</url-pattern>
Das /*
On-Servlet überschreibt alle anderen Servlets, einschließlich aller vom Servlet-Container bereitgestellten Servlets, z. B. das Standardservlet und das JSP-Servlet. Was auch immer Sie anfordern, es wird in diesem Servlet enden. Dies ist daher ein schlechtes URL-Muster für Servlets. Normalerweise möchten Sie nur /*
auf einem verwenden Filter
. Es ist möglich, die Anforderung an jedes der Servlets weiterzuleiten, die durch Aufrufen ein spezifischeres URL-Muster abhören FilterChain#doFilter()
.
<url-pattern>/</url-pattern>
Das /
überschreibt kein anderes Servlet. Es ersetzt nur das integrierte Standardservlet des Servletcontainers für alle Anforderungen, die keinem anderen registrierten Servlet entsprechen. Dies wird normalerweise nur für statische Ressourcen (CSS / JS / image / etc) und Verzeichnislisten aufgerufen. Das integrierte Standardservlet des Servletcontainers kann auch HTTP-Cache-Anforderungen, Medien-Streaming (Audio / Video) und das Herunterladen von Dateien verarbeiten. Normalerweise möchten Sie das Standardservlet nicht überschreiben, da Sie sich sonst um alle seine Aufgaben kümmern müssten, was nicht gerade trivial ist (die JSF-Dienstprogrammbibliothek OmniFaces verfügt über ein Open Source- Beispiel). Dies ist daher auch ein schlechtes URL-Muster für Servlets. Der Grund, warum JSP-Seiten dieses Servlet nicht treffen, liegt daran, dass das integrierte JSP-Servlet des Servletcontainers aufgerufen wird, das standardmäßig bereits dem spezifischeren URL-Muster zugeordnet ist *.jsp
.
<url-pattern></url-pattern>
Dann gibt es noch das leere String-URL-Muster
. Dies wird aufgerufen, wenn der Kontextstamm angefordert wird. Dies unterscheidet sich von dem <welcome-file>
Ansatz, dass es nicht aufgerufen wird, wenn ein Unterordner angefordert wird. Dies ist höchstwahrscheinlich das URL-Muster, nach dem Sie tatsächlich suchen, falls Sie ein " Homepage-Servlet " möchten . Ich muss nur zugeben, dass ich intuitiv erwarten würde, dass das URL-Muster für leere Zeichenfolgen
und das URL-Muster /
für Schrägstriche genau umgekehrt definiert werden, sodass ich verstehen kann, dass viele Starter diesbezüglich verwirrt waren. Aber es ist was es ist.
Front Controller
Falls Sie tatsächlich beabsichtigen , ein Front - Controller - Servlet haben, dann würden Sie am besten auf einem bestimmten URL - Muster Karte wie *.html
, *.do
, /pages/*
, /app/*
usw. Sie können die Front - Controller - URL - Muster und Abdeckung statischen Ressourcen auf einem gemeinsamen URL - Muster verstecken wie /resources/*
, /static/*
etc. mit Hilfe eines Servlet - Filter. Siehe auch So verhindern Sie, dass statische Ressourcen vom Front-Controller-Servlet verarbeitet werden, das auf / * zugeordnet ist . Beachten Sie, dass Spring MVC über ein integriertes Servlet /
für statische Ressourcen verfügt. Daher können Sie den Front-Controller zuordnen, wenn Sie in Spring ein allgemeines URL-Muster für statische Ressourcen konfigurieren. Siehe auch Wie gehe ich mit statischen Inhalten in Spring MVC um?
/**
Muster anzeigt?Ich möchte die Antwort von BalusC durch die Zuordnungsregeln und ein Beispiel ergänzen.
Zuordnungsregeln aus der Servlet 2.5-Spezifikation:
In unserem Beispiel gibt es drei Servlets. / ist das von uns installierte Standardservlet. Tomcat installiert zwei Servlets für jsp und jspx. Also zu kartieren
http://host:port/context/hello
Zuordnen
http://host:port/context/hello.jsp
quelle
Vielleicht müssen Sie auch wissen, wie URLs zugeordnet werden, da ich
404
stundenlang gelitten habe . Es gibt zwei Arten von Handlern, die Anforderungen bearbeiten.BeanNameUrlHandlerMapping
undSimpleUrlHandlerMapping
. Wenn wir a definiert habenservlet-mapping
, verwenden wirSimpleUrlHandlerMapping
. Eine Sache, die wir wissen müssen, ist, dass diese beiden Handler eine gemeinsame Eigenschaft haben,alwaysUseFullPath
die standardmäßig lautetfalse
.false
Dies bedeutet, dass Spring nicht den vollständigen Pfad verwendet, um eine URL einem Controller zuzuordnen. Was heißt das? Es bedeutet, wenn Sie Folgendes definierenservlet-mapping
:Der Handler verwendet das
*
Teil tatsächlich , um die Steuerung zu finden. Auf dem folgenden Controller wird beispielsweise ein404
Fehler angezeigt, wenn Sie ihn mit anfordern/perfix/api/feature/doSomething
Es passt perfekt zusammen, oder? Aber warum
404
. Wie bereits erwähnt, ist der Standardwert vonalwaysUseFullPath
false. Dies bedeutet, dass in Ihrer Anfrage nur/api/feature/doSomething
ein entsprechender Controller gefunden wird, aber kein Controller kümmert sich um diesen Pfad. Sie müssen entweder Ihre URL ändern/perfix/perfix/api/feature/doSomething
oderperfix
aus der MyController-Basis entfernen@RequestingMapping
.quelle
Ich denke, Candys Antwort ist größtenteils richtig. Es gibt einen kleinen Teil, den ich anders denke.
So ordnen Sie den Host zu: port / context / hello.jsp
Ich glaube, warum "/ *" nicht mit host: port / context / hello übereinstimmt, weil es "/ hello" als Pfad anstelle einer Datei behandelt (da es keine Erweiterung hat).
quelle
Der wesentliche Unterschied zwischen
/*
und/
besteht darin, dass ein Servlet mit Zuordnung/*
vor jedem Servlet mit einer Erweiterungszuordnung (wie*.html
) ausgewählt wird, während ein Servlet mit Zuordnung/
erst ausgewählt wird, nachdem Erweiterungszuordnungen berücksichtigt wurden (und für jede Anforderung verwendet wird, die dies nicht tut). passt zu nichts anderem --- es ist das "Standard-Servlet").Insbesondere wird eine
/*
Zuordnung immer vor einer/
Zuordnung ausgewählt. Beides verhindert, dass Anforderungen das eigene Standardservlet des Containers erreichen.Entweder wird nur nach Servlet-Zuordnungen ausgewählt, die exakte Übereinstimmungen (wie
/foo/bar
) aufweisen, und nach Pfadzuordnungen, die länger als/*
(wie/foo/*
) sind. Beachten Sie, dass die Zuordnung leerer Zeichenfolgen genau mit dem Kontext root (http://host:port/context/
) übereinstimmt .Siehe Kapitel 12 der Java-Servlet-Spezifikation, verfügbar in Version 3.1 unter http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html .
quelle