在web开发中,经常会涉及到路径问题。如何正确使用绝对路径与相对路径,是每一位web开发者必须掌握的事情。
1.相对路径
相对路径就是站在我自己的角度来找资源,写法如下:
"./a.jsp" //找同级目录
"../a.jsp" //找上级目录
"./images/pic.jpg" //找同级文件夹内的资源
2.绝对路径
绝对路径就是以” / “开头 的路径,即从根目录出发,当然这里的根目录也是有坑的,详见第4点
3.原则:尽量使用绝对路径,不写相对路径
由于web开发的时候多使用页面的转发与跳转,同一个资源的相对路径也会随着页面的uml地址而发生变化。大约就是,如果有一个页面,他的路径是 /a.jsp 它引用了其同级目录 b.jsp 的资源,此时相对路径写为 ./b.jsp 。正常访问 a.jsp 的时候,资源的确能被加载出来,但是,如果是通过其他方式(如 a.jsp 上层目录中有一个 c.jsp ,通过转发跳转到 a.jsp )来访问 a.jsp,那么 ./b.jsp 资源就无法被加载(404 not found),原因就是浏览器会在 c.jsp 所在的同级目录去找 b.jsp ,当然是找不到啦~~
4.正确使用绝对路径
第二点提到,绝对路径是以” / “为开头的,但是” / “表示的意义也不尽相同
"/" == "http://localhost:8080/" //浏览器眼里
"/" == "http://localhost:8080/myProject/" //web应用眼里
4.1 正所谓情人眼里出西施,辣么,谁是浏览器眼里的”情人“呢?即,什么时候” / “代表” http://localhost:8080/ “呢?
1.jsp里面都是(包括但不局限于以下两种)
a.超链接:<a href = "/a.jsp">点我点我</a>
b.form表单:<form action = "/a.jsp">
2.servlet里
a.重定向的时候:response.sendRedirect("/a.jsp")
为了不出错,以上情况在路径前面要加上:request.getContextPath(),变成如下样子:
a.超链接:<a href = "request.getContextPath()/a.jsp">点我点我</a>
b.form表单:<form action = "request.getContextPath()/a.jsp">
c.重定向的时候:response.sendRedirect("request.getContextPath()/a.jsp")
4.2 作为web应用的”西施“,就独得恩宠,可以直接使用。包括但不仅限于下列三种情况:
1.servlet里的转发:request.getRequestDispatcher("/a.jsp")
2.web.xml里<servlet-mapping>中url映射
<servlet-mapping>
<servley-name>MyJSP</servley-name>
<url-pattern>/a.jsp</url-pattern>
</servlet-mapping>
3.自定义标签中
5.总结
在web应用中,不要尝试使用相对路径,当使用绝对路径的时候,看清使用的情况,遇到资源加载不出来的问题时,添加request.getContextPath()试试,没准你的使用情况恰好是浏览器眼中的”西施“。