Ich mache einen einfachen, sehr leichten Front-Controller. Ich muss Anforderungspfade mit verschiedenen Handlern (Aktionen) abgleichen, um den richtigen auszuwählen.
Auf meinem lokalen Computer HttpServletRequest.getPathInfo()
und HttpServletRequest.getRequestURI()
geben Sie die gleichen Ergebnisse zurück. Ich bin mir jedoch nicht sicher, was sie in der Produktionsumgebung zurückgeben werden.
Also, was ist der Unterschied zwischen diesen Methoden und was soll ich wählen?
Antworten:
getPathInfo()
gibt die zusätzlichen Pfadinformationen nach dem URI an, die für den Zugriff auf Ihr Servlet verwendet werden, wobei asgetRequestURI()
den vollständigen URI angibt.Ich hätte gedacht, dass sie anders sein würden, da ein Servlet zunächst mit einem eigenen URI-Muster konfiguriert werden muss. Ich glaube nicht, dass ich jemals ein Servlet von root (/) serviert habe.
Wenn beispielsweise das Servlet 'Foo' dem URI '/ foo' zugeordnet ist, hätte ich den URI gedacht:
Würde ergeben zu:
und
quelle
getRequestURI()
gibt mir die Zeichenfolge"/foo/path/to/resource"
wie erwartet, abergetPathInfo()
für das gleicheHttpServletRequest
Objekt gibt mirnull
. Was in aller Welt ist los? EDIT: Es wird unten vom Benutzer "30thh" beantwortet.Ich werde hier eine kleine Vergleichstabelle einfügen (nur um sie irgendwo zu haben):
Servlet wird zugeordnet
/test%3F/*
und die Anwendung wird unter bereitgestellt/app
.http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
Im obigen Beispiel läuft der Server auf dem
localhost:8480
und der Name30thh.loc
wurde in die Betriebssystemdateihosts
eingefügt.Bemerkungen
"+" wird nur in der Abfragezeichenfolge als Leerzeichen behandelt
Der Anker "#a" wird nicht auf den Server übertragen. Nur der Browser kann damit arbeiten.
Wenn die
url-pattern
Zuordnung im Servlet nicht mit*
(zum Beispiel/test
oder*.jsp
) endet , wirdgetPathInfo()
zurückgegebennull
.Wenn Spring MVC verwendet wird
Methode gibt
getPathInfo()
zurücknull
.Die Methode
getServletPath()
gibt den Teil zwischen dem Kontextpfad und der Sitzungs-ID zurück. Im obigen Beispiel wäre der Wert/test?/a?+b
Seien Sie vorsichtig mit URL-codierten Teilen von
@RequestMapping
und@RequestParam
im Frühjahr. Es ist fehlerhaft (aktuelle Version 3.2.4) und funktioniert normalerweise nicht wie erwartet .quelle
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.
brillant.getRequestURI()
undgetRequestURL()
sollte in diesem Fall nicht entschlüsselte jsessionid zurückgebenS%3F+ID
. Zumindest bei Tomcat / 8.5.6.Lassen Sie uns die vollständige URL aufschlüsseln, die ein Client in seine Adressleiste eingeben würde, um Ihr Servlet zu erreichen:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
Die Teile sind:
http
www.example.com
80
awesome-application
path/to/servlet
path/info
a=1&b=2
boo
Der Anforderungs-URI (von getRequestURI zurückgegeben ) entspricht den Teilen 4, 5 und 6.
( Übrigens , obwohl Sie nicht danach fragen, würde die Methode getRequestURL Ihnen die Teile 1, 2, 3, 4, 5 und 6 geben).
Jetzt:
Folgendes gilt immer (mit Ausnahme der Unterschiede bei der URL-Codierung):
Das folgende Beispiel aus der Servlet 3.0-Spezifikation ist sehr hilfreich:
Hinweis: Das Bild folgt, ich habe keine Zeit, es in HTML neu zu erstellen:
quelle
Betrachten Sie das folgende Servlet conf:
Wenn ich jetzt auf die URL drücke
http://localhost:8084/JSPTemp1/NewServlet/jhi
, wird sie aufgerufen,NewServlet
wenn sie dem oben beschriebenen Muster zugeordnet wird.Hier:
Wir haben diese:
getPathInfo()
getRequestURI()
quelle