稍微上點規模的項目,通常都會爲不同模塊或功能的頁面,js,css等資源建立不同的路徑,或者對不同的servlet等配置不同的虛擬路徑。這時,關於各種路徑的包含和轉向問題長期困擾開發人員。
按照一般的做法,就是要理解web對資源的包含和轉向原理,即使:都是從當前所在位置起,根據路徑去尋找目標資源。
比如:
1.當前位置在path1下的test1.jsp,在test1.jsp中包含style目錄下的css文件drp.css。那麼test1.jsp中就應該這麼寫:,即從當前路徑回退一個到跟目錄,然後從根目錄下找style/drp.css。
<link rel="stylesheet" href="../style/drp.css">
2.又:在test1.jsp中js函數中訪問一個配置虛擬路徑的servlet,配置是這樣的那麼就應該這樣訪問:,即從當前路徑回退一個到跟目錄,然後從根目錄下找servlet/product/AddProductServlet
<url-pattern>/servlet/product/AddProductServlet</url-pattern>
../servlet/product/AddProductServlet
3.又:在AddProductServlet中作轉向,而在test2.jsp中又包含style目錄下的css文件drp.css。那麼在test2.jsp中應該這麼寫:
req.getRequestDispatcher("/path2/test2.jsp").forward(req, resp);
<link rel="stylesheet" href="../../style/drp.css">
這只是個簡單的例子,並沒有牽扯到多個servlet轉向同一個頁面等複雜情況。怎麼樣?web開發中的路徑問題夠頭疼的了吧?
現在我們看看使用<base>標籤是怎麼輕鬆解決這個問題的。
首先,在test1.jsp和test2.jsp中都添加這樣的代碼:
首先,在test1.jsp和test2.jsp中都添加這樣的代碼:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
... ....
<base href="<%=basePath %>">
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
... ....
<base href="<%=basePath %>">
那麼再在兩個頁面中使用任何資源都從跟目錄查找,在js中訪問任何資源只需在前面加上<%=basePath %>即可。比如上例中test1.jsp的兩處分別應該這樣寫:
<link rel="stylesheet" href="style/drp.css">
... ...
<%=basePath %>servlet/product/AddProductServlet
... ...
<%=basePath %>servlet/product/AddProductServlet
<link rel="stylesheet" href="style/drp.css">
無論他們之間引用的資源再多,關係再複雜,只需要記住一句話:<base>標籤讓本頁面所有引用資源都從根目錄找,但它只對頁面元素起作用,對js元素無效。