JSP、Servlet中的相對路徑和絕對路徑 頁面跳轉問題

**1.JSP、Servlet中的相對路徑和絕對路徑 **
前提:假設你的Http地址為http://192.168.0.1/你的web應用為test,path="/test"那么你的web應用URL為http://192.168.0.1/test/
如果JSP,JS文件放在WEB-INF目錄下根本無法訪問的,JSP如果放在WEB-INF目錄下可以通過服務器內部轉向進行訪問(主要是為了頁面的安全),但是JS是通過客戶端向服務器請求的,所以圖片以及一些JS,CSS只能放在WEB-INF外面 web應用的目錄結構: test/web/
css/ js/
test.js
web-inf/ classes/ lib/ user/ a.jsp b.jsp images/ web.xml <servlet-mapping> <servlet-name>handleservlet</servlet-name> <url-pattern>/handleservlet</url-pattern>此映射是相對于當前web應用的 </servlet-mapping> 所有相對路徑都是由"/"開頭的 。如:/image/a.gif,/user/main.jsp,大家知道在html中的相對路徑是這樣的:
有個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中,即user是a.html在同一個目錄 。 ../one.css:表示one.css位于a.hmtl上一級目錄下, ../../one.css:表示one.css位于a.hmtl上一級目錄的上一級目錄下, ./:表示和a.hmtl同一目錄 我們稱上述相對路徑為html相對路徑
1、 服務器端的地址 服務器端的相對地址指的是相對于你的web應用的地址,這個地址是在服務器端解析的 (不同于html和JavaScript中的相對地址,他們是 由客戶端瀏覽器解析的 )也就是說這時候在jsp和servlet中的相對地址應該是相對于你的web應用,即相對于http://192.168.0.1/test/的。 其用到的地方有: forward:servlet中的request.getRequestDispatcher(address);這個address是在服務器端解析的,所以,你要forwarder到user/a.jsp應該這么寫:request.getRequestDispatcher("/user/a.jsp ")這個/相對于當前的web應用test,其絕對地址就是:http://192.168.0.1/test/user/a.jsp。 redirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%> 2、 客戶端的地址 所有的html中的相對地址都是相對于http://192.168.0.1/的,而不是http://192.168.0.1/test/的 。 Html中的form表單的action屬性的地址應該是相對于http://192.168.0.1/的,所以,如果提交到user/a.jsp為:action="/test/ user/a.jsp" ;提交到servlet為action="/test/handleservlet" Javascript也是在客戶端解析的,所以其相對路徑和form表單一樣。 3、 站點根目錄和css路徑問題 (jsp是服務器端程序,地址是變化的,引用時一般用站點根目錄的相對路徑) 我們稱類似這樣的相對路徑/test/…. 為相對于站點根目錄 的相對路徑 。 當在jsp中引入css時,如果其相對路徑相對于當前jsp文件的,而在一個和這個jsp的路徑不一樣的servlet中forward這個jsp時,就會發現這個css樣式根本沒有起作用。這是因為在servlet中轉發時css的路徑就是相對于這個servlet的相對路徑而非jsp的路徑了。所以這時候不能在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相對路徑是相對于引用這個css的文件(a.jsp)的相對路徑 。而在servlet中轉發時就是相對于這個servlet的相對路徑了,因為jsp路徑和servlet路徑是不一樣的 ,所以這樣的引用肯定是出錯的。 所以這個時候,要用站點根目錄,就是相對于http://192.168.0.1/的目錄,以“/”開頭。 因此上述錯誤應更正為href=”/test/one.css” 類似的站點根目錄的相對目錄。這樣在servlet轉發后和jsp中都是相對于站點根目錄的相對路徑 ,就能正確使用所定義的css樣式了。

頁面跳轉問題:

Forward 高, Redirect 低, 因為Redirect 的流程是這樣的, request1 sent to server, server return back to client, 然后
request2 then sent to server. 但是Forward 僅在server side處理, 對client side 是透明的. 由于Redirect 有兩次傳輸, 所以效率低. 范圍: 由于對request.setAttribute() 來說, 它攜帶的對象生存范圍只在request內, 所以Redirect 方式會導致request攜帶的對象丟失.

使用說明:
1. sendRedirect
servlet和jsp里面一樣
response.sendRedirect();

**2. **include 這種也是上面提到的forward形式,request的值會保存
1) servlet里面
request.getRequestDispatcher( "jsp2.jsp" ).include(request, response);
2) jsp里面
<jsp:include page= "include.jsp" />
說明 頁面會同時包含頁面1和頁面2的內容,地址欄不變。 使用request.setAttribute的內容,可以正常使用

3. forword
1) servlet里面
request.getRequestDispatcher( "jsp2.jsp" ).forward(request, response); 2) jsp里面
<jsp:forward page= "include.jsp" />
說明 頁面會是頁面2的內容,地址欄不變 使用request.setAttribute的內容,可以正常使用


3.JSP中用相對路徑引用JS,CSS文件的三種情況
** 第一種情況** 最常見的情況 一個tomcat上都跑多個工程, 用工程名來區分 因為我的的URL是 :http://localhost/工程名 /home/index.jsp 多了一個工程名,所以要加 <%=request.getContextPath() %> 如:<script src="<%=request.getContextPath() %> /home/test.js"></script>
寫<%=request.getContextPath() %>太麻煩,可以在每一個jsp文件頂部加入以下內容后,

Java代碼

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

 就可直接使用 <script src=" /home/test.js"></script>了

** 第二, 直接訪問jsp文件** 真實項目中, 一個tomcat上要是也跑了多個工程, 并用IP來區分 url 是這樣的: http://localhost/home/index.jsp 注意這里,是直接訪問JSP文件(jsp文件不在web-inf下,可以直接訪問),不是servlet也不是struts 。 test2.js 與index.jsp 放在同一文件夾下,下面用相對路徑來引入JS文件 是OK 的: <script src=test2.js></script>
index.jsp可以找到test2.js文件

第三種情況: servlet轉發到jsp(jsp在web-inf下,必須用servlet或action訪問)
在第二情況的基礎上,一個tomcat上要是也跑了多個工程, 并用IP來區分。
我們訪問的是servlet 或是struts的action , 再轉發到 ****index.jsp url 是: http://localhost/***.do
url 是: http://localhost/index.action
這里不是訪問JSP文件了

下面是OK 的.     <script src=/home/ test2.js></script>
test2.js 前面一定要有/home/
實際項目中, 訪問 servlet或是struts的action最多, 所以這里要使用<script src=/home/test2.js></script>。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,721評論 18 399
  • 0 系列目錄# WEB請求處理 WEB請求處理一:瀏覽器請求發起處理 WEB請求處理二:Nginx請求反向代理 本...
    七寸知架構閱讀 14,011評論 22 190
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,826評論 0 11
  • 今天周一新的禮拜又開始了,心情美麗!每天有個好心情是一個嶄新的開始! 今天陳老師讓下載了青島教育...
    瑤媽1閱讀 101評論 0 0