以往一直沒注意javaweb中的相對路徑和絕對路徑問題,有時有問題了,才想起去看看是否是路徑的問題,一直對路徑問題都是一知半解。今天就姑且記錄一下,畢竟事如春夢了無痕嘛,倘不記之筆墨,未免有辜彼蒼之厚。
對於一個URL
地址,我們在編碼的時候不會去這樣寫http://localhost/TestProject/registerUserServlet
大多只會在form
表單的提交路徑中寫上registerUserServlet
或者/TestProject/registerUserServlet
如此這般。
那其實這兩種寫法效果是一樣的,只是前者叫做相對路徑
或者叫做絕對路徑
。
- 相對路徑:以
./
開頭,可以省略 - 絕對路徑:以
/
開頭
我們先來看相對路徑,只要搞清楚當前資源與目標資源之間的相對關系,相對路徑是非常容易的。
我們通過舉例來說明。
我們建立一個javaweb
l類型的項目
在web
文件夾下我們新建一個location.html
文件
<body>
<h1>相對路徑</h1>
<h1>找到當前資源和目標資源之間的相對位置關系</h1>
<P>
當前資源:location.html
http://localhost/day15/location.html
</P>
<P>
目標資源:
http://localhost/day15/responseDemo
</P>
<a href="./responseDemo">
responseDemo2
</a>
<a href="responseDemo">
responseDemo2
</a>
在src/com/helius/servelt
文件夾下新建一個responseDemo
的servlet類,來處理location.html
中的響應。
那此時采用上圖中的兩種寫法都是可以的,因為相對路徑中的./
可以省略。
分析:當我們打開瀏覽器,准備訪問這個html文件,我們訪問的路徑是什么呢?
顯然是 http://localhost/day15/location.html
day15
我們稱為虛擬目錄
,虛擬目錄可以在idea
中的啟動的tomcat
中配置。
也就是apache-tomcat-7.0.94\conf\server.xml
中配置的Context
標簽
<Context path="/day15" docBase="c:\work_folder" />
另外這個文件是在web
目錄下的,也就是項目根目錄
所以得出它的訪問路徑 http://localhost/day15/location.html
再來看responseDemo
這個從哪里來的呢,當然是我們在web.xml中配置的
<servlet>
<servlet-name>ResponseDemo</servlet-name>
<servlet-class>ResponseDemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseDemo</servlet-name>
<url-pattern>/responseDemo</url-pattern>
</servlet-mapping>
注:Servlet3.0
可以直接通過注解進行配置
所以當我們請求這個類的路徑就是http://localhost/day15/responseDemo
將兩個路徑比較一下,使用相對路徑可以通過href="responseDemo"
進行訪問。
再來看絕對路徑
絕對路徑要分兩種情況了,需要判斷定義的路徑是給誰用的?判斷請求從哪里發出?
- 給客戶端使用:需要加虛擬目錄
<a>
標簽,<form>
標簽、重定向
- 給服務端使用:不需要加虛擬目錄
- 轉發
再來看用絕對路徑怎么改寫上個例子
<h1>絕對路徑</h1>
<a href="/day15/responseDemo">
responseDemo2
</a>
絕對路徑以/
開頭,顯然,這個超鏈接肯定是通過用戶點擊,也即是客戶端使用,請求也由客戶端發出,所以需要加上虛擬目錄day15
同理,我們可以思考,哪些是客戶端發出的請求呢?
比如使用
- form表單進行提交
- 點擊超連接
- 重定向:切記重定向是客戶端行為,
哪些是服務端行為呢?
比較常見的就是轉發操作
Tips:如果動態獲取虛擬目錄
request.getContextPath()
好吧,這次記錄的比較簡潔,希望這次不會再忘記了。