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

在JSP中的若是使用 "相對路徑" 則有 html

可能會出現問題. java

由於 網頁中的 "相對路徑" , 他是相對於 "URL請求的地址" 去尋找資源. 瀏覽器

上面這句話是什麼意思呢 ? 
舉個例子: 
假如咱們有一個項目: MyApp 
在該項目下, 有一個jsp文件夾 
該文件夾下包括: 
login.jsp    // 登錄頁面 
register.jps // 註冊頁面 jsp

咱們在瀏覽器中輸入地址 (注意: 地址的內容): 
http://localhost:8080/MyApp/jsp/login.jsp 
這時候, 瀏覽器會連接到 "登錄頁面" (login.jsp) 
在login.jsp文件內包含了以下 "部分代碼": 
<a href="jsp/register.jsp">註冊用戶 </a> spa

那麼,若是咱們點擊這個連接,就會在瀏覽器地址欄中, 出現以下錯誤連接: 
http://localhost:8080/MyApp/jsp/jsp/register.jsp htm

看~~ 
爲何會出現"/jsp/jsp/register.jsp"呢? 
由於, 網頁中的"相對連接", 是相對於你所 "請求的URL路徑" 所決定的. 資源

即: get

由於這裏請求路徑是:http://localhost:8080/MyApp/jsp/login.jsp 後臺

那麼, 瀏覽器 就會在這個路徑下(即:http://localhost:8080/MyApp/jsp/)去找 變量

jsp/register.jsp 
因此就會出現以下錯誤內容: 
http://localhost:8080/MyApp/jsp/jsp/register.jsp

上面的問題,就是調用頁面和被調用頁面的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> 
<!-- *************************************-->

咱們能夠看到,在標籤 <a>中的href屬性內,咱們直接採用了 
「本項目路徑 ${pageScope.basePath}」 加上 "jsp/register.jsp" , 
從而構成一個絕對路徑(即: http://localhost:8080/MyApp/jsp/register.jsp)

可是這樣作有一個很很差的地方,那就是咱們必需要在每一個連接的前面都要加上

「${pageScope.basePath}」 
若是這樣作的話,將是一件很可怕的事情。

(二)方法二: 利用html中的 <base>標籤(推薦) 
下面是對html中的 <base>的介紹: 
base 元素可規定頁面中全部連接的基準 URL 
默認狀況下,頁面中的連接(包括樣式表、腳本和圖像的地址)都是相對於當前

頁面的地址(即:瀏覽器地址欄裏的請求URL)。 
咱們可使用 <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> 
<!-- *************************************-->

大概看完了上面的代碼,或許您仍是有些疑惑 *_*~~ 
不過當您看到了,下面的代碼,可能就豁然開朗了 (*^__^*) 嘻嘻……。

當咱們去執行上面的那段JSP代碼後,咱們能夠在瀏覽器中能夠查看,他所返回

給客戶端的html代碼: 
執行完上述JSP後,所返回的html代碼以下: 
<html> 
<head> 
<base href="http://localhost:8080/MyApp/"> 
</head> 
// 設置了 <base>後,相對路徑,相對於的就是base中的路徑,而再也不是瀏覽器

地址的請求路徑啦~~~ 
<a href="jsp/login.jsp">Login </a> 
</html>

咱們能夠看到JSP返回的html代碼中,包含了 <base

href="http://localhost:8080/MyApp/">內容。 
也就是說,在本html文件中,遇到的全部 「相對連接(例如: <a

href="jsp/login.jsp">)」,都是相對於base 
的路徑(即:http://localhost:8080/MyApp/),因此咱們就能夠進行的使用 相對

連接,而沒必要擔憂, 
轉發操做(forward)或 請求地址不一樣不一樣所形成的頁面沒法找到的錯誤啦~(即:

HTTP: 404)。。。

相關文章
相關標籤/搜索