I will put a small comparison table here (just to have it somewhere):
Servlet is mapped as /test%3F/*
and the application is deployed under /app
.
http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
Method URL-Decoded Result
----------------------------------------------------
getContextPath() no /app
getLocalAddr() 127.0.0.1
getLocalName() 30thh.loc
getLocalPort() 8480
getMethod() GET
getPathInfo() yes /a?+b
getProtocol() HTTP/1.1
getQueryString() no p+1=c+d&p+2=e+f
getRequestedSessionId() no S%3F+ID
getRequestURI() no /app/test%3F/a%3F+b;jsessionid=S+ID
getRequestURL() no http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S+ID
getScheme() http
getServerName() 30thh.loc
getServerPort() 8480
getServletPath() yes /test?
getParameterNames() yes [p 2, p 1]
getParameter("p 1") yes c d
In the example above the server is running on the localhost:8480
and the name 30thh.loc
was put into OS hosts
file.
Comments
-
“+” is handled as space only in the query string
-
Anchor “#a” is not transferred to the server. Only the browser can work with it.
-
If the
url-pattern
in the servlet mapping does not end with*
(for example/test
or*.jsp
),getPathInfo()
returnsnull
.
If Spring MVC is used
-
Method
getPathInfo()
returnsnull
. -
Method
getServletPath()
returns the part between the context path and the session ID. In the example above the value would be/test?/a?+b
-
Be careful with URL encoded parts of
@RequestMapping
and@RequestParam
in Spring. It is buggy (current version 3.2.4) and is usually not working as expected.