?相對路徑情況分析
相對路徑情況1:web/index.html中引入web/static/img/logo.png
-
訪問index.html的url為 : http://localhost:8080/web03_war_exploded/index.html
-
當前資源為 : index.html
-
當前資源的所在路徑為 : http://localhost:8080/web03_war_exploded/
-
要獲取的目標資源url為 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
index.html中定義的了 :
<img src="static/img/logo.png"/>
-
尋找方式就是在當前資源所在路徑(http://localhost:8080/web03_war_exploded/)后拼接src屬性值(static/img/logo.png),正好是目標資源正常獲取的url(http://localhost:8080/web03_war_exploded/static/img/logo.png)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><img src="static/img/logo.png">
</body>
</html>
?
相對路徑情況2:web/a/b/c/test.html中引入web/static/img/logo.png
-
訪問test.html的url為 : http://localhost:8080/web03_war_exploded/a/b/c/test.html
-
當前資源為 : test.html
-
當前資源的所在路徑為 : http://localhost:8080/web03_war_exploded/a/b/c/
-
要獲取的目標資源url為 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
test.html中定義的了 :
<img src="../../../static/img/logo.png"/>
-
尋找方式就是在當前資源所在路徑(http://localhost:8080/web03_war_exploded/a/b/c/)后拼接src屬性值(../../../static/img/logo.png),其中 ../可以抵消一層路徑,正好是目標資源正常獲取的url(http://localhost:8080/web03_war_exploded/static/img/logo.png)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!-- ../代表上一層路徑 --><img src="../../../static/img/logo.png">
</body>
</html>
?
相對路徑情況3:web/WEB-INF/views/view1.html中引入web/static/img/logo.png
-
view1.html在WEB-INF下,需要通過Servlet請求轉發獲得
@WebServlet("/view1Servlet")
public class View1Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {RequestDispatcher requestDispatcher = req.getRequestDispatcher("WEB-INF/views/view1.html");requestDispatcher.forward(req,resp);}
}
?
-
訪問view1.html的url為 : http://localhost:8080/web03_war_exploded/view1Servlet
-
當前資源為 : view1Servlet
-
當前資源的所在路徑為 : http://localhost:8080/web03_war_exploded/
-
要獲取的目標資源url為 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
view1.html中定義的了 :
<img src="static/img/logo.png"/>
-
尋找方式就是在當前資源所在路徑(http://localhost:8080/web03_war_exploded/)后拼接src屬性值(static/img/logo.png),正好是目標資源正常獲取的url(http://localhost:8080/web03_war_exploded/static/img/logo.png)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><img src="static/img/logo.png">
</body>
</html>
?
絕對路徑情況分析
絕對路徑情況1:web/index.html中引入web/static/img/logo.png
-
訪問index.html的url為 : http://localhost:8080/web03_war_exploded/index.html
-
絕對路徑的基準路徑為 : http://localhost:8080
-
要獲取的目標資源url為 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
index.html中定義的了 :
<img src="/web03_war_exploded/static/img/logo.png"/>
-
尋找方式就是在基準路徑(http://localhost:8080)后面拼接src屬性值(/web03_war_exploded/static/img/logo.png),得到的正是目標資源訪問的正確路徑
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!-- 絕對路徑寫法 --><img src="/web03_war_exploded/static/img/logo.png">
</body>
</html>
絕對路徑情況2:web/a/b/c/test.html中引入web/static/img/logo.png
-
訪問test.html的url為 : http://localhost:8080/web03_war_exploded/a/b/c/test.html
-
絕對路徑的基準路徑為 : http://localhost:8080
-
要獲取的目標資源url為 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
test.html中定義的了 :
<img src="/web03_war_exploded/static/img/logo.png"/>
-
尋找方式就是在基準路徑(http://localhost:8080)后面拼接src屬性值(/web03_war_exploded/static/img/logo.png),得到的正是目標資源訪問的正確路徑
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!-- 絕對路徑寫法 --><img src="/web03_war_exploded/static/img/logo.png">
</body>
</html>
絕對路徑情況3:web/WEB-INF/views/view1.html中引入web/static/img/logo.png
-
view1.html在WEB-INF下,需要通過Servlet請求轉發獲得
@WebServlet("/view1Servlet")
public class View1Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {RequestDispatcher requestDispatcher = req.getRequestDispatcher("WEB-INF/views/view1.html");requestDispatcher.forward(req,resp);}
}
-
訪問view1.html的url為 : http://localhost:8080/web03_war_exploded/view1Servlet
-
絕對路徑的基準路徑為 : http://localhost:8080
-
要獲取的目標資源url為 : http://localhost:8080/web03_war_exploded/static/img/logo.png
-
view1.html中定義的了 :
<img src="/web03_war_exploded/static/img/logo.png"/>
-
尋找方式就是在基準路徑(http://localhost:8080)后面拼接src屬性值(/static/img/logo.png),得到的正是目標資源訪問的正確路徑
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><img src="/web03_war_exploded/static/img/logo.png">
</body>
</html>
base標簽的使用
base標簽定義頁面相對路徑公共前綴
-
base 標簽定義在head標簽中,用于定義相對路徑的公共前綴
-
base 標簽定義的公共前綴只在相對路徑上有效,絕對路徑中無效
-
如果相對路徑開頭有 ./ 或者../修飾,則base標簽對該路徑同樣無效
index.html 和a/b/c/test.html 以及view1Servlet 中的路徑處理
?
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!--定義相對路徑的公共前綴,將相對路徑轉化成了絕對路徑--><base href="/web03_war_exploded/">
</head>
<body><img src="static/img/logo.png">
</body>
</html>
缺省項目上下文路徑
項目上下文路徑變化問題
-
通過 base標簽雖然解決了相對路徑轉絕對路徑問題,但是base中定義的是項目的上下文路徑
-
項目的上下文路徑是可以隨意變化的
-
一旦項目的上下文路徑發生變化,所有base標簽中的路徑都需要改
解決方案
-
將項目的上下文路徑進行缺省設置,設置為 /,所有的絕對路徑中就不必填寫項目的上下文了,直接就是/開頭即可