小小<base>標籤在web開發中的大作用

    稍微上點規模的項目,通常都會爲不同模塊或功能的頁面,js,css等資源建立不同的路徑,或者對不同的servlet等配置不同的虛擬路徑。這時,關於各種路徑的包含和轉向問題長期困擾開發人員。
    按照一般的做法,就是要理解web對資源的包含和轉向原理,即使:都是從當前所在位置起,根據路徑去尋找目標資源。
     比如:
     1.當前位置在path1下的test1.jsp,在test1.jsp中包含style目錄下的css文件drp.css。那麼test1.jsp中就應該這麼寫:
<link rel="stylesheet" href="../style/drp.css">
,即從當前路徑回退一個到跟目錄,然後從根目錄下找style/drp.css。
    2.又:在test1.jsp中js函數中訪問一個配置虛擬路徑的servlet,配置是這樣的
<url-pattern>/servlet/product/AddProductServlet</url-pattern>
那麼就應該這樣訪問:
../servlet/product/AddProductServlet
,即從當前路徑回退一個到跟目錄,然後從根目錄下找servlet/product/AddProductServlet
   3.又:在AddProductServlet中作轉向
req.getRequestDispatcher("/path2/test2.jsp").forward(req, resp);
,而在test2.jsp中又包含style目錄下的css文件drp.css。那麼在test2.jsp中應該這麼寫:
<link rel="stylesheet" href="../../style/drp.css">
,即從當前路徑(servlet/product)回退兩次到根目錄,然後從根目錄下找style/drp.css。

這只是個簡單的例子,並沒有牽扯到多個servlet轉向同一個頁面等複雜情況。怎麼樣?web開發中的路徑問題夠頭疼的了吧?

現在我們看看使用<base>標籤是怎麼輕鬆解決這個問題的。
首先,在test1.jsp和test2.jsp中都添加這樣的代碼:

<%
      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
同樣,test2.jsp中之處應該這麼寫:
<link rel="stylesheet" href="style/drp.css">
無論他們之間引用的資源再多,關係再複雜,只需要記住一句話:<base>標籤讓本頁面所有引用資源都從根目錄找,但它只對頁面元素起作用,對js元素無效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章