JSP,Servlet和HTML中的路径基本上都是相对路径,只是相对路径的根路径有所区别而已。
以下是例子所使用到的servelt及jsp路径:
servlet路径为:http://localhost:8080/testProject/hello/test
jsp路径为:http://localhost:8080/testProject/test/test.jsp
假设转发的目标是jsp(当然servlet也一样),完整的请求路径为:
http://localhost:8080/testProject/target/target.jsp
1. JSP和Servlet中的转发路径
1.1 转发路径若以"/"开头,则是相对于工程的路径,也就是"http://localhost:8080/testProject/",例如:
request.getRequestDispatcher("/target/target.jsp").forward(request, response);
或
<jsp:forward page="/target/target.jsp"/>
则请求的完整路径就是:
http://localhost:8080/testProject/target/target.jsp
是正确的
1.2 转发路径若不以"/"开头,则是相对于当前servlet或者jsp所在的路径,也就是"http://localhost:8080/testProject/hello/"或"http://localhost:8080/testProject/test/",例如:
request.getRequestDispatcher("target/target.jsp").forward(request, response);
或
<jsp:forward page="target/target.jsp"/>
则请求的完整路径就是:
http://localhost:8080/testProject/hello/target/target.jsp
或
http://localhost:8080/testProject/test/target/target.jsp
是错误的
1.3 小结
因此在jsp或者servlet中执行请求转发时相对路径最好以"/"开头,写为相对于工程的路径,这样不易出错。
2. JSP和Servlet中的重定向
2.1 若路径以"/"开头,则是相对于站点根目录,也就是http://localhost:8080/,例如:
response.sendRedirect("/target/target.jsp");
则重定向后完整的请求路径就是:
http://localhost:8080/target/target.jsp
是错误的
2.2 若路径不以"/"开头,则是相对于当前servlet或者jsp所在的路径,也就是"http://localhost:8080/testProject/hello/"或"http://localhost:8080/testProject/test/",跟转发时一样,例如:
response.sendRedirect("target/target.jsp");
则重定向后完整的请求路径就是:
http://localhost:8080/testProject/hello/target/target.jsp
或
http://localhost:8080/testProject/test/target/target.jsp
也同样是错误的
2.3 正确写法
由于重定向时不论相对路径是否以"/"开头都不能正确定位,因此需要在重定向的路径前加上工程路径,也就是request.getContextPath()
,在本例中这段代码的执行结果就是"/testProject",再加上目标相对路径就是完整的请求路径,正确的写法应该是:
response.sendRedirect(request.getContextPath() + "/target/target.jsp");
此时重定向后的完整请求路径为:
http://localhost:8080/testProject/target/target.jsp
是正确的
2.4 小结
在jsp或者servlet中重定向时必须在目标路径前加上工程路径,并且目标路径必须以"/"开头。
3. HTML中的路径
在jsp页面中的html代码中的某些标签中的路径以‘/‘开头则是相对于站点根目录,不以‘/‘开头则是相对于当前页面的路径,为了书写统一,我一般会使用<base>
标签来控制当前页面中链接的基本路径。
<base>
标签的作用如下:
<base>
标签为页面上的所有链接规定默认地址或默认目标。
通常情况下,浏览器会从当前文档的 URL 中提取相应的元素来填写相对 URL 中的空白。
使用<base>
标签可以改变这一点。浏览器随后将不再使用当前文档的 URL,而使用指定的基本 URL 来解析所有的相对 URL。这其中包括<a>、<img>、<link>、<form>
标签中的 URL。
摘自 W3School
当定义了<base>
中基本路径之后,页面中html标签中的路径不能以‘/‘开头,否则就失去了<base>
的作用。
通常情况下我会这么定义:
<%
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ request.getServerPort()
+ request.getContextPath();
%>
<html>
<head>
<base href="<%=basePath%>">
<title></title>
</head>
之后标签中的路径都只要写相对于工程的路径即可。
还有一点需要注意,就是<script>
不受<base>
控制,引用外部js文件时需要写完整路径或者正确的相对路径。
以上就是我对于JavaWeb开发中容易混淆的路径的一些总结。