一. 绝对路径
有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.jsp
和xxx.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()
方法动态获取