我的原則
所有路徑一律使用絕對路徑,就是以"/"開頭的或者帶host的路徑。形如:
/imgs/1.jpg <%= request.getContextPath()%>/imgs/1.jpg //推薦使用
應該盡量避免使用類似".","./","../../"等類似的相對該文件位置的相對路徑。一方面,這樣當文件移動時,很容易出問題。另一方面,絕對路徑用起來簡單。
相對路徑和絕對路徑
相對路徑(Relative Path)以引用文件的網頁所在位置為參考基礎,而建立出的目錄路徑。形如:
imgs/1.jpg; ../imgs/1.jpg; ./imgs/1.jpg
絕對路徑(absolute path)以Web 站點根目錄(形如:http://localhost:8080/)為參考基礎的目錄路徑。之所以稱為絕對,意指當所有網頁引用同一個文件時,所使用的路徑都是一樣的。形如:
http://localhost:8080/yourwebapp/index.jsp /imgs/1.jpg
"." -- 代表目前所在的目錄,相對路徑。 如:<a href="./abc">文本</a> 或 <a href="abc">
".." -- 代表上一層目錄,相對路徑。 如:<a href="../abc">文本</a>
"../../" -- 代表的是上一層目錄的上一層目錄,相對路徑。 如:<img src="../../abc" />
"/" -- 代表根目錄,絕對路徑。 如:<a href="/abc">文本</a> 或 <img src="/abc" />
"D:/abc/" -- 代表根目錄,絕對路徑。
前端后台根目錄
前端——服務器的根目錄"/":所代表的路徑形如:
http://localhost:8080/
后台——Web應用的根目錄"/":所代表的路徑形如:
http://localhost:8080/yourwebapp/
前端地址(瀏覽器解析)
所有的html頁面中的絕對地址都是相對於host根目錄(http://localhost:8080/)的,是由瀏覽器解析。路徑前的"/"代表host根目錄。
注:host代表指定請求資源的Intenet主機和端口號。
jsp頁面中html標簽如<a> <img><form>路徑前面的"/"代表(http://localhost:8080/)。
eg:
<form action="myaction"> //絕對URL地址是http://localhost:8080/yourwebapp/myaction
注意這里是因為,后面講到的basePath。
<form action="<%=basePath%>myaction"> //絕對URL地址是http://localhost:8080/yourwebapp/myaction
<form action="/myaction"> //絕對URL地址是http://localhost:8080/myaction //路徑錯誤
服務器端地址(tomcat解析)
服務器端的絕對地址指的是相對於你的web應用的地址(http://localhost:8080/yourwebapp/),是由tomcat解析。在jsp和servlet中路徑前的"/"代表webapp的根目錄。
其用到的地方有:forward、url-pattern
servlet中request.getRequestDispatcher(address);假設你要forward到項目根目錄下的user目錄下a.jsp應該這么寫:
request.getRequestDispatcher("/user/a.jsp").forward(request, response);
這個"/"當前的web應用yourwebapp根目錄,其絕對URL地址就是:
http://localhost:8080/yourwebapp/user/a.jsp。
然而sendRedirect中redirect是客戶端的行為,所以應該是以瀏覽器解析的方式來書寫url;
/yourwebapp/user/a.jsp
JSP頁面中的basePath
新建一個JSP頁面自動生成如下代碼:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<head>
<base href="<%=basePath%>">
</head>
說明:
path="/yourwebapp";//項目名 basePath="http://localhost:8080/yourwebapp/";//host+項目名
base標簽的href屬性規定頁面中所有相對鏈接的基准URL。解決了前面敘述的前后台路徑不統一的問題。
eg:
<a href="<%=path %>/counter/one.jsp">one.jsp</a>//注意path后面沒有"/",得加上。
html頁面輸出為:
<a href="/yourwebapp/counter/one.jsp">one.jsp</a>
因為有<base>標簽的存在,相對路徑會失效,例如:
<img src="imgs/1.jpg">
無論圖片所在的網頁在哪個目錄,在yourwebapp/目錄下,還是在yourwebapp/news/目錄也好。其瀏覽器解析出圖片的URL為:
http://localhost:8080/yourwebapp/imgs/1.jpg
也就是說:所有前面不帶"/"或者host的路徑A,瀏覽器解析的URL為: basePath+A。
從而形成了前后台路徑使用的統一。
