Vamos detalhar o URL completo que um cliente digitaria na barra de endereço para acessar seu servlet:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
As peças são:
- esquema:
http
- nome de anfitrião:
www.example.com
- porta:
80
- caminho de contexto:
awesome-application
- caminho do servlet:
path/to/servlet
- informações do caminho:
path/info
- inquerir:
a=1&b=2
- fragmento:
boo
O URI da solicitação (retornado por getRequestURI ) corresponde às partes 4, 5 e 6.
(aliás, mesmo que você não esteja pedindo isso, o método getRequestURL fornecerá as partes 1, 2, 3, 4, 5 e 6).
Agora:
- a parte 4 (o caminho do contexto) é usada para selecionar seu aplicativo específico dentre muitos outros aplicativos que podem estar em execução no servidor
- A parte 5 (o caminho do servlet) é usada para selecionar um servlet específico dentre muitos outros servlets que podem ser agrupados no WAR do aplicativo
- a parte 6 (as informações do caminho) é interpretada pela lógica do seu servlet (por exemplo, pode apontar para algum recurso controlado por seu servlet).
- A parte 7 (a consulta) também é disponibilizada para o seu servlet usando getQueryString
- a parte 8 (o fragmento) nem é enviada ao servidor e é relevante e conhecida apenas pelo cliente
O seguinte sempre é válido (exceto para diferenças de codificação de URL):
requestURI = contextPath + servletPath + pathInfo
O exemplo a seguir da especificação Servlet 3.0 é muito útil:
Nota: a imagem a seguir, não tenho tempo para recriar em HTML: