1. 程式人生 > >jsp中的basePath和path (絕對路徑 相對路徑)(重要)

jsp中的basePath和path (絕對路徑 相對路徑)(重要)

在JSP中的如果使用 “相對路徑” 則有可能會出現問題.

因為網頁中的 “相對路徑” , 他是相對於 “URL請求的地址” 去尋找資源.  上面這句話是什麼意思呢 ?

舉個例子:

假如我們有一個專案: MyApp

在該專案下, 有一個jsp資料夾 
該資料夾下包括: 
    login.jsp    // 登陸頁面 
    register.jps // 註冊頁面
  • 1
  • 2
  • 3
  • 4

我們在瀏覽器中輸入地址 (注意: 地址的內容):

http://localhost:8080/MyApp/jsp/login.jsp 
  • 1

這時候, 瀏覽器會連結到 “登陸頁面” (login.jsp)

在login.jsp頁面中有一個註冊連結:

<a href="jsp/register.jsp">註冊使用者 </a>
  • 1

那麼,如果我們點選這個連結,就會在瀏覽器位址列中, 出現如下錯誤連結:

http://localhost:8080/MyApp/jsp/jsp/register.jsp
  • 1

為什麼會出現”/jsp/jsp/register.jsp”呢?

因為, 網頁中的”相對連結”, 是相對於你所 “請求的URL路徑” 所決定的.

上面的問題,就是呼叫頁面和被呼叫頁面的URL不同所造成的

此類錯誤也常常會出現在2個頁面之間進行 “轉發”(forward) 操作的時候。  因為forward是在後臺進行的,對客戶端來說是透明的。(即: URL不改變,而資料內容卻是另一個頁面返回來的。。。)

那麼如何解決這問題呢?

方法一:直接採用絕對路徑 (不推薦)

在JSP頁面端,獲得本專案的絕對地址(如果你的專案叫MyApp,那麼獲得到的地  址就是 http://localhost:8080/MyApp/):

程式碼如下:

<!-- **************方法一***************** --> 
<%@ page language="java" pageEncoding="GBK"
    contentType="text/html;charset=gbk" isELIgnored="false"%>
<%
    String path = request.getContextPath();
    // 獲得本專案的地址(例如: http://localhost:8080/MyApp/)賦值給basePath變數 
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
    // 將 "專案路徑basePath" 放入pageContext中,待以後用EL表示式讀出。 
    pageContext.setAttribute("basePath", basePath);
%>
<html>
    <head>
    </head>
    <body>
        <a href="${pageScope.basePath}jsp/register.jsp">
    </body>
</html>
<!-- *************************************-->
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

我們可以看到,在標籤 <a>中的href屬性內,我們直接採用了 “本專案路徑 ${pageScope.basePath}” 加上 "jsp/register.jsp" , 從而構成一個絕對路徑(即: http://localhost:8080/MyApp/jsp/register.jsp)

但是這樣做有一個很不好的地方,那就是我們必須要在每個連結的前面都要加上“${pageScope.basePath}”

如果這樣做的話,將是一件很可怕的事情。

方法二: 利用html中的 <base>標籤(推薦)

下面是對html中的 <base>的介紹:

base 元素可規定頁面中所有連結的基準 URL 

預設情況下,頁面中的連結(包括樣式表、指令碼和影象的地址)都是相對於當前
頁面的地址(即:瀏覽器位址列裡的請求URL)。 
  • 1
  • 2
  • 3
  • 4

我們可以使用 <base>標籤中的href屬性來設定,所有的“相對基準 URL”。

上面說的是什麼意思呢?我們來看看程式碼就知道咯~~

這是JSP端的程式碼 ,下面的程式碼 (十分類似上面 “方法一” 中的JSP程式碼)  但是這裡我們並沒有採用 ${pageScope.basePath}+”相對路徑地址” 的方法,  而是採用了html檔案中的 <base>標籤:

程式碼如下:

<!-- *************JSP程式碼******************-->
<%@ page language="java" pageEncoding="GBK"
    contentType="text/html;charset=gbk" isELIgnored="false"%>
<%
    String path = request.getContextPath();
    // 獲得專案完全路徑(假設你的專案叫MyApp,那麼獲得到的地址就是http://localhost:8080/MyApp/): 
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<html>
<head>
    <!-- base需要放到head中 -->
    <base href=" <%=basePath%>">
</head>
    <!-- 這裡我們就可以直接使用相對路徑(即: 相對於base標籤) -->
    <a href="jsp/login.jsp">Login </a>
</html>
<!-- *************************************-->
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

大概看完了上面的程式碼,或許您還是有些疑惑  不過當您看到了,下面的程式碼,可能就豁然開朗了。

當我們去執行上面的那段JSP程式碼後,我們可以在瀏覽器中可以檢視,他所返回給客戶端的html程式碼:  執行完上述JSP後,所返回的html程式碼如下:

<html>
<head>
<base href="http://localhost:8080/MyApp/">
</head>
<!-- // 設定了 <base>後,相對路徑,相對於的就是base中的路徑,而不再是瀏覽器
地址的請求路徑啦~~~  -->
<a href="jsp/login.jsp">Login </a>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我們可以看到JSP返回的html程式碼中,包含了 <base href="http://localhost:8080/MyApp/">內容。

也就是說,在本html檔案中,遇到的所有 “相對連結(例如: <a href="jsp/login.jsp">)”,都是相對於base 路徑(即:http://localhost:8080/MyApp/),所以我們就可以進行的使用 相對連結,而不必擔心, 轉發操作(forward)或 請求地址不同不同所造成的頁面無法找到的錯誤啦~(即:HTTP: 404)。。。