本文转载于http://my.oschina.net/sub/blog/182408?fromerr=8xxvSrQt
在 Web 中,我们通常需要获取 URL 相对于 Webapp 的路径,主要是下面的几个方法:
1
2
3
4
|
request.getServletPath()
request.getPathInfo()
request.getContextPath()
request.getRequestURI()
|
其中 request.getRequestURI() 的返回值包含了 request.getContextPath(),所以是相对于网站的根目录的。
下面我们分析 request.getServletPath() 和 request.getPathInfo()
1. 如果我们的 servlet-mapping 如下配置:
1
2
3
4
|
<
servlet-mapping
>
<
servlet-name
>jetbrick-template
servlet-name
>
<
url-pattern
>*.jetx
url-pattern
>
servlet-mapping
>
|
那么访问: /context/templates/index.jetx
1
2
|
request.getServletPath() ==
"/templates/index.jetx"
request.getPathInfo() == <
null
>
|
2. 如果我们的 servlet-mapping 如下配置:
1
2
3
4
|
<
servlet-mapping
>
<
servlet-name
>jetbrick-template
servlet-name
>
<
url-pattern
>/*
url-pattern
>
servlet-mapping
>
|
1
2
|
request.getServletPath() ==
""
request.getPathInfo() ==
"/templates/index.jetx"
|
1
2
3
4
|
<
servlet-mapping
>
<
servlet-name
>jetbrick-template
servlet-name
>
<
url-pattern
>/template/*
url-pattern
>
servlet-mapping
>
|
那么访问: /context/templates/index.jetx
1
2
|
request.getServletPath() ==
"/templates"
request.getPathInfo() ==
"/index.jetx"
|
总结 :
所以,我们要获取相对于 request.getContextPath() 的路径,我们可以使用如下的代码:
1
2
3
4
5
|
String uri = request.getServletPath();
String pathInfo = request.getPathInfo();
if
(pathInfo !=
null
&& pathInfo.length() >
0
) {
uri = uri + pathInfo;
}
|
或者:
1
2
3
4
5
|
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
if
(contextPath !=
null
&& contextPath.length() >
0
) {
uri = uri.substring(contextPath.length());
}
|
===============================
2013-02-08 补上一个 Tomcat 自身的实现:
catalina.jar, DefaultServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
protected
String getRelativePath(HttpServletRequest request)
{
if
(request.getAttribute(
"javax.servlet.include.request_uri"
) !=
null
)
{
String result = (String)request.getAttribute(
"javax.servlet.include.path_info"
);
if
(result ==
null
) {
result = (String)request.getAttribute(
"javax.servlet.include.servlet_path"
);
}
else
{
result = (String)request.getAttribute(
"javax.servlet.include.servlet_path"
) + result;
}
if
((result ==
null
) || (result.equals(
""
))) {
result =
"/"
;
}
return
result;
}
String result = request.getPathInfo();
if
(result ==
null
) {
result = request.getServletPath();
}
else
{
result = request.getServletPath() + result;
}
if
((result ==
null
) || (result.equals(
""
))) {
result =
"/"
;
}
return
result;
}
|