Analicemos la URL completa que un cliente escribiría en su barra de direcciones para llegar a su servlet:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
Las partes son:
- esquema:
http
- nombre de host:
www.example.com
- Puerto:
80
- ruta de contexto:
awesome-application
- ruta de servlet:
path/to/servlet
- información de ruta:
path/info
- consulta:
a=1&b=2
- fragmento:
boo
El URI de solicitud (devuelto por getRequestURI ) corresponde a las partes 4, 5 y 6.
(por cierto, aunque no esté solicitando esto, el método getRequestURL le proporcionará las partes 1, 2, 3, 4, 5 y 6).
Ahora:
- la parte 4 (la ruta de contexto) se usa para seleccionar su aplicación particular de muchas otras aplicaciones que pueden estar ejecutándose en el servidor
- la parte 5 (la ruta del servlet) se usa para seleccionar un servlet particular de muchos otros servlets que se pueden agrupar en la WAR de su aplicación
- la parte 6 (la información de ruta) es interpretada por la lógica de su servlet (por ejemplo, puede apuntar a algún recurso controlado por su servlet).
- la parte 7 (la consulta) también está disponible para su servlet usando getQueryString
- la parte 8 (el fragmento) ni siquiera se envía al servidor y es relevante y conocida solo por el cliente
Siempre se cumple lo siguiente (excepto las diferencias de codificación de URL):
requestURI = contextPath + servletPath + pathInfo
El siguiente ejemplo de la especificación Servlet 3.0 es muy útil:
Nota: la imagen sigue, no tengo tiempo para recrear en HTML: