Давайте разберем полный 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).
Сейчас же:
- часть 4 (контекстный путь) используется для выбора вашего конкретного приложения из множества других приложений, которые могут работать на сервере.
- часть 5 (путь к сервлету) используется для выбора конкретного сервлета из множества других сервлетов, которые могут быть включены в WAR вашего приложения.
- часть 6 (информация о пути) интерпретируется логикой вашего сервлета (например, она может указывать на некоторый ресурс, управляемый вашим сервлетом).
- часть 7 (запрос) также доступна вашему сервлету с помощью getQueryString
- часть 8 (фрагмент) даже не отправляется на сервер, а актуальна и известна только клиенту
Всегда выполняется следующее (за исключением различий в кодировке URL):
requestURI = contextPath + servletPath + pathInfo
Следующий пример из спецификации Servlet 3.0 очень полезен:
Примечание: изображение следует, у меня нет времени воссоздавать в HTML: