解決JSP路徑問題的方法(jsp文件開頭path, basePath作用)


原文:http://blog.csdn.net/mingxunzh/article/details/4627185

 

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

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

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

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

那么,如果我們點擊這個鏈接,就會在瀏覽器地址欄中, 出現如下錯誤鏈接: 
http://localhost:8080/MyApp/jsp/jsp/register.jsp

看~~ 
為什么會出現"/jsp/jsp/register.jsp"呢? 
因為, 網頁中的"相對鏈接", 是相對於你所 "請求的URL路徑" 所決定的.

即:

因為這里請求路徑是: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)。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM