1.JSP、Servlet中的相對路徑和絕對路徑
前提:假設你的Http地址為http://192.168.0.1/你的web應用為test,path="/test"那麼你的web應用URL為http://192.168.0.1/test/
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處於 。
../one.css:表示one.css位於a.hmtl上一級目錄下,
../../one.css:表示one.css位於a.hmtl上一級目錄的上一級目錄下,
./:表示和a.hmtl同一目錄
我們稱上述相對路徑為
1、 伺服器端的地址
伺服器端的相對位址指的是相對於你的web應用的地址, (不同於 )也就是說這時候在jsp和servlet中的相對位址應該是相對於你的web應用,即相對於http://192.168.0.1/test/的。
其用到的地方有:
forward:servlet中的request.getRequestDispatcher(address);這個address是在伺服器端解析的,所以,你要forwarder到user/a.jsp應該這麼寫:request.getRequestDispatcher("")這個/相對於當前的web應用test,其絕對位址就是:
redirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>
2、 用戶端的地址
所有的html中的相對位址都是 。
Html中的form表單的action屬性的地址應該是相對於http://192.168.0.1/的,所以,如果提交到user/a.jsp為:action=" user/a.jsp" ;提交到servlet為action="/test/handleservlet"
3、 網站根目錄和css路徑問題
我們稱類似這樣的相對路徑 為相對於 。
當在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的檔案 。而在servlet中轉寄時就是相對於這個servlet的相對路徑了,因為 ,所以這樣的引用肯定是出錯的。
所以這個時候,要用網站根目錄,就是相對於http://192.168.0.1/的目錄,以“/”開頭。
因此上述錯誤應更正為 類似的網站根目錄的相對目錄。這樣在servlet轉寄後和jsp中都是 ,就能正確使用所定義的css樣式了。
頁面跳轉問題:
高, 低, 因為的流程是這樣的, request1 sent to server, server return back to client, 然後
request2 then sent to server. 但是僅在server side處理, 對client side 是透明的. 由於有兩次傳輸, 所以效率低.
範圍:
由於對request.setAttribute() 來說, 它攜帶的對象生存範圍只在request內, 所以方式會導致request攜帶的對象丟失.
使用說明:
1. sendRedirect
servlet和jsp裡面一樣
response.sendRedirect();
2. include 這種也是上面提到的forward形式,
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=>
/home/test.js"></script>了
第二, 直接存取jsp檔案
真實項目中, 一個tomcat上要是也跑了多個工程, 並用IP來區分
url 是這樣的: http://localhost/home/index.jsp 。
test2.js 與index.jsp 放在同一檔案夾下,下面用相對路徑來引入JS檔案 是OK 的:
< script src=test2.js></script>
index.jsp可以找到test2.js檔案
第三種情況: servlet轉寄到jsp(jsp在web-inf下,必須用servlet或action訪問)
在第二情況的基礎上,一個tomcat上要是也跑了多個工程, 並用IP來區分。
我們訪問的是 或是struts的index.jsp
url 是:
url 是:
這裡不是訪問JSP檔案了
下面是OK 的.
< script src= test2.js></script>
test2.js 前面一定要有/home/
實際項目中, 訪問 servlet或是struts的action最多, 所以這裡要使用<script src=/home/test2.js></script>。