JSP的相對路徑深入研究(多次完善)

要在/jsp/index.jsp文件使用圖片,如何計算相對路徑? 經過Servlet,struts轉發後又如何計算相對路徑     

     

目錄結構:

 

    

 

------------------------------------------------------------------------------

 

第一種情況 :直接訪問JSP文件

URL是 http://localhost/Context path /jsp/index.jsp

 

要在index.jsp引用go.gif文件:

1、使用決對路徑

<img src='<%=request.getContextPath() %>/images/go.gif'/>

瀏覽器尋找方式: 域名+/Context path/images/go.gif   ,可找到。

 

 

2、使用相對路徑

<img src='../images/go.gif'/>

瀏覽器尋找方式:通過地址欄分析,index.jsp所在目錄(jsp )的上一層目錄(WebRoot)下的images/go.gif文件  

 

 

3、使用base href

<%=request.getContextPath() %>太麻煩,可以在每一個jsp文件頂部加入以下代碼

<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <base href="<%=basePath%>">

 

 

 <img src='images/go.gif'/>

瀏覽器尋找方式: basePath的值http://localhost/Context path/ 再加上images/go.gif,可找到。

 

 

------------------------------------------------------------------------------


第二種情況: servlet轉發到jsp

 

1、使用相對路徑  

URL是http://localhost/Context path /servlet_2   (轉發到/jsp/index.jsp)

 

錯誤:

根據/jsp/index.jsp路徑計算,得到 <img src='../images/go.gif'/>

 

 

正確:

<img src='images/go.gif'/>

 

原因:

index.jsp是保存在服務器端的/jsp/index.jsp目錄下面,但通過轉發後瀏覽器並不知道/jsp/目錄的存在,因爲地址欄中沒有體現出來。所以服務器端/jsp/目錄並不會對相對路徑產生影響

瀏覽器尋找方式:通過地址欄分析http://localhost/Context path /servlet_2 ,相對於servlet_2所在目錄(/)下面找到images/go.gif文件

 

 

2、使用相對路徑

URL是http://localhost/Context path /servlet /ser/ser/servlet_1 (轉發到/jsp/index.jsp)

 

“/servlet /ser/ser/servlet_1 是在web.xml文件配置的

 

錯誤:

根據/jsp/index.jsp路徑計算,得到 <img src='../images/go.gif'/>

 

正確:  

<img src='../../../images/go.gif'/>

 

原因:

index.jsp是保存在服務器端的/jsp/index.jsp目錄下面,但通過轉發後瀏覽器並不知道/jsp/目錄的存在,因爲地址欄中沒有體現出來。所以服務器端/jsp/目錄並不會對相對路徑產生影響

瀏覽器尋找方式:通過地址欄分析http://localhost/Context path /servlet /ser/ser/servlet_1,相對於servlet_1所在目錄(ser)的上一層目錄的上一層目錄的上一層目錄(/)下的images/go.gif文件

 

 

 

3、使用決對路徑

<img src='<%=request.getContextPath() %>/images/go.gif'/>

 

 

------------------------------------------------------------------------------

 

總結:相對路徑是由瀏覽器通過地址欄分析出來的,與服務器端文件的存放路徑沒有 關係,由其是使用Servlet,struts轉發到某jsp文件後,某jsp在服務器端存放的位置是/a/b/c/d/f/g.jsp , 但經過Servlet,struts轉發後,瀏覽器的地址欄可不一定是/a/b/c/d/f/這樣的層次。所以相對路徑的計算以瀏覽器地址欄爲準 。原創地址:http://elf8848.iteye.com/

 

 

 

struts2中可以使用命名空間,來保證瀏覽器地址欄中的目錄層次與服務器端目錄層次的一致性,這樣程序員通過服務器端的目錄層次計算相對路徑,在瀏覽器中也是正常的。

但我們理解了原理,就算不使用命名空間,自己也有強大的控制力。

 

轉載入註明出處:JAVA應用與開發辦公室 http://elf8848.iteye.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章