java web中的相對路徑和絕對路徑


以往一直沒注意javaweb中的相對路徑和絕對路徑問題,有時有問題了,才想起去看看是否是路徑的問題,一直對路徑問題都是一知半解。今天就姑且記錄一下,畢竟事如春夢了無痕嘛,倘不記之筆墨,未免有辜彼蒼之厚。

對於一個URL地址,我們在編碼的時候不會去這樣寫http://localhost/TestProject/registerUserServlet

大多只會在form表單的提交路徑中寫上registerUserServlet或者/TestProject/registerUserServlet

如此這般。

那其實這兩種寫法效果是一樣的,只是前者叫做相對路徑或者叫做絕對路徑

  • 相對路徑:以./開頭,可以省略
  • 絕對路徑:以/開頭

我們先來看相對路徑,只要搞清楚當前資源與目標資源之間的相對關系,相對路徑是非常容易的。

我們通過舉例來說明。

我們建立一個javawebl類型的項目

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

同理,我們可以思考,哪些是客戶端發出的請求呢?

比如使用

  1. form表單進行提交
  2. 點擊超連接
  3. 重定向:切記重定向是客戶端行為,

哪些是服務端行為呢?

比較常見的就是轉發操作

Tips:如果動態獲取虛擬目錄

request.getContextPath()

好吧,這次記錄的比較簡潔,希望這次不會再忘記了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM