在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()試試,沒準你的使用情況恰好是瀏覽器眼中的”西施“。