Unterschied zwischen / und /* im servlet-mapping url-pattern
Den bekannten code:
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Mein Verständnis ist, dass /*
Karten zu http://host:port/context/*
.
Wie etwa /
? Es sicher nicht anzeigen zu http://host:port/context
nur root. In der Tat, es akzeptieren http://host:port/context/hello
aber ablehnen http://host:port/context/hello.jsp
.
Kann mir jemand erklären, wie ist http://host:port/context/hello
abgebildet?
InformationsquelleAutor der Frage Candy Chiu | 2010-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
<url-pattern>/*</url-pattern>
Den
/*
auf ein servlet überschreibt alle anderen servlets, einschließlich aller servlets zur Verfügung gestellt von der servletcontainer wie die Standard-servlet und die JSP-servlet. Was verlangen Sie Feuer, es wird am Ende in das servlet. Das ist so eine schlechte URL-Muster für servlets. In der Regel, die Sie verwenden möchten/*
auf eine- Filter
nur. Es ist in der Lage, die Anfrage weiter zu einer der servlets hören auf eine bestimmte URL-Muster durch den AufrufFilterChain#doFilter()
.<url-pattern>/</url-pattern>
Den
/
nicht überschreiben andere servlet. Es ersetzt nur die servletcontainer ist builtin Standard-servlet für alle Anfragen, die nicht mit jedem anderen registrierten servlet. Dies ist normalerweise nur aufgerufen statischen Ressourcen (CSS/JS/Bild/etc) und Verzeichnislisten. Der servletcontainer ist builtin Standard-servlet ist auch in der Lage den Umgang mit HTTP-cache-Anfragen, Medien (audio/video) - streaming-und Datei-download wird fortgesetzt. In der Regel werden Sie nicht wollen, überschreiben Sie die Standard-servlet, wie Sie ansonsten kümmern sich um alle Ihre Aufgaben, das ist nicht gerade trivial (JSF utility library OmniFaces hat eine open source Beispiel). Dies ist somit auch eine schlechte URL-Muster für servlets. Warum der JSP-Seiten nicht auf dieses servlet, es ist, weil der servletcontainer die vordefinierte JSP-servlet aufgerufen, welches bereits standardmäßig zugeordnet, die auf die spezifischen URL-Muster*.jsp
.<url-pattern></url-pattern>
Dann gibt es auch die leere Zeichenfolge URL-Muster
. Diese wird aufgerufen, wenn der Kontext root angefordert wird. Dies unterscheidet sich von der
<welcome-file - >
Ansatz, dass es nicht aufgerufen, wenn alle Unterordner angefordert wird. Dies ist wahrscheinlich die URL-Muster, die Sie eigentlich suchen, im Fall, dass Sie ein "Startseite-servlet". Ich muss nur zugeben, dass ich würde intuitiv erwarten, dass die leere Zeichenfolge URL-Musterund der slash URL-Muster
/
definiert werden, genau Umgekehrt, von daher kann ich verstehen, dass viele starter waren verwirrt über diese. Aber es ist, was es ist.Front-Controller -
In Fall, dass Sie eigentlich beabsichtigen, ein front controller servlet, dann würden Sie am besten eine Karte auf eine bestimmte URL-Muster wie
*.html
*.do
/pages/*
/app/*
usw. Sie verstecken den front controller URL-Muster und Deckel statische Ressourcen auf einen gemeinsamen URL-Muster wie/resources/*
/static/*
usw. mit Hilfe eines servlet-filter. Siehe auch Wie um zu verhindern, dass statische Ressourcen bearbeitet, die von front controller servlet, die zugeordnet ist /*. Angemerkt sollte werden, dass Spring MVC verfügt über einen eingebauten statischen resource-servlet, so dass ist, warum Sie konnte seine Karte front-controller auf/
wenn Sie konfigurieren eine gemeinsame URL-Muster für statische Ressourcen im Frühling. Siehe auch Wie behandeln Sie statische Inhalte in Spring MVC?InformationsquelleAutor der Antwort BalusC
Möchte ich ergänzen, BalusC Antwort mit der mapping-Regeln und ein Beispiel.
Mapping-Regeln, die von der Servlet-2.5-Spezifikation:
In unserem Beispiel gibt es drei servlets. /ist die Standard-servlet installiert von uns. Tomcat installiert zwei servlets dienen jsp und jspx. So, Karte
http://host:port/context/hello
Map
http://host:port/context/hello.jsp
InformationsquelleAutor der Antwort Candy Chiu
Vielleicht müssen Sie wissen, wie urls zugeordnet sind, auch, da ich gelitten
404
für Stunden. Es gibt zwei Arten von Handlern die Bearbeitung von Anträgen.BeanNameUrlHandlerMapping
undSimpleUrlHandlerMapping
. Wenn wir definierten einservlet-mapping
sind wir mitSimpleUrlHandlerMapping
. Eine Sache, die wir wissen müssen, ist, diese zwei Behandler teilen eine gemeinsame Eigenschaft, die man alsalwaysUseFullPath
standardmäßigfalse
.false
hier bedeutet, ist der Frühling nicht den vollständigen Pfad verwenden, um mapp-eine url zu einem controller. Was bedeutet es? Es bedeutet, wenn Sie definieren einservlet-mapping
:wird der handler tatsächlich die
*
Teil zu finden-controller. Zum Beispiel, die folgenden controller vor einem404
Fehler, wenn Sie es wünschen mit/perfix/api/feature/doSomething
Ist es eine perfekte Ergänzung, richtig? Aber warum
404
. Wie bereits erwähnt, StandardwertalwaysUseFullPath
ist false, was bedeutet, in Ihrem verlangen, nur/api/feature/doSomething
verwendet, um einen entsprechenden Controller, aber es ist kein Controller kümmert sich um das Pfad. Dann müssen Sie entweder ändern Sie Ihre url/perfix/perfix/api/feature/doSomething
oder entfernenperfix
von MyController Basis@RequestingMapping
.InformationsquelleAutor der Antwort hakunami
Ich denke, Candy ' s Antwort ist meist die richtige. Es ist ein kleiner Teil denke ich anders.
Map host:port/Kontext/Hallo.jsp
Ich glaube, der Grund, warum "/*" nicht mit host:port/Kontext/Hallo, weil es leckereien "/hello" als einen Pfad anstelle einer Datei (da es sich nicht um eine Erweiterung).
InformationsquelleAutor der Antwort hehe
Der wesentliche Unterschied zwischen
/*
und/
ist, dass ein servlet mit mapping/*
ausgewählt werden, bevor irgendeine servlet mit einer Erweiterung zuordnen (wie*.html
), während ein servlet mit mapping/
wird nur ausgewählt werden, nach der Erweiterung Zuordnungen gelten (und für jede Anforderung verwendet werden, die nicht mit irgendetwas anderes---es ist die "Standard-servlet").Insbesondere eine
/*
mapping wird immer ausgewählt werden, bevor ein/
mapping. Entweder verhindert, dass alle Anfragen, die vom erreichen des container s eigene Standard-servlet.Entweder wird nur ausgewählt werden, nach der servlet-mappings, die genaue übereinstimmungen (wie
/foo/bar
), und diejenigen, die Pfad-mappings mehr als/*
(wie/foo/*
). Beachten Sie, dass der leere string-mapping ist eine genaue übereinstimmung für das Kontext-Stammverzeichnis (http://host:port/context/
).Siehe Kapitel 12 der Java-Servlet-Spezifikation in der version 3.1 auf http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html.
InformationsquelleAutor der Antwort Robert Tupelo-Schneck