10.URIs, URLs, and URNs

URIs, URLs, and URNs
    URI 統一資源標識符,用來唯一的標識一個資源,(抽象的、高層次概念定義的統一資源標識)
    URL 統一資源定位符,是一種具體的URI,可以用來標識一個資源而且還指明瞭如何定位(locator)這個資源。(具體的資源標識的方式,是URI的一種,用於絕對路徑)
    URN 統一資源命名,通過名字來標識資源(具體的資源標識的方式,是URI的一種)

    在Java的URI中,一個URI實例可以代表絕對的,也可以是相對的,只要它符合URI的語法規則。而URL類則不僅符合語義,還包含了定位該資源的信息,因此它不能是相對的,schema必須被指定。
    ok,現在回答文章開頭提出的問題,到底是imgUrl好呢,還是imgUri好?顯然,如果說imgUri是肯定沒問題的,因爲即使它實際上是url,那它也是uri的一種。那麼用imgUrl有沒有問題呢?此時則要看它的可能取值,如果是絕對路徑,能夠定位的,那麼用imgUrl是沒問題的,而如果是相對路徑,那還是不要用ImgUrl的好。總之,用imgUri是肯定沒問題的,而用imgUrl則要視實際情況而定。
    第二個,從HttpServletRequest的javadoc中可以看出,getRequestURI返回一個String,“the part of this request’s URL from the protocol name up to the query string in the first line of the HTTP request”,比如“POST /some/path.html?a=b HTTP/1.1”,則返回的值爲”/some/path.html”。現在可以明白爲什麼是getRequestURI而不是getRequestURL了,因爲此處返回的是相對的路徑。而getRequestURL返回一個StringBuffer,“The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.”,完整的請求資源路徑,不包括querystring。
    總結一下:URL是一種具體的URI,它不僅唯一標識資源,而且還提供了定位該資源的信息。URI是一種語義上的抽象概念,可以是絕對的,也可以是相對的,而URL則必須提供足夠的信息來定位,所以,是絕對的,而通常說的relative URL,則是針對另一個absolute URL,本質上還是絕對的。

    注:這裏的絕對(absolute)是指包含scheme,而相對(relative)則不包含scheme。

    URI抽象結構     [scheme:]scheme-specific-part[#fragment]

    [scheme:][//authority][path][?query][#fragment]

    authority爲[user-info@]host[:port]

    參考資料:

    http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.html

    http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

    http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html

    ps:

    java.net.URL類不提供對標準RFC2396規定的特殊字符的轉義,因此需要調用者自己對URL各組成部分進行encode。而java.net.URI則會提供轉義功能。因此The recommended way  to manage the encoding and decoding of URLs is to use  java.net.URI. 可以使用URI.toURL()和URL.toURI()方法來對兩個類型的對象互相轉換。對於HTML FORM的url encode/decode可以使用java.net.URLEncoder和java.net.URLDecoder來完成,但是對URL對象不適用。
發佈了35 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章