程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> jsp路徑問題

jsp路徑問題

編輯:關於JSP

解決JSP中的路徑問題
在JSP中的如果使用 "相對路徑" 則有可能會出現問題.
因為 網頁中的 "相對路徑" , 他是相對於 "URL請求的地址" 去尋找資源.
上面這句話是什麼意思呢 ?
舉個例子:
假如我們有一個項目: MyApp
在該項目下, 有一個jsp文件夾
該文件夾下包括:
login.jsp     // 登陸頁面
register.jps // 注冊頁面

這時候, 浏覽器會鏈接到 "登陸頁面" (login.jsp)
在login.jsp文件內包含了如下 "部分代碼":
<a href="jsp/register.jsp">注冊用戶</a>

看~~
為什麼會出現"/jsp/jsp/register.jsp"呢?
因為, 網頁中的"相對鏈接", 是相對於你所 "請求的URL路徑" 所決定的.
即:
因為這裡請求路徑是:http://localhost:8080/MyApp/jsp/login.jsp
那麼, 浏覽器 就會在這個路徑下(即:http://localhost:8080/MyApp/jsp/)去找 jsp/register.jsp

上面的問題,就是調用頁面和被調用頁面的URL不同所造成的,
此類錯誤也常常會出現在2個頁面之間進行 "轉發"(forward) 操作的時候。
因為forward是在後台進行的,對客戶端來說是透明的。(即: URL不改變,而數據內容卻是另一個頁面返回來的。。。)

那麼如何解決這問題呢?
(一)方法一:直接采用絕對路徑 (不推薦)
在JSP頁面端,獲得本項目的絕對地址(如果你的項目叫MyApp,
代碼如下:
<!-- **************方法一***************** -->
<%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=gbk" isELIgnored="false"%>
<%
String path = request.getContextPath();
// 獲得本項目的地址
賦值給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" ,
從而構成一個絕對路徑
但是這樣做有一個很不好的地方,那就是我們必須要在每個鏈接的前面都要加上 “${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)。。。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved