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