我正在制作一个简单,非常轻巧的前置控制器。我需要将请求路径与不同的处理程序(操作)匹配,以便选择正确的路径。
在我的本地计算机HttpServletRequest.getPathInfo()
和HttpServletRequest.getRequestURI()
上返回相同的结果。但是我不确定它们会在生产环境中返回什么。
那么,这些方法与我应该选择的方法之间有什么区别?
答案 0 :(得分:401)
我会在这里放一个小比较表(只是为了把它放在某处):
Servlet映射为/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
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
在上面的示例中,服务器正在localhost:8480
上运行,名称30thh.loc
已放入OS hosts
文件中。
<强>评论强>
“+”仅在查询字符串
锚点“#a”未传输到服务器。只有浏览器可以使用它。
如果servlet映射中的url-pattern
未以*
结尾(例如/test
或*.jsp
),则getPathInfo()
会返回{{ 1}}。
如果使用Spring MVC
方法null
返回getPathInfo()
。
方法null
返回上下文路径和会话ID之间的部分。在上面的示例中,值为getServletPath()
在Spring中注意/test?/a?+b
和@RequestMapping
的URL编码部分。它是错误的(当前版本3.2.4),通常是not working as expected。
答案 1 :(得分:70)
getPathInfo()
在URI之后提供额外的路径信息,用于访问您的Servlet,getRequestURI()
提供完整的URI。
我认为它们会有所不同,因为Servlet必须首先配置自己的URI模式;我不认为我曾经从根服务器(/)。
例如,如果Servlet'Foo'映射到URI'/ foo',那么我会想到URI:
/foo/path/to/resource
会导致:
RequestURI = /foo/path/to/resource
和
PathInfo = /path/to/resource
答案 2 :(得分:19)
让我们分解客户端在其地址栏中输入的完整URL以访问您的servlet:
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编码差异除外):
requestURI = contextPath + servletPath + pathInfo
Servlet 3.0 specification中的以下示例非常有用:
注意:图片如下,我没有时间在HTML中重新创建:
答案 3 :(得分:16)
考虑以下servlet conf:
<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>
现在,当我点击网址http://localhost:8084/JSPTemp1/NewServlet/jhi
时,它将调用NewServlet
,因为它与上述模式一起映射。
下面:
getRequestURI() = /JSPTemp1/NewServlet/jhi
getPathInfo() = /jhi
我们有那些:
getPathInfo()
<强>返回强>
一个字符串,由Web容器解码,指定在servlet路径之后但在请求URL中的查询字符串之前的额外路径信息;如果URL没有任何额外的路径信息,则返回null;
getRequestURI()
<强>返回强>
的URL部分
一个String,包含从协议名称到查询字符串