转自:http://blog.csdn.net/gashero/article/details/1483283
HTML中的相对URL绝对是个艺术,其变化多端简直几近于C语言的缓冲区溢出。下面谈一下偶在调试中遇到的几个相对URL的问题。
1、真正的相对路径
据个例子,假如你有一个调试用的服务器地址为"http://localhost"。其下还有几个子功能。包括"http://localhost/hello"和"http://localhost/hello/test"。这时就可以考虑使用相对路径了。假如在/hello页面中要链接到/hello/test页面去。可以在链接标签中使用href="test"就可以正确的链接过去。因为在/hello页的当前URL是/hello,所以对于test的链接就转换为/hello/test。
2、全局相对路径
其实这一段的所谓相对路径,仅仅是指不含有主机名的路径而已。主要特征就是在相对URL的最前面是含有"/"的。这样的路径就是以URL的跟路径开始计算的。比如有一个页面/hello/test2,需要链接到/hello/test。按照方法一的写法应该是<a href="../test">,虽然还是看的懂,但总不是那么简洁。所以可以考虑使用全局相对路径。如下<a href="/hello/test">,这样是以URL的根路径开始寻找的,可以很好的找到需要的路径。
全局相对路径是一种很好的方式,可以实现在一个WEB应用的部署内部很好的链接,也不需要为了".."而晕倒。问题就是,如果一个应用的部署从"/"变成了"/app"之类的,就会出问题了。而这种情况在Tomcat等等不太适合在根路径上配置服务的服务器就比较常见了。
在javaee中一般用request.getContextPath()获取上下文根,后跟相对路径,然后浏览器会在前面自动加上协议,ip,端口信息。
3、框架中的相对URL
框架中的相对URL就比较容易理解了。比如在一个框架中制定另一个框架页面需要打开的相对URL,这时这个相对URL就是基于本框架页面的。比如左侧框架页面正在显示的页面是/hello/test.html,而右侧框架页面正在显示/hi/test.html。则在左侧框架页面的一个连接<a href="test2.html" target=XXX>在右侧框架页面打开连接的话,则是打开/hello/test2.html。
4、框架中的JavaScript的相对
这个就比较恶心了,在左侧框架页面中的一个连接上使用事件来处理JS代码。JS代码中直接引用右侧框架页面对象,并指定相对URL,则这时的相对URL是基于原来的目的框架页面的。在这种情况中是很容易与第3条相混淆的,应该注意。