访问路径问题-带斜杠和不带斜杠的区别
1.访问路径的组成
URL,统一资源定位符,用于定位资源的一种方式。通常的URL 资源访问路径由两部分构成:资源路径与资源名称。 资源名称指的是要访问资源的直接名称,如 show.html
,或与要访问资源存在映射关系的间接名称,如 show.do
。而资源路径,则是通过该路径则可以定位到指定的资源,即资源路径是指在 URL
资源访问路径中除了资源名称以外的其它部分。
根据以上规则,URI
,统一资源标识符,也可以分为资源路径与资源名称两部分。一般情况下,在 URL
或 URI
中,最后一个斜杠后的部分为资源名称,而其它部分则为资源路径 。
根据“资源路径是否可以独立完成资源准确定位”的判别标准,可以将访问路径分为绝对路径与相对路径。
2.绝对路径
绝对路径,是指根据给出的访问路径可以准确定位到资源的路径。例如,你要告诉对方你现在的位置,你说:我现在在北京故宫游客 A 入口处。这就是个绝对地址,听者根据你所述地址,可以准确的找到你。
而对于计算机中 Web
应用的绝对路径,则是指带访问协议的路径,即 URL
。例如下面的路径就是一个带有http
访问协议的绝对路径。
\ http://127.0.0.1:8080/primary/index.jsp
3.相对路径
相对路径,是指仅根据访问路径无法准确定位资源的路径。相对路径必须要结合其参照路径才可组成可以准确定位资源的绝对路径。参照路径的不同,所形成的可以准确定位资源的绝对路径也是不同的。在进行资源访问时,必须要将相对路径转换为绝对路径才可完成资源的准确定位。它们的关系如下:
绝对路径 = 参照路径 + 相对路径
例如,你要告诉对方你现在的位置,你说:我在人民公园的正门门口。这就是个相对地址。因为很多城市都有人民公园,每个人民公园也都有正门。当对方不知道你在哪个城市时,他是无法准确定位你的。当然,你只所以不说是哪个城市,是因为这里存在一个默认的参照路径:与听者在同一个城市。听者会将你所说的相对地址,自动转换为一个绝对地址:与听者在同一城市的人民公园正门门口。
在Web
应用中,浏览器或服务器会自动为不同的相对路径添加不同的参照路径,将相对路径转换为绝对路径,以定位这个资源。作为程序员,必须要理解并掌握浏览器或服务器为相对路径添加参照路径的规则,这样才能在编程时更为准确地书写相对路径。
相对路径的写法有两种:一种是以斜杠开头的相对路径,一种是以路径名称开头的相对路径。根据相对路径是否以斜杠开头,且路径出现的文件的不同,其默认的参照路径是不同的。这是我们学习的重点,是路径问题-中最容易出错的地方:确定相对路径的参照路径。
4.以斜杠开头的相对路径
以斜杠开头的相对路径,根据路径所在文件所处位置的不同,分为两种:前台路径与后台路径。
A、 前台路径
所谓前台路径是指,由浏览器解析执行的代码中所包含的路径。例如,html、css、js
中的路径,及 jsp
文件中静态部分的路径(HTML
标签中的路径)。例如,html 及 jsp
文件中的<img src=""/>、<a href=""></a>、<form action=""></form>
等标签中的路径;再如,css
文件中的 background:img(“”)
等属性中的路径,js
文件中的 window.location.href=””
等属性中的路径,都属于前台路径。
前台路径的参照路径是 Web 服务器的根路径,即 \http://127.0.0.1:8080。
将前台路径转换为绝对路径的工作,是由浏览器自动完成的。该路径的作用是要为用户提交对某种资源的请求,是要查找并定位服务器中的某资源。简单来说,前台路径的作用是“查找”。
B、 后台路径
所谓后台路径是指,由服务器解析执行的代码及文件中所包含的路径。例如,java
代码中的路径、jsp
文件动态部分(java
代码块)中的路径、xml
等配置文件中的路径(配置文件是要被 java
代码解析后加载到内存的,其中的路径会出现在Java
代码中)等。后台路径的参照路径是 Web 应用的根路径。如 \http://127.0.0.1:8080/primary。
将后台路径转换为绝对路径的工作,是由服务器自动完成的。该路径的作用是标识出该资源在服务器中的路径,以便客户端能够按照这个设定路径来查找相应资源。简单来说,后台路径的作用是“标识”。
**C、 后台路径特例**
对于后台路径的参照路径有一个特例:当代码中使用 `response` 的 `sendRedirect()`方法进行重定向时,若其参照路径是以斜杠开头,则其参照路径不是 `web` 应用的根路径,而是 `web`服务器的根路径。
例如,执行 response.sendRedirect(“/show.jsp”);
将会报 404 错误。因为其参照路径是Tomcat
的根,而非当前项目的根。所以若要使用重定向,就需要在路径上添加上项目名称:response.sendRedirect(request.getContextPath + “/show.jsp”);
为什么这里是特例?因为sendRedirect()方法可以重定向到其它应用,若不指定要跳转的应用,其将无法确定跳转方向。
5.以路径名称开头的相对路径
以路径名称开头的相对路径,无论是出现在前台页面,还是出现在后台 Java 代码或配置文件中,其参照路径都是当前访问路径的资源路径。即使是 response
的 sendRedirect()
方法的参数路径,若不以斜杠开头,其也属于“以路径名称开头的相对路径”类,参照路径为当前访问路径的资源路径。
所以我们可以总结出: