Robię prosty, bardzo lekki kontroler przedni. Muszę dopasować ścieżki żądań do różnych programów obsługi (akcji), aby wybrać właściwy.
Na moim komputerze lokalnym HttpServletRequest.getPathInfo()
i HttpServletRequest.getRequestURI()
zwróć te same wyniki. Ale nie jestem pewien, co zwrócą w środowisku produkcyjnym.
Jaka jest więc różnica między tymi metodami i co powinienem wybrać?
Odpowiedzi:
getPathInfo()
podaje dodatkowe informacje o ścieżce po URI, używane do uzyskania dostępu do twojego serwletu, gdzie asgetRequestURI()
podaje pełny URI.Pomyślałbym, że będą inne, biorąc pod uwagę, że serwlet musi być przede wszystkim skonfigurowany z własnym wzorcem URI; Nie sądzę, żebym kiedykolwiek serwował serwlet z roota (/).
Na przykład, jeśli serwlet „Foo” jest odwzorowany na URI „/ foo”, pomyślałbym, że URI:
Skutkowałoby:
i
źródło
getRequestURI()
daje mi ciąg"/foo/path/to/resource"
zgodnie z oczekiwaniami, alegetPathInfo()
dla tego samegoHttpServletRequest
obiektu daje minull
. Co się dzieje na świecie? EDYCJA: poniżej odpowiada użytkownik „30thh”.Umieszczę tutaj małą tabelę porównawczą (żeby gdzieś ją mieć):
Serwlet jest mapowany jako,
/test%3F/*
a aplikacja jest wdrażana w ramach/app
.http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
W powyższym przykładzie serwer działa na
localhost:8480
i nazwa30thh.loc
została umieszczona whosts
pliku OS .Komentarze
„+” jest traktowane jako spacja tylko w ciągu zapytania
Kotwica „#a” nie jest przesyłana na serwer. Tylko przeglądarka może z nim współpracować.
Jeśli
url-pattern
w mapowaniu serwletu nie kończy się na*
(na przykład/test
lub*.jsp
),getPathInfo()
zwracanull
.Jeśli używany jest Spring MVC
Metoda
getPathInfo()
zwracanull
.Metoda
getServletPath()
zwraca część między ścieżką kontekstu a identyfikatorem sesji. W powyższym przykładzie wartością będzie/test?/a?+b
Bądź ostrożny z URL zakodowane części
@RequestMapping
i@RequestParam
wiosną. Jest wadliwy (aktualna wersja 3.2.4) i zwykle nie działa zgodnie z oczekiwaniami .źródło
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.
znakomity.getRequestURI()
igetRequestURL()
powinny w tym przypadku zwrócić nierozszyfrowaną wartość jsessionidS%3F+ID
. Przynajmniej działa na Tomcat / 8.5.6.Podzielmy pełny adres URL, który klient wpisałby w pasku adresu, aby dotrzeć do twojego serwletu:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
Części to:
http
www.example.com
80
awesome-application
path/to/servlet
path/info
a=1&b=2
boo
Identyfikator URI żądania (zwracany przez getRequestURI ) odpowiada części 4, 5 i 6.
(nawiasem mówiąc, nawet jeśli o to nie prosisz, metoda getRequestURL dostarczy Ci części 1, 2, 3, 4, 5 i 6).
Teraz:
Zawsze obowiązuje (z wyjątkiem różnic w kodowaniu adresów URL):
Poniższy przykład ze specyfikacji Servlet 3.0 jest bardzo pomocny:
Uwaga: obraz poniżej, nie mam czasu na odtworzenie w HTML:
źródło
Rozważmy następującą konfigurację serwletu:
Teraz, kiedy trafię na adres URL
http://localhost:8084/JSPTemp1/NewServlet/jhi
, zostanie wywołanyNewServlet
tak, jak jest mapowany za pomocą wzorca opisanego powyżej.Tutaj:
Mamy takie:
getPathInfo()
getRequestURI()
źródło