找不到圖片,找不到js腳本,找不到css樣式表,都屬于這個問題。
要演示這個問題,是非常容易的,只需要滿足兩個條件:
forward前后的jsp頁面不在一個目錄下。
forward后的jsp頁面里使用相對路徑引用一些資源,圖片,js腳本,css樣式表什么的。
03-04里就模擬了這樣一個環境,你進入http://localhost:8080/03-04/,選擇“有問題的”:
打開03-04可以看到如下的目錄結構:
|--+ 03-04 |--- index.jsp |--- test.jsp |--+ result |--- success.jsp |--- failure.jsp |--- lingo.png
剛才咱們看到的頁面是failure.jsp,它里邊顯示圖片的部分是:
<img src="lingo.png" />
這時候就有疑問了,lingo.png和failure.jsp明明在同一個目錄下,為什么無法顯示。
現在請在無法顯示的圖片上,點擊鼠標右鍵,選擇屬性,讓我們看一下圖片的請求地址:
圖片的位置本來在http://localhost:8080/03-04/result/lingo.png,但請求的地址卻是http://localhost:8080/03-04/lingo.png。問題就是丟掉了中間的/result。
再試一次index.jsp上的“沒問題的”:
這次我們看到的頁面是success.jsp,它里邊顯示圖片的部分是:
<img src="result/lingo.png" />
結果手工加上result這段路徑后就可以顯示圖片了。
這個問題還要追溯到瀏覽器對html的處理方式,在html里包含的圖片,css樣式表,js腳本,視頻等等外部資源,都需要瀏覽器再次向服務器發起請求。
如果這些外部資源使用了相對路徑,瀏覽器就會在當前請求路徑的基礎上,加上相對路徑拼接出完整的http請求,發送給服務器。這個例子中,我們請求http://localhost:8080/03-04/test.jsp,瀏覽器得到的當前路徑就是http://localhost:8080/03-04/,failure.jsp中圖片的相對路徑是lingo.png,那么拼接的結果是http://localhost:8080/03-04/lingo.png。
不要怪瀏覽器太傻,是因為使用forward的時候瀏覽器并不清楚這些改變。它一直認為,既然自己請求的是test.jsp,返回的自然就是test.jsp的內容,那么再使用test.jsp當作當前路徑去計算相對路徑當然沒有問題。是我們欺騙了瀏覽器,在服務器偷偷改變了請求流向,返回了其他頁面的內容。
清楚了以上的請求流程,就知道如何應對這種問題了。
第一種方法:不要在不同目錄之間使用forward做請求轉發,保證當前路徑不發生變化。
第二種方法:像上例一樣修改圖片路徑,或全部改為絕對路徑。
請根據實際需要進行選擇。