HTML、JSP、Servlet中的相对路径和绝对路径 页面跳转问题
HTML、JSP、Servlet中的相對(duì)路徑和絕對(duì)路徑
前提:
假設(shè)你的Http地址為http://192.168.0.1/,你的web應(yīng)用為test,path=”/test”,那么你的web應(yīng)用URL為http://192.168.0.1/test/
web項(xiàng)目目錄分析,文件存放位置
1)如果JSP,JS文件放在WEB-INF目錄下**【服務(wù)器外部】**是根本無(wú)法訪問(wèn)的。2)放在WEB-INF目錄下的JSP文件,可以通過(guò)服務(wù)器內(nèi)部轉(zhuǎn)向進(jìn)行訪問(wèn)(主要是為了頁(yè)面的安全)3)因?yàn)镴S是通過(guò)客戶端向服務(wù)器請(qǐng)求的(即需要能夠從服務(wù)器外部訪問(wèn)),所以圖片以及一些JS,CSS只能放在WEB-INF外面web應(yīng)用的目錄結(jié)構(gòu):
等效于下圖
src: 存放java源碼,編譯后的文件都會(huì)放在WEB-INF下的classes文件夾下
WebContent:項(xiàng)目創(chuàng)建完后,只有這個(gè)目錄有用,因?yàn)閣eb項(xiàng)目需要的所有文件都在這里。
web.xml
<servlet-mapping> <servlet-name>handleservlet</servlet-name> <url-pattern>/handleservlet</url-pattern>此映射是相對(duì)于當(dāng)前web應(yīng)用的 </servlet-mapping>所有相對(duì)路徑都是由”/”開(kāi)頭的
比如:/image/a.gif,/user/main.jsp,
大家知道在html中的相對(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中,即user是a.html在同一個(gè)目錄 。
../one.css:表示one.css位于a.hmtl上一級(jí)目錄下,
../../one.css:表示one.css位于a.hmtl上一級(jí)目錄的上一級(jí)目錄下,
./:表示和a.hmtl同一目錄
我們稱上述相對(duì)路徑為html相對(duì)路徑
1、 服務(wù)器端的地址
服務(wù)器端的相對(duì)地址指的是相對(duì)于你的web應(yīng)用的地址,這個(gè)地址是在服務(wù)器端解析的 (不同于html和JavaScript中的相對(duì)地址,他們是 由客戶端瀏覽器解析的 )。
也就是說(shuō)這時(shí)候在jsp和servlet中的相對(duì)地址應(yīng)該是相對(duì)于你的web應(yīng)用,即相對(duì)于http://192.168.0.1/test/的。
其用到的地方有:
1)forward:servlet中的request.getRequestDispatcher(address);這個(gè)address是在服務(wù)器端解析的。
所以你要forward到user/a.jsp應(yīng)該這么寫(xiě):
這個(gè)/相對(duì)于當(dāng)前的web應(yīng)用test,其絕對(duì)地址就是:http://192.168.0.1/test/user/a.jsp。
2)redirect:在jsp中
<%response.sendRedirect("/rtccp/user/a.jsp");%>2、 客戶端的地址
所有的html中的相對(duì)地址都是相對(duì)于http://192.168.0.1/的,而不是http://192.168.0.1/test/的 。
html中的form表單的action屬性的地址應(yīng)該是相對(duì)于http://192.168.0.1/的。所以,如果提交到user/a.jsp為:action=”/test/ user/a.jsp” ;提交到servlet為action=”/test/handleservlet”
Javascript也是在客戶端解析的,所以其相對(duì)路徑和form表單一樣。
3、 站點(diǎn)根目錄和css路徑問(wèn)題 (jsp是服務(wù)器端程序,地址是變化的,引用時(shí)一般用站點(diǎn)根目錄的相對(duì)路徑)
我們稱類似這樣的相對(duì)路徑/test/…. 為相對(duì)于站點(diǎn)根目錄 的相對(duì)路徑 。
當(dāng)在jsp中引入css時(shí),如果其相對(duì)路徑相對(duì)于當(dāng)前jsp文件的,而在一個(gè)和這個(gè)jsp的路徑不一樣的servlet中forward這個(gè)jsp時(shí),就會(huì)發(fā)現(xiàn)這個(gè)css樣式根本沒(méi)有起作用。這是因?yàn)樵趕ervlet中轉(zhuǎn)發(fā)時(shí)css的路徑就是相對(duì)于這個(gè)servlet的相對(duì)路徑而非jsp的路徑了。所以這時(shí)候不能在jsp中用這樣的路徑:
<link href="one.css" rel="stylesheet" type="text/css"> 或者 <link href="../../one.css" rel="stylesheet" type="text/css">類似href=”one.css”和../../one.css的html相對(duì)路徑是相對(duì)于引用這個(gè)css的文件(a.jsp)的相對(duì)路徑 。而在servlet中轉(zhuǎn)發(fā)時(shí)就是相對(duì)于這個(gè)servlet的相對(duì)路徑了,因?yàn)閖sp路徑和servlet路徑是不一樣的 ,所以這樣的引用肯定是出錯(cuò)的。
所以這個(gè)時(shí)候,要用站點(diǎn)根目錄,就是相對(duì)于http://192.168.0.1/的目錄,以“/”開(kāi)頭。
因此上述錯(cuò)誤應(yīng)更正為href=”/test/one.css” 類似的站點(diǎn)根目錄的相對(duì)目錄。這樣在servlet轉(zhuǎn)發(fā)后和jsp中都是相對(duì)于站點(diǎn)根目錄的相對(duì)路徑 ,就能正確使用所定義的css樣式了。
頁(yè)面跳轉(zhuǎn)問(wèn)題:
Forward(轉(zhuǎn)發(fā))和Redirect(重定向)
1)Forward 效率高, Redirect 效率低。
因?yàn)镽edirect 的流程是這樣的: request1 sent to server, server return back to client, 然后request2 then sent to server. 但是Forward 僅在server side處理, 對(duì)client side 是透明的. 由于Redirect 有兩次傳輸, 所以效率低.2)范圍:
由于對(duì)request.setAttribute() 來(lái)說(shuō), 它攜帶的對(duì)象生存范圍只在request內(nèi), 所以Redirect 方式會(huì)導(dǎo)致request攜帶的對(duì)象丟失。所有需要攜帶數(shù)據(jù)時(shí),必須選用forward方式。
3)使用說(shuō)明:
1. sendRedirect
servlet和jsp里面一樣response.sendRedirect();2. include
這種也是上面提到的forward形式,request的值會(huì)保存
1) servlet里面request.getRequestDispatcher("jsp2.jsp" ).include(request, response); 2) jsp里面<jsp:include page= "include.jsp" />說(shuō)明
頁(yè)面會(huì)同時(shí)包含頁(yè)面1和頁(yè)面2的內(nèi)容,地址欄不變。
使用request.setAttribute的內(nèi)容,可以正常使用
3. forword
1) servlet里面request.getRequestDispatcher("jsp2.jsp" ).forward(request,response); 2) jsp里面<jsp:forward page= "include.jsp" />說(shuō)明
頁(yè)面會(huì)是頁(yè)面2的內(nèi)容,地址欄不變
使用request.setAttribute的內(nèi)容,可以正常使用
4.JSP中用相對(duì)路徑引用JS,CSS文件的三種情況
第一種情況 最常見(jiàn)的情況
一個(gè)tomcat上都跑多個(gè)工程, 用工程名來(lái)區(qū)分.
因?yàn)槲业牡腢RL是 :http://localhost/工程名 /home/index.jsp
多了一個(gè)工程名,所以要加 <%=request.getContextPath() %>
如:
寫(xiě)<%=request.getContextPath() %>太麻煩,可以在每一個(gè)jsp文件頂部加入以下內(nèi)容后,
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://" +request.getServerName()+":" +request.getServerPort()+path+"/" ; %> <base href="<%=basePath%>" >就可直接使用
<script src=" /home/test.js"></script>了第二, 直接訪問(wèn)jsp文件
真實(shí)項(xiàng)目中, 一個(gè)tomcat上要是也跑了多個(gè)工程, 并用IP來(lái)區(qū)分.
url 是這樣的: http://localhost/home/index.jsp 注意這里,是直接訪問(wèn)JSP文件(jsp文件不在web-inf下,可以直接訪問(wèn)),不是servlet也不是struts 。
test2.js 與index.jsp 放在同一文件夾下,下面用相對(duì)路徑來(lái)引入JS文件 是OK 的:
<script src=test2.js></script>index.jsp可以找到test2.js文件
第三種情況: servlet轉(zhuǎn)發(fā)到j(luò)sp(jsp在web-inf下,必須用servlet或action訪問(wèn))
在第二情況的基礎(chǔ)上,一個(gè)tomcat上要是也跑了多個(gè)工程, 并用IP來(lái)區(qū)分。
我們?cè)L問(wèn)的是servlet 或是struts的action , 再轉(zhuǎn)發(fā)到 index.jsp
url 是: http://localhost/*.do
url 是: http://localhost/index.action
這里不是訪問(wèn)JSP文件了
下面是OK 的.
<script src=/home/ test2.js></script>test2.js 前面一定要有/home/實(shí)際項(xiàng)目中, 訪問(wèn) servlet或是struts的action最多, 所以這里要使用
<script src=/home/test2.js></script>。請(qǐng)尊重原創(chuàng):原文地址–http://blog.csdn.net/wym19830218/article/details/5503533/
本文是在該文章基礎(chǔ)上進(jìn)行修改整理的。
總結(jié)
以上是生活随笔為你收集整理的HTML、JSP、Servlet中的相对路径和绝对路径 页面跳转问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JSP页面中实现使用taglib导入库时
- 下一篇: JSP动作标签useBean--jsp: