在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)。。。