1.基本概念的理解

  绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:/xyz/test.txt 代表了test.txt文件的绝对路径。http://www.baidu.com/index.html也代表了一个URL绝对路径。绝对路径,是指根据给出的访问路径可以准确定位到资源的路径。例如,你要告诉对方你现在的位置,你说:我现在在北京故宫游客 A 入口处。这就是个绝对地址,听者根据你所述地址,可以准确的找到你。而对于计算机中 Web 应用的绝对路径,则是指带访问协议的路径。例如下面的路径就是一个带有 http 访问协议的绝对路径。http://127.0.0.1:8080/primary/index.jsp

  相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,"../"代表上级目录。这种类似的表示,也是属于相对路径。相对路径,是指仅根据访问路径无法准确定位资源的路径。相对路径必须要结合其参照路径才可组成可以准确定位资源的绝对路径。参照路径的不同,所形成的可以准确定位资源的绝对路径也是不同的。在进行资源访问时,必须要将相对路径转换为绝对路径才可完成资源的准确定位。例如,你要告诉对方你现在的位置,你说:我在人民公园的正门门口。这就是个相对地址。因为很多城市都有人民公园,每个人民公园也都有正门。当对方不知道你在哪个城市时,他是无法准确定位你的。当然,你只所以不说是哪个城市,是因为这里存在一个默认的参照路径:与听者在同一个城市。听者会将你所说的相对地址,自动转换为一个绝对地址:与听者在同一城市的人民公园正门门口。在 Web 应用中,相对路径的写法有两种:一种是以斜杠开头的相对路径,一种是不以斜杠开头的相对路径。根据相对路径是否以斜杠开头,且出现的文件所处位置的不同,其默认的参照路径是不同的。这也是相对路径容易出错的地方:确定参照路径。

     下面这两种就分别是不以斜杆开头的和以斜杆开头的相对路径:

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

对于浏览器请求的提交方式,可以有表单提交、超链接提交、Ajax 提交等。与地址栏提交不同的时,这些提交方式均需要将请求写在页面文件中。下面以超链接提交方式来讲解有关路径问题。

2.访问路径与资源名称

      通常的 URL 由资源访问路径由两部分构成访问路径资源名称。资源名称指的是要访问资源的直接名称,如 show.jsp,或与要访问资源存在映射关系的间接名称,如 show.do。而访问路径,则是通过该路径则可以定位到指定的资源,即在 URL 资源访问路径中除了资源名称以外的其它部分。

一般情况下,在 URL 访问路径中,最后一部分为资源名称,而其它部分则为访问路径。

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

3.详细的解释

      相对路径又分为以斜杆开头的路径和不以斜杆开头的路径,根据路径所在文件所处位置的不同,分为两种:前台路径与后台路径。

A 前台路径

     所谓前台路径是指,由浏览器解析执行的代码中所包含的路径。例如,html、cssjs中的路径,及 jsp 中静态部分的路径。像 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 文件中的路径(xml 文件是要被java 代码加载入内存,并由 java 代码解析的)等。后台路径的参照路径是 Web 应用的根路径。如 http://127.0.0.1:8080/primary/    primary是Web应用的项目名。

C 后台路径特例

     对于后台路径的参照路径有一个特例:当代码中使用 response  sendRedirect()方法进行重定向时,其参照路径不是 web 应用的根路径,而是 web 服务器的根路径。例如,执行 response.sendRedirect(/show.jsp);将会报 404 错误。因其参照路径是Tomcat 的根,而非当前项目的根。所以若要使用重定向,要么写为无斜杠的相对路径(参照的是当前资源的访问路径):response.sendRedirect(“show.jsp);要么写在路径上添加上项目名称:response.sendRedirect(request.getContextPath + /show.jsp);

D、不以斜杠开头的相对路径

      不以斜杠开头的相对路径,无论是前台路径,还是后台路径,其参照路径都是当前资源的访问路径,而不是当前资源的保存路径。

4、问题演示

    项目名:accessPath。只需要在 index.jsp 页面中添加一个超链接。

   关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

  通过 index.jsp 页面的超链接,可以完成对/WEB-INF/jsp/welcome.jsp 页面的正确访问。但问题也就出现了:为什么在 springmvc.xml 中注册处理器时其 id 属性值是以斜杠开头,而 index.jsp 页面中的链接却没有以斜杠开头呢?

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

若在 index.jsp 的超链接前添加上斜杠,在访问时会报 404 错误,找不到相应资源。

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

那这是为什么呢?这里面就涉及到访问路径问题了。

5、相关现象解析

    (1 为什么页面超链接的 herf 属性值加上斜杠会报错

A 原因分析

为什么在 springmvc.xml 中注册处理器时其 id属性值是以斜杠开头,而 index.jsp 页面中的超链接的 herf 属性值加上斜杠后会报错?

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

springmvc.xml 中注册处理器的<bean/>标签的 id 属性中加上斜杠的路径,是后台路径,其参照路径是当前 Web 应用的根:http://127.0.0.1:8080/accessPath/。即指出当前注册的处理器 IndexController的资源访问绝对路径是:http://127.0.0.1:8080/accessPath/hello.do

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

index.jsp 页面中的加上斜杠的路径,是前台路径,其参照路径是当前 Web 服务器的根:http://127.0.0.1:8080/。即其提交的访问绝对路径是:http://127.0.0.1:8080/hello.do。这个绝对路径当然是无法访问到处理器 IndexController 的。hello.do 这个资源在 Web 服务器的根下当然也是不存在的,所以会报 404 错误。

B 解决办法

若还想加上斜杠,还不想出错,则解决为法就是手工为 href 属性值的相对路径上添加项目名称。

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

但这样做不好的是,若在项目发布时项目名称发生了改变,则必须将每一个请求的路径进行改变。所以,可以通过 EL 表达式${pageContext.request.contextPath}动态的获取到项目名称。

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

(2 为什么跳转回 index 页面后地址栏会多出一个 test

A 问题重现

项目:accessPath2。在项目 accessPath 基础上修改。

a 修改 springmvc 配置文件

为了构建发生这种异常的场景,在注册处理器时,为该<bean/> id 属性中添加上一个/test,表示模块信息。即表示的意义为,若要访问 IndexController 这个处理器,则需要提交http://127.0.0.1:8080/accessPath2/test/hello.do 请求。

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

b 修改 index 页面

修改 index 页面,让 index 页面的超链接 href 属性采用无斜杠的路径。将这个超链接请求暂且当作是一个表单的提交请求。

              关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

c 修改处理器

修改 IndexController  ModelAndView 中指定要跳转的页面为/index.jsp,表示重新返回index 页面,用于模拟当表单数据填写错误后重新返回表单页面的场景。

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

               

项目发布运行后,在 index 页面中点击链接,可以正常返回 index 页面。但若此时再次点击这个链接,会抛出 404 异常。然后却发现地址栏多出了一个 test

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

B 原因分析

 

为什么会多出一个/test 呢?因为超链接的 herf 属性值为无斜杠的相对路径,所以其参

照路径为当前的访问路径。在第一次提交时的“当前访问路径”为

http://127.0.0.1:8080/accessPath2/         访     

http://127.0.0.1:8080/accessPath2/test/login.do。在此访问路径下再次点击超级链接后,此时

的“当前访问路径”已经发生变化,变为了 http://127.0.0.1:8080/accessPath2/test/。其所访

问路径就变为了 http://127.0.0.1:8080/accessPath2/test/test/login.do,而这个资源是没有定

义的,所以会报 404 错误。

C 解决办法

    a 使用斜杠开头的请求路径

   关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

b 不使用斜杠开头的请求路径

若不使用斜杠开头的请求,则需要使用 JSP <base/>标签。页面中的<base/>标签,会在当前页面的资源请求路径前自动加上<base/>标签所代表的路径,将相对路径变为带访问协议的绝对路径。该方式实际上是修改了不带斜杠的相对路径的参照路径,将由原来的当前访问路径作为参照路径,改为了以 basePath 为参照路径。所以这种方式要求页面中的请求不能以斜杠开头

关于JavaWeb中绝对路径和相对路径的详细解释、分析各种路径现象的原因及解释

6.总结

      看望这篇博客相信大家对JavaWeb中的相对路径和绝对路径有了一个更加深刻的理解和认识,如果大家发现了错误请及时指正我哦,谢谢大家支持!欢迎大家转载,转载请标明文章出处!

相关文章: