Я делаю простой и очень легкий фронт-контроллер. Мне нужно сопоставить пути запросов к разным обработчикам (действиям), чтобы выбрать правильный.
На моей локальной машине HttpServletRequest.getPathInfo()
и HttpServletRequest.getRequestURI()
возвращаю те же результаты. Но я не уверен, что они вернут в производственной среде.
Итак, в чем разница между этим методом и тем, что мне выбрать?
Ответы:
getPathInfo()
дает дополнительную информацию о пути после URI, используемую для доступа к вашему сервлету, где asgetRequestURI()
дает полный URI.Я бы подумал, что они будут другими, учитывая, что сервлет в первую очередь должен быть настроен с собственным шаблоном URI; Я не думаю, что когда-либо обслуживал сервлет от root (/).
Например, если сервлет «Foo» сопоставлен с URI «/ foo», то я бы подумал, что URI:
Это приведет к:
а также
источник
getRequestURI()
дает мне строку,"/foo/path/to/resource"
как и ожидалось, ноgetPathInfo()
для того жеHttpServletRequest
объекта дает мнеnull
. Что происходит в мире? РЕДАКТИРОВАТЬ: на него ниже отвечает пользователь «30thh».Я помещу сюда небольшую сравнительную таблицу (просто чтобы она где-то была):
Сервлет отображается как,
/test%3F/*
а приложение развертывается под/app
.http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
В приведенном выше примере сервер запущен,
localhost:8480
и имя30thh.loc
было помещено вhosts
файл ОС .Комментарии
"+" обрабатывается как пробел только в строке запроса
Якорь "#a" не передается на сервер. С ним может работать только браузер.
Если
url-pattern
в отображении сервлета не заканчивается*
(например,/test
или*.jsp
),getPathInfo()
возвращаетсяnull
.Если используется Spring MVC
Метод
getPathInfo()
возвращаетсяnull
.Метод
getServletPath()
возвращает часть между контекстным путем и идентификатором сеанса. В приведенном выше примере значение будет/test?/a?+b
Будьте осторожны с URL закодированы частями
@RequestMapping
и@RequestParam
весна. Он содержит ошибки (текущая версия 3.2.4) и обычно не работает должным образом .источник
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.
блестящий.getRequestURI()
иgetRequestURL()
в этом случае должны возвращать не декодированный jsessionidS%3F+ID
. По крайней мере, на Tomcat / 8.5.6.Давайте разберем полный URL-адрес, который клиент вводил бы в свою адресную строку, чтобы добраться до вашего сервлета:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
Части:
http
www.example.com
80
awesome-application
path/to/servlet
path/info
a=1&b=2
boo
URI запроса (возвращаемый getRequestURI ) соответствует частям 4, 5 и 6.
(кстати, даже если вы не просите об этом, метод getRequestURL предоставит вам части 1, 2, 3, 4, 5 и 6).
Сейчас же:
Всегда выполняется следующее (за исключением различий в кодировке URL):
Следующий пример из спецификации Servlet 3.0 очень полезен:
Примечание: изображение следует, у меня нет времени воссоздавать в HTML:
источник
Рассмотрим следующую конфигурацию сервлета:
<servlet> <servlet-name>NewServlet</servlet-name> <servlet-class>NewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>NewServlet</servlet-name> <url-pattern>/NewServlet/*</url-pattern> </servlet-mapping>
Теперь, когда я нажимаю URL-адрес
http://localhost:8084/JSPTemp1/NewServlet/jhi
, он вызывается,NewServlet
поскольку он сопоставлен с шаблоном, описанным выше.Вот:
У нас есть такие:
getPathInfo()
getRequestURI()
источник