HTML、JSP、Servlet中的相对路径和绝对路径 页面跳转问题
HTML、JSP、Servlet中的相對路徑和絕對路徑
前提:
假設你的Http地址為http://192.168.0.1/,你的web應用為test,path=”/test”,那么你的web應用URL為http://192.168.0.1/test/
web項目目錄分析,文件存放位置
1)如果JSP,JS文件放在WEB-INF目錄下**【服務器外部】**是根本無法訪問的。2)放在WEB-INF目錄下的JSP文件,可以通過服務器內部轉向進行訪問(主要是為了頁面的安全)3)因為JS是通過客戶端向服務器請求的(即需要能夠從服務器外部訪問),所以圖片以及一些JS,CSS只能放在WEB-INF外面web應用的目錄結構:
等效于下圖
src: 存放java源碼,編譯后的文件都會放在WEB-INF下的classes文件夾下
WebContent:項目創建完后,只有這個目錄有用,因為web項目需要的所有文件都在這里。
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/的。
其用到的地方有:
1)forward:servlet中的request.getRequestDispatcher(address);這個address是在服務器端解析的。
所以你要forward到user/a.jsp應該這么寫:
這個/相對于當前的web應用test,其絕對地址就是:http://192.168.0.1/test/user/a.jsp。
2)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(重定向)
1)Forward 效率高, Redirect 效率低。
因為Redirect 的流程是這樣的: request1 sent to server, server return back to client, 然后request2 then sent to server. 但是Forward 僅在server side處理, 對client side 是透明的. 由于Redirect 有兩次傳輸, 所以效率低.2)范圍:
由于對request.setAttribute() 來說, 它攜帶的對象生存范圍只在request內, 所以Redirect 方式會導致request攜帶的對象丟失。所有需要攜帶數據時,必須選用forward方式。
3)使用說明:
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的內容,可以正常使用
4.JSP中用相對路徑引用JS,CSS文件的三種情況
第一種情況 最常見的情況
一個tomcat上都跑多個工程, 用工程名來區分.
因為我的的URL是 :http://localhost/工程名 /home/index.jsp
多了一個工程名,所以要加 <%=request.getContextPath() %>
如:
寫<%=request.getContextPath() %>太麻煩,可以在每一個jsp文件頂部加入以下內容后,
<% 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>。請尊重原創:原文地址–http://blog.csdn.net/wym19830218/article/details/5503533/
本文是在該文章基礎上進行修改整理的。
總結
以上是生活随笔為你收集整理的HTML、JSP、Servlet中的相对路径和绝对路径 页面跳转问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP页面中实现使用taglib导入库时
- 下一篇: JSP动作标签useBean--jsp: