JSP的相對路徑深入研究(更新中...)

來源:互聯網
上載者:User

目錄結構:


                                    

 

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

 

第一種情況 :直接存取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/這樣的層次。所以相對路徑的計算以瀏覽器地址欄為準。


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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.