概念区分:
服务器端的相对地址:
指的是相对于你的web应用的地址,是在服务器端解析的,也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http://192.168.0.1/WebApp/的。如:forward,sendRedirect均是使用的这个地址
客户端的地址:
是指html和javascript中的相对地址,他们是由客户端浏览器解析的,相对地址都是相对于http://192.168.0.1/的
问题:
1. 采用相对路径遇到的问题
a. 相对路径固然比较灵活,但如果想复制页面内的代码却变得比较困难,因为不同的页面具有不同的相对路径,复制后必须修改每一个连接的路径。
b. 如果页面被多于一个的页面所包含,那么被包含页面中的相对路径将是不正确的。
c. 在请求转发的过程中会出现相对路径变化的问题。
解决以上问题似乎只有使用绝对路径了。
2. 采用绝对路径遇到的问题
随着不同的Web应用发布方式,绝对路径的值也不同。如Web应用发布为 WebApp,则路径均为"/Web/App/...",但发布为另一应用时改为MyApp,这时路径就不对了,也许这个情况比较少,但还是存在的。
解决方案:
方法一:直接采用绝对路径 (不推荐)
<%
String path = request.getContextPath();
// 获得本项目的地址(例如: http://localhost:8080/WebApp/)赋值给 basePath 变量
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
// 将 "项目路径basePath" 放入pageContext中,待以后用EL表达式读出。
pageContext.setAttribute("basePath",basePath);
%>
<a href="${pageScope.basePath}/*.jsp">
方法二:利用html中的 <base>标签(推荐,也是MyEclipse默认采取的方式)
<base> 元素规定了页面中所有链接的基准 URL
默认情况下,页面中的链接(包括样式表、脚本和图像的地址)都是相对于当前页面的地址
<%
String path = request.getContextPath();
// 获得项目完全路径(如:http://localhost:8080/WebApp/):
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href=" <%=basePath%">