先定义几个替换:
http://localhost:8080/ => ip/
/mywar/ => war/
http://localhost:8080/mywar/ => ip/war/
/mywar => [contextpath] (request.getcontextpath())
总结如下:
1. 在jsp中的“/”表示的根为“ip”,不包含war路径
2. 在servlet中以forward方式使用的“/”表示的根为“ip/war/”,包含了war路径
3. 在servlet中以sendredirect方式使用的“/”表示的根为ip,不包含war路径
4. 在servlet中以forward方式跳转,则浏览器的地址栏仍然为此servlet,不会改动
5. 在servlet中以sendredirect方式跳转,则浏览器的地址栏改动为目的路径
6. 相对路径的确定是以浏览器的地址栏显示的路径为基准的,而非具体的目录结构,所以
跳转到同目录下的某个页面使用<a href="文件名">link</a>这种方式不是永久成立的
(做asp的人不要惊讶,这里说的jsp和servlet
)
7. 为了避免jsp跳jsp,servlet跳jsp,forward方式跳转,sendredirect跳转产生的路径问题, 对于jsp和使用sendredirect跳转的servlet,采用直接使用带容器路径[string request.getcontextpath()]的绝对路径就能完全解决,即:
<%
string contextpath = request.getcontextpath();
string url = contextpath + "/user/login.jsp";
%>
<a href="<%=url%>"> login</a>
string contextpath = request.getcontextpath();
string targetpath = contextpath + "/user/login.jsp";
requestdispatcher rd = request.getrequestdispatcher(targetpath);
rd.forward(request, response);
......
对于使用forward跳转的servlet,则不要加容器路径,否则就重复出现 容器路径,原因参见 2
8. 如果使用的“../”过多也不会出现严重问题,“../”最多使链接到达“ip/”
9. 另外,在使用
<jsp:include page = "url" flush="true"/>
<%@ include file="url" %>
<%@ page errorpage = "url" %>
时, 这里url使用的“/”表示的根为“ip/war/”,包含了war路径