Web项目中的路径问题
一、绝对路径和相对路径
绝对路径:绝对路径就是形如http://ip:port/web项目名/资源名的写法
相对路径:任何不以http://ip:port/开头的写法 都称之为相对路径,包括以下几种:
-
/开头的写法,形如/demo.jsp或/img/a.jpg
-
./开头(等于啥也不写),形如image/a.jpg(这种写法等价于./image/a.jpg) 在当前目录下开始寻找
-
…/开头,形如…/image/a.jpg 在当前路径的上一层路径下开始寻找
而用户要访问服务器中资源,要通过浏览器,我们在各种资源中写的相对路径(例如表单提交的路径,超链接跳转的路径,请求转发跳转的路径,重
定向的路径),在用户浏览器的地址栏里,最终都会被转换为绝对路径,因为浏览器(客户端)的作用,就是查找资源,这个查找到资源的路径,就必须
是绝对路径,否则是无法定位资源的
二、页面中的相对路径中是否以"/"开头的区别
以下的讨论建立在假设项目名(Application Context)为/test的基础上,项目结构如图:
1.前台路径(html/jsp文件中的路径)
路径是以/开头的:
这个“/”就等于浏览器中的http://ip:port/也就是服务器的路径
例如:在a.html中有以下超链接
<!--假设此时浏览器地址栏为http://ip:port/test/a.html-->
<a href="/b.html">跳转</a>
点击这个超链接的结果是浏览器地址框变为:http://ip:port/b.html。此时,是找不到/test项目下的b.html资源的,浏览器会报404 NOT FOUND
也就是说,如果在html页面写以"/"开头的路径,那就要自己手动加上项目名称,如上个案例,正确写法为
<a href="/test/b.html"
路径不以/开头:
此时以浏览器地址正在访问的这个资源所在的目录为基准
例如:在a.html中有以下超链接
<!--假设此时浏览器地址栏为http://ip:port/test/a.html-->
<a href="b.html">跳转</a>
-
点击这个超链接的结果是浏览器地址栏变为:
http://ip:port/test/b.html
-
此时,可以找到/test项目下的b.html资源
-
点击这个超链接的结果是浏览器地址栏变为:
http://ip:port/test/b.html
-
此时,可以找到/test项目下的b.html资源
2.后端路径(Servlet)
- 后端路径如果是以
/
开头的,这里的/
就等于浏览器中的http://ip:port/test/
也就是项目的路径 - 但是后端的路径有特殊情况
2.1请求转发跳转
2.1.1路径以/
开头
**请求转发跳转,是服务器内部的跳转,浏览器地址栏不变.**所以是后端的路径跳转,因此/
还是代表http://ip:port/test/
例如:在DemoServlet(urlPatterns="/demo")中有以下代码
//其他代码省略
request.getRequestDispatcher("/a.html").forward(request,response);
如果访问DemoServlet,需要在浏览器地址栏中输入http://ip:port/test/demo,然后,地址栏不变,但是显示的页面变成了a.html中的内容,证明浏览
器访问到了a.html这个资源
实际上,浏览器访问的是http://ip:port/test/a.html但是浏览器地址栏还是显示的http://ip:port/test/demo,这是请求转发跳转的特点,也能证明请求
转发跳转中/代表项目路径http://ip:port/test/
2.1.2路径不以/开头
此时以浏览器地址正在访问的这个资源所在的目录为基准
例如:在DemoServlet(urlPatterns="/demo")中有以下代码
//其他代码省略
request.getRequestDispatcher("a.html").forward(request,response);
访问DemoServlet,需要在浏览器地址栏中输入http://ip:port/test/demo,然后,也会访问到a.html这个资源
因为此时浏览器访问/demo这个servlet,所在的目录为http://ip:port/test/,所以只需在这个目录后加上a.html,结果也就是a.html的绝对路径,所以
访问成功
2.2重定向跳转
2.2.1路径以/开头
重定向跳转,是浏览器的跳转,浏览器地址改变.所以,可以认为是前台路径的跳转,因此,这里的/代表服务器路径http://ip:port/
例如:在DemoServlet(urlPatterns="/demo")中有以下代码
//其他代码省略
response.sendRedirect("/a.html");
如果访问DemoServlet,需要在浏览器地址栏中输入http://ip:port/test/demo,然后,地址栏改变为:http://ip:port/a.html,此时,是访问不到资源的,浏
览器报404
因为在重定向跳转中/代表http://ip:port/
2.2.2路径不以/开头
此时以浏览器地址正在访问的这个资源所在的目录为基准
例如:在DemoServlet(urlPatterns="/demo")中有以下代码
//其他代码省略
response.sendRedirect("a.html");
如果访问DemoServlet,需要在浏览器地址栏中输入http://ip:port/test/demo,然后,地址栏改变为:http://ip:port/test/a.html,访问到了a.html
因为此时浏览器访问/demo这个servlet,所在的目录为http://ip:port/test/,所以只需在这个目录后加上a.html,结果也就是a.html的绝对路径,所以
访问成功
上一篇: 项目中实际用到的Linux知识点整理
下一篇: Web Worker
推荐阅读
-
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法_PHP教程
-
解决idea web 配置相对路径问题
-
table边框重叠导致的单元格边框宽度问题_html/css_WEB-ITnose
-
如果解决smarty模板重名(路径不同),导致的编译后的文件被覆盖的有关问题
-
HTML SELECT 的长度问题 (不是option的内容长度)是SELECT 显示的option节点多我想控制他的长度_html/css_WEB-ITnose
-
关于PHP的相对路径的引用问题
-
手机端网页的几个小问题_html/css_WEB-ITnose
-
初学HTML 有个简单的小问题帮忙看一下_html/css_WEB-ITnose
-
各位是怎样解决屏幕的分辨率的问题的呢?_html/css_WEB-ITnose
-
【楼主水的可以】HTML打开文件夹的怪异问题_html/css_WEB-ITnose