jsp的相对路径问题
test2.js? 與index.jsp?放在同一文件夾下,比如: web應(yīng)用/home/下面.
?
要把test2.js?引入到?index.jsp中,? 針對(duì)三種情況,分析如下:
?
----------------------------------------------------------
?
第一種情況?
一般在學(xué)習(xí)時(shí), 一個(gè)tomcat上都跑多個(gè)工程, 用工程名來區(qū)分
因?yàn)槲业牡腢RL是 :http://localhost/工程名?/home/index.jsp
多了一個(gè)工程名,所以要加 <%=request.getContextPath()?%>
如下:
<script?src="<%=request.getContextPath()?%>?/home/test.js"></script>
?
---------------------------------------------------------------------------------
第二,? 訪問JSP文件時(shí), 用相對(duì)路徑引入JS,CSS文件是OK的
?
真實(shí)項(xiàng)目中,? 一個(gè)tomcat上要是也跑了多個(gè)工程, 并用IP來區(qū)分
url 是這樣的:??http://localhost/home/index.jsp?????注意這里,是直接訪問JSP文件,不是servlet,不是struts?.
test2.js? 與index.jsp?放在同一文件夾下
下面用相對(duì)路徑來引入 JS文件 是OK 的:
<script?src=test2.js></script>
?
index.jsp可以找到test2.js文件
?
?
------------------------------------------------------------------------------
第三種情況:
?
在第二情況的基礎(chǔ)上, 我們訪問的是?servlet?或是struts的action? ,?再轉(zhuǎn)發(fā)到?index.jsp?
url 是:? http://localhost/***.do? 這里不是訪問JSP文件了
?
下面是OK 的.
<script?src=home/test2.js></script>
test2.js? 前面一定要有home/
實(shí)際項(xiàng)目中, 訪問 servlet或是struts的action最多, 所以這里要注意 了.
?
?
下面是錯(cuò)誤的, index.jsp找不到test2.js文件
<script?src=test2.js></script>
?本來在 "第二種情況"中, 上面是OK的, 但現(xiàn)在情況有點(diǎn)不同了,不是訪問JSP文件了,訪問的是 servlet或是struts的action了.
?
?
-------------------------------------------------------------------------------
?
??????? 對(duì)上面現(xiàn)象的分析:?(源自網(wǎng)絡(luò))
?
一. 我們平常?說的 "相對(duì)路徑?": 適用于"第二種情況"
?
有個(gè)html文件:a.html,其中有<link href="one.css" rel="stylesheet" type="text/css">,其中href屬性表示引用的css文件的路徑。?
one.css:表示one.css和a.hmtl處于同一個(gè)目錄?
user/one.css:表示one.css處于a.html所在目錄的子目錄user中。?
../one.css:表示one.css位于a.hmtl上一級(jí)目錄下,?
http://www.cnblogs.com/one.css:表示one.css位于a.hmtl上一級(jí)目錄的上一級(jí)目錄下,?
./:表示和a.hmtl同一目錄?
我們稱上述相對(duì)路徑為html相對(duì)路徑
?
?
?
?
二.?服務(wù)器端的相對(duì)路徑? ,??適用 于"第三種情況"
?
服務(wù)器端的相對(duì)地址指的是相對(duì)于你的web應(yīng)用的地址,這個(gè)地址是在服務(wù)器端解析的(不同于html和javascript中的相對(duì)地址,他們是由客戶端 瀏覽器解析的)也就是說這時(shí)候在jsp和servlet中的相對(duì)地址應(yīng)該是相對(duì)于你的web應(yīng)用,即相對(duì)于http://192.168.0.1 /webapp/的。
?
?
?假設(shè)Web應(yīng)用road中,應(yīng)用的根路徑下有一個(gè)dir1文件夾和dir2文件夾。c.jsp在dir1中,a.jsp和b.jsp在dir2中。Web應(yīng)用的結(jié)構(gòu)如圖所示。?
?????? + root?
?????????? -dir1?
?????????????? c.jsp?
?????????? -dir2?
?????????????? a.jsp?
?????????????? b.jsp?
?
- 直接寫路徑表示和頁(yè)面在同一個(gè)文件夾下面,如<a href="b.jsp">b.jsp</a>
- "../"表示當(dāng)前文件夾的上一級(jí)文件夾(相對(duì)路徑),如: ???? <a href="../dir2/b.jsp">b.jsp</a>,?
?
- ???? <a href="../dir1/c.jsp">c.jsp</a>
- "/"表示 http://機(jī)器IP:8080(絕對(duì)路徑),如: ???? <a href="/road/dir2/b.jsp">b.jsp</a>?
?
- ???? <a href="/road/dir1/c.jsp">c.jsp</a>?
- 轉(zhuǎn)發(fā)請(qǐng)求時(shí):"/"表示“http://服務(wù)器IP:8080/Web應(yīng)用名”,例如: ??? String forward = "/dir1/c.jsp";?
?
- ??? RequestDispatcher rd = request.getQRequestDispatcher(forward);
- 重定向時(shí):“/”? 表示“http://機(jī)器IP:8080”,而通過request.getContextPath()得到的是:“http://機(jī)器IP:8080/Web應(yīng)用名”,例如: ???? String str =? request.getContextPath();?
?
- ???? response.sendRedirect(str + "/dir1/c.jsp");?
?
××總結(jié)××?
- 在瀏覽器端:“/”表示的是一臺(tái)WEB服務(wù)器,“http://機(jī)器IP:8080”
- 在服務(wù)器端(請(qǐng)求轉(zhuǎn)發(fā)):“/”表示的是一個(gè)WEB服務(wù)器端的應(yīng)用,“http://機(jī)器IP:8080/Web應(yīng)用”
- 在服務(wù)器端(重定向):“/”表示的是一個(gè)WEB服務(wù)器,“http://機(jī)器IP:8080”
-
要在/jsp/index.jsp文件使用圖片,如何計(jì)算相對(duì)路徑? 經(jīng)過Servlet,struts轉(zhuǎn)發(fā)后又如何計(jì)算相對(duì)路徑?????
?????
目錄結(jié)構(gòu):
?
???
?
------------------------------------------------------------------------------
?
第一種情況?:直接訪問JSP文件
URL是?http://localhost/Context path/jsp/index.jsp
?
要在index.jsp引用go.gif文件:
1、使用決對(duì)路徑
<img src='<%=request.getContextPath() %>/images/go.gif'/>
瀏覽器尋找方式: 域名+/Context path/images/go.gif?? ,可找到。
?
??
2、使用相對(duì)路徑
<img src='../images/go.gif'/>
瀏覽器尋找方式:通過地址欄分析,index.jsp所在目錄(jsp)的上一層目錄(WebRoot)下的images/go.gif文件?。
?
?
3、使用base href
寫<%=request.getContextPath()?%>太麻煩,可以在每一個(gè)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轉(zhuǎn)發(fā)到j(luò)sp?
1、使用相對(duì)路徑?
URL是http://localhost/Context path/servlet_2???(轉(zhuǎn)發(fā)到/jsp/index.jsp)
?
錯(cuò)誤:
根據(jù)/jsp/index.jsp路徑計(jì)算,得到?<img src='../images/go.gif'/>
?
?
正確:
<img src='images/go.gif'/>
?
原因:
index.jsp是保存在服務(wù)器端的/jsp/index.jsp目錄下面,但通過轉(zhuǎn)發(fā)后瀏覽器并不知道/jsp/目錄的存在,因?yàn)榈刂窓谥袥]有體現(xiàn)出來。所以服務(wù)器端/jsp/目錄并不會(huì)對(duì)相對(duì)路徑產(chǎn)生影響
瀏覽器尋找方式:通過地址欄分析http://localhost/Context path/servlet_2?,相對(duì)于servlet_2所在目錄(/)下面找到images/go.gif文件
?
?
2、使用相對(duì)路徑
URL是http://localhost/Context path/servlet/ser/ser/servlet_1 (轉(zhuǎn)發(fā)到/jsp/index.jsp)
?
“/servlet/ser/ser/servlet_1 是在web.xml文件配置的
?
錯(cuò)誤:
根據(jù)/jsp/index.jsp路徑計(jì)算,得到 <img src='../images/go.gif'/>
?
正確:?
<img src='../../../images/go.gif'/>
?
原因:
index.jsp是保存在服務(wù)器端的/jsp/index.jsp目錄下面,但通過轉(zhuǎn)發(fā)后瀏覽器并不知道/jsp/目錄的存在,因?yàn)榈刂窓谥袥]有體現(xiàn)出來。所以服務(wù)器端/jsp/目錄并不會(huì)對(duì)相對(duì)路徑產(chǎn)生影響
瀏覽器尋找方式:通過地址欄分析http://localhost/Context path/servlet/ser/ser/servlet_1,相對(duì)于servlet_1所在目錄(ser)的上一層目錄的上一層目錄的上一層目錄(/)下的images/go.gif文件
?
?
?
?
3、使用決對(duì)路徑
<img src='<%=request.getContextPath() %>/images/go.gif'/>
?
?
------------------------------------------------------------------------------
?
總結(jié):相對(duì)路徑是由瀏覽器通過地址欄分析出來的,與服務(wù)器端文件的存放路徑?jīng)]有關(guān)系,由其是使用Servlet,struts轉(zhuǎn)發(fā)到某jsp文件后,某jsp在服務(wù)器端存放的位置是/a/b/c/d/f/g.jsp , 但經(jīng)過Servlet,struts轉(zhuǎn)發(fā)后,瀏覽器的地址欄可不一定是/a/b/c/d/f/這樣的層次。所以相對(duì)路徑的計(jì)算以瀏覽器地址欄為準(zhǔn)。原創(chuàng)地址:http://elf8848.iteye.com/
?
?
?
struts2中可以使用命名空間,來保證瀏覽器地址欄中的目錄層次與服務(wù)器端目錄層次的一致性,這樣程序員通過服務(wù)器端的目錄層次計(jì)算相對(duì)路徑,在瀏覽器中也是正常的。
轉(zhuǎn)載于:https://www.cnblogs.com/aijindi/p/4671004.html
總結(jié)
以上是生活随笔為你收集整理的jsp的相对路径问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gartner:2015年SIEM(安全
- 下一篇: 十五天精通WCF——第十四天 一起聊聊F