一. 绝对路径

有3种绝对路径的写法

第一种: 以盘符开始 , 比如
F:/aaa/bbb/c.jsp

第二种: url网址访问 , 比如
http:localhost:8080/虚拟项目路径/项目资源路径

第三种: 以/开头的路径

前两种都是不建议使用的,因为写死了的路径可移植性差,
开发中使用第三种, 因为第三种比较复杂,我分情况来说

1.客户端以绝对路径访问服务端的资源

为了便于描述,我们假设虚拟项目路径为test


比如form表单提交:

<form action="/xxx" method="post">
              ...
 </form>

该表达以/开头,那么就是绝对路径,提交之后访问的地址是:http://localhost:8080/xxx因为缺少虚拟项目路径,所以报错404找不到该资源. 正确写法是:

<form action="/test/xxx" method="post">
              ...
 </form>

提交后访问的结果是:http://localhost:8080/test/xxx地址正确可以正常提交.


比如超链接或者图片标签

<a href="/xxx.jsp">客户端绝对路径跳转</a>
  <img src="/xxx.png"  >

/开头,表示绝对路径 ,同样的道理,客户端访问服务端的资源,没有写虚拟项目路径,服务器怎么知道你访问的是哪个web项目?所以报错404找不到该资源.正确写法是:

<a href="/test/xxx.jsp">客户端绝对路径跳转</a>
  <img src="/test/xxx.png"  >

比如请求重定向,也是在客户端访问服务端,如果使用绝对路径,也必须指定虚拟项目路径

//写是虚拟项目路径
response.sendRedirect("/test/xxx.jsp");
//使用getContextPath()方法动态的获取当前项目的虚拟路径, 开发中建议使用这种动态的获取方式
response.sendRedirect(request.getContextPath() + "/xxx.jsp");

绝对路径总结: 客户端访问服务端资源,以绝对路径访问,用/开头,那么必须指定虚拟项目路径,否则服务器不知道访问的资源在哪个web项目中,所以会报错404.

2.服务端以绝对路径访问服务端的资源

比如请求转发,就是服务端访问本项目下在其他资源,所以/后面可以省略虚拟项目路径,直接写资源路径

request.getRequestDispatcher("/test/xxx.jsp").forward(request, response);
  //服务端访问同一个项目中其他资源可以省略项目路径
  request.getRequestDispatcher("/xxx.jsp").forward(request, response);

二. 相对路径

相对路径只有一种写法,那就是以./开头,并且./可以省略不写!

而./的含义是指:当前资源的所在目录

为了便于说明,我们假设虚拟项目路径是test


假设在test项目的web下有文件夹xxx/A.jspxxx.B.jsp 当我们使用a标签从A.jsp访问B.jsp的时候:

A.jsp的全路径是localhost:8080/test/xxx/A.jsp B.jsp的全路径是localhost:8080/test/xxx/B.jsp 可以看出,A和B他们的相对地址都是localhost:8080/test/xxx/那么这个相对地址就可以省略不写!

<a href="./B.jsp">  相对路径  ./  </a>
<a href="B.jsp">  相对路径  ./  省略</a>

比如web下xxx/A.jsp中和form表单提交到src下com/zuoyueer/servlet/B.java我们这是该B.java的资源路径为/B 也就是@WebServlet(urlPatterns = "/B", name = "B")

A.sjp的全路径是:localhost:8080/test/xxx/A.jsp B.java的全路径是:localhost:8080/test/B 可以看出:
A的相对地址是:localhost:8080/test/xxx/ B的相对地址是localhost:8080/test/ 分析:
A.jsp提交到B.java, 也就是A要访问B,
如果使用./只能访问到localhost:8080/test/xxx/下的资源无法访问到B.java
那么就可以使用../来访问上一级目录,这样就能访问到localhost:8080/test/下的B.Java资源了
值得注意的是../不能省略,如果要访问上一级的上一级目录那么可以使用../../同样不能省略

<--  提交代码如下,  "../"不能省略 ,  "./"才能省略-->
<form action="../B" method="post">
              ...
 </form>

相对路径总结: 相对路径本质就是省略完整路径相同的部分,
我们在写相对路径的时候就是要知道相同的部分是哪些,省略它,
不同的部分使用./或者../来查找
其中./可以省略,../不能省略

三. 后话谈

在实际开发中,可以使用相对路径的时候,不要使用绝对路径.使用绝对路径的时候,尽量虚拟项目路径使用getContextPath()方法动态获取