首先我们要知道:相对路径+参照路径=绝对路径,浏览器或服务器最终都是要根据绝对路径访问资源的。相对路径都是由我们写的,所以只要搞清楚参照路径是什么,就知道要访问的资源在哪里。
以下以IntellJ idea中的maven项目为例。
我们在web项目中写的路径有两种形式:
1、 以”/”开头的路径
2、 以名称或者”.”开头的路径
它们都是相对路径。
先讨论第二种情况
:以名称或者”.”开头的相对路径,它的参照路径是要访问的资源文件所在的目录(web.xml文件中的路径另论),下图的资源文件为jsp/hello.jsp而不仅仅是hello.jsp.
web项目中路径问题改进篇2
可以使用".“表示当前目录,可以使用”…“表示上一级目录,比如”…/…/index.jsp"表示本文件所在目录的上上级目录下的index.jsp文件
现在来讨论第一种情况:以”/”开头的路径
我们知道,访问目标资源的请求如果是由浏览器发出的则相对路径由浏览器来解析成绝对路径,如果访问目标资源的请求如果是由服务器发出的则相对路径由服务器来解析成绝对路径。然而浏览器和服务器解析路径时参照路径是不一样的,因为浏览器使用的是虚拟路径,服务器使用的是真实路径。所以要知道以”/”开头的路径的参照路径,必须清楚访问目标资源的请求是由谁发出的。
先说明请求页面的写法,在web中,页面路径主要写的有以下几种
  1、请求重定向
  2、浏览器的请求被服务器请求到新页面(即“转发”)
  3、超链接
4、form表单提交的action
上面的请求中除了2是由服务器发出的,其他的都是由浏览器发出的。
顺便提一下:页面中href,src,action,url属性都表示浏览器发出的一次新的请求。

图二中圈起来的部分就是要发布到tomcat服务器上的war exploded包,所有资源文件都在这个包下面。
由浏览器解析相对路径时的参照路径是:ContextPath(上下文路径)
ContextPath(上下文路径)=
http://localhost/)http://127.0.0.1:8080/+ApplicationContext(应用程序上下文)。图一中的pf就是一个ApplicationContext,/pf就是一个上下文路径,它映射的是项目的根路径(图二中圈起来的部分)。
在jsp中可以通过隐式对象pageContext.request.getContextPath()获取上下文路径。
web项目中路径问题改进篇2 图一
web项目中路径问题改进篇2 图二
由服务器解析相对路径时的参照路径是:http://127.0.0.1:8080/webAppName,即图二中
圈起来的部分。
所以两种解析方式的最终结果都是代表项目的根路径(由图二可知,静态资源、jsp文件、WEB-INF目录都在根路径下),但是它们是不同的,一个是由虚拟路径映射过来的,一个是真实路径。由服务器解析的真实路径可以访问所有资源,包括WEB-INF目录下的。项目中class文件和配置文件(即java和resources目录下的文件,如图四)拷贝到了WEB-INF/classes目录下了(如图三),jar包则拷到WEB-INF/lib目录下;而虚拟路径只能访问除了WEB-INF目录外的其他资源。
web项目中路径问题改进篇2
图三
web项目中路径问题改进篇2 图四

下面讨论web.xml中标签下的路径:
当启动tomcat成功后,浏览器会立即根据标签包含的资源路径向服务器发起一次请求,当请求成功后会返回一个页面给浏览器,首页就是由此而来。
Tomcat会分析标签包含的资源路径。
如果标签包含的相对路径以”/”开头,则由服务器解析该路径,参照路径是http://127.0.0.1:8080/webAppName,此时可以访问所有资源包括WEB-INF目录。这是采用请求转发的技术实现
如果是以名称开头的路径,则直接由浏览器解析该路径,参照路径是http://127.0.0.1:8080/+ApplicationContext(应用程序上下文),此时只能访问WEB-INF外的资源。

相关文章: