jsp的相对路径问题
test2.js? 與index.jsp?放在同一文件夾下,比如: web應用/home/下面.
?
要把test2.js?引入到?index.jsp中,? 針對三種情況,分析如下:
?
----------------------------------------------------------
?
第一種情況?
一般在學習時, 一個tomcat上都跑多個工程, 用工程名來區分
因為我的的URL是 :http://localhost/工程名?/home/index.jsp
多了一個工程名,所以要加 <%=request.getContextPath()?%>
如下:
<script?src="<%=request.getContextPath()?%>?/home/test.js"></script>
?
---------------------------------------------------------------------------------
第二,? 訪問JSP文件時, 用相對路徑引入JS,CSS文件是OK的
?
真實項目中,? 一個tomcat上要是也跑了多個工程, 并用IP來區分
url 是這樣的:??http://localhost/home/index.jsp?????注意這里,是直接訪問JSP文件,不是servlet,不是struts?.
test2.js? 與index.jsp?放在同一文件夾下
下面用相對路徑來引入 JS文件 是OK 的:
<script?src=test2.js></script>
?
index.jsp可以找到test2.js文件
?
?
------------------------------------------------------------------------------
第三種情況:
?
在第二情況的基礎上, 我們訪問的是?servlet?或是struts的action? ,?再轉發到?index.jsp?
url 是:? http://localhost/***.do? 這里不是訪問JSP文件了
?
下面是OK 的.
<script?src=home/test2.js></script>
test2.js? 前面一定要有home/
實際項目中, 訪問 servlet或是struts的action最多, 所以這里要注意 了.
?
?
下面是錯誤的, index.jsp找不到test2.js文件
<script?src=test2.js></script>
?本來在 "第二種情況"中, 上面是OK的, 但現在情況有點不同了,不是訪問JSP文件了,訪問的是 servlet或是struts的action了.
?
?
-------------------------------------------------------------------------------
?
??????? 對上面現象的分析:?(源自網絡)
?
一. 我們平常?說的 "相對路徑?": 適用于"第二種情況"
?
有個html文件:a.html,其中有<link href="one.css" rel="stylesheet" type="text/css">,其中href屬性表示引用的css文件的路徑。?
one.css:表示one.css和a.hmtl處于同一個目錄?
user/one.css:表示one.css處于a.html所在目錄的子目錄user中。?
../one.css:表示one.css位于a.hmtl上一級目錄下,?
http://www.cnblogs.com/one.css:表示one.css位于a.hmtl上一級目錄的上一級目錄下,?
./:表示和a.hmtl同一目錄?
我們稱上述相對路徑為html相對路徑
?
?
?
?
二.?服務器端的相對路徑? ,??適用 于"第三種情況"
?
服務器端的相對地址指的是相對于你的web應用的地址,這個地址是在服務器端解析的(不同于html和javascript中的相對地址,他們是由客戶端 瀏覽器解析的)也就是說這時候在jsp和servlet中的相對地址應該是相對于你的web應用,即相對于http://192.168.0.1 /webapp/的。
?
?
?假設Web應用road中,應用的根路徑下有一個dir1文件夾和dir2文件夾。c.jsp在dir1中,a.jsp和b.jsp在dir2中。Web應用的結構如圖所示。?
?????? + root?
?????????? -dir1?
?????????????? c.jsp?
?????????? -dir2?
?????????????? a.jsp?
?????????????? b.jsp?
?
- 直接寫路徑表示和頁面在同一個文件夾下面,如<a href="b.jsp">b.jsp</a>
- "../"表示當前文件夾的上一級文件夾(相對路徑),如: ???? <a href="../dir2/b.jsp">b.jsp</a>,?
?
- ???? <a href="../dir1/c.jsp">c.jsp</a>
- "/"表示 http://機器IP:8080(絕對路徑),如: ???? <a href="/road/dir2/b.jsp">b.jsp</a>?
?
- ???? <a href="/road/dir1/c.jsp">c.jsp</a>?
- 轉發請求時:"/"表示“http://服務器IP:8080/Web應用名”,例如: ??? String forward = "/dir1/c.jsp";?
?
- ??? RequestDispatcher rd = request.getQRequestDispatcher(forward);
- 重定向時:“/”? 表示“http://機器IP:8080”,而通過request.getContextPath()得到的是:“http://機器IP:8080/Web應用名”,例如: ???? String str =? request.getContextPath();?
?
- ???? response.sendRedirect(str + "/dir1/c.jsp");?
?
××總結××?
- 在瀏覽器端:“/”表示的是一臺WEB服務器,“http://機器IP:8080”
- 在服務器端(請求轉發):“/”表示的是一個WEB服務器端的應用,“http://機器IP:8080/Web應用”
- 在服務器端(重定向):“/”表示的是一個WEB服務器,“http://機器IP:8080”
-
要在/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中可以使用命名空間,來保證瀏覽器地址欄中的目錄層次與服務器端目錄層次的一致性,這樣程序員通過服務器端的目錄層次計算相對路徑,在瀏覽器中也是正常的。
轉載于:https://www.cnblogs.com/aijindi/p/4671004.html
總結
以上是生活随笔為你收集整理的jsp的相对路径问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gartner:2015年SIEM(安全
- 下一篇: 十五天精通WCF——第十四天 一起聊聊F