URIs, URLs, and URNs

這兩天在寫代碼的時(shí)候,由于涉及到資源的位置,因此,需要在Java Bean中定義一些字段,用來表示資源的位置,比如:imgUrl,logoUri等等。但是,每次定義的時(shí)候,心里都很糾結(jié),是該用imgUrl還是imgUri呢?

同樣的,另外一個(gè)問題:String HttpServletRequest.getRequestURI();和StringBuffer HttpServletRequest.getRequestURL();返回的內(nèi)容有何不同?為什么會(huì)如此?

帶著這些問題到網(wǎng)上去搜了下,沒發(fā)現(xiàn)讓自己看了明白的解釋,于是,想到了Java類庫里有兩個(gè)對(duì)應(yīng)的類java.net.URI和java.net.URL,終于,在這兩個(gè)類里的javadoc里找到了答案。

URIs, URLs, and URNs

首先,URI,是uniform resource identifier,統(tǒng)一資源標(biāo)識(shí)符,用來唯一的標(biāo)識(shí)一個(gè)資源。而URL是uniform resource locator,統(tǒng)一資源定位器,它是一種具體的URI,即URL可以用來標(biāo)識(shí)一個(gè)資源,而且還指明了如何locate這個(gè)資源。而 URN,uniform resource name,統(tǒng)一資源命名,是通過名字來標(biāo)識(shí)資源,比如mailto:java-net@java.sun.com。也就是說,URI是以一種抽象的,高層 次概念定義統(tǒng)一資源標(biāo)識(shí),而URL和URN則是具體的資源標(biāo)識(shí)的方式。URL和URN都是一種URI。

在Java的URI中,一個(gè)URI實(shí)例可以代表絕對(duì)的,也可以是相對(duì)的,只要它符合URI的語法規(guī)則。而URL類則不僅符合語義,還包含了定位該資源的信息,因此它不能是相對(duì)的,schema必須被指定。

ok,現(xiàn)在回答文章開頭提出的問題,到底是imgUrl好呢,還是imgUri好?顯然,如果說imgUri是肯定沒問題的,因?yàn)榧词顾鼘?shí)際上是 url,那它也是uri的一種。那么用imgUrl有沒有問題呢?此時(shí)則要看它的可能取值,如果是絕對(duì)路徑,能夠定位的,那么用imgUrl是沒問題的, 而如果是相對(duì)路徑,那還是不要用ImgUrl的好。總之,用imgUri是肯定沒問題的,而用imgUrl則要視實(shí)際情況而定。

第二個(gè),從HttpServletRequest的javadoc中可以看出,getRequestURI返回一個(gè)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”。現(xiàn)在可以明白為什么是getRequestURI而不是 getRequestURL了,因?yàn)榇颂幏祷氐氖窍鄬?duì)的路徑。而getRequestURL返回一個(gè)StringBuffer,“The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.”,完整的請(qǐng)求資源路徑,不包括querystring。

總結(jié)一下:URL是一種具體的URI,它不僅唯一標(biāo)識(shí)資源,而且還提供了定位該資源的信息。URI是一種語義上的抽象概念,可以是絕對(duì)的,也可以是 相對(duì)的,而URL則必須提供足夠的信息來定位,所以,是絕對(duì)的,而通常說的relative URL,則是針對(duì)另一個(gè)absolute URL,本質(zhì)上還是絕對(duì)的。

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

URI抽象結(jié)構(gòu)[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類不提供對(duì)標(biāo)準(zhǔn)RFC2396規(guī)定的特殊字符的轉(zhuǎn)義,因此需要調(diào)用者自己對(duì)URL各組成部分進(jìn)行encode。而 java.net.URI則會(huì)提供轉(zhuǎn)義功能。因此The recommended way??to manage the encoding and decoding of URLs is to use??java.net.URI. 可以使用URI.toURL()和URL.toURI()方法來對(duì)兩個(gè)類型的對(duì)象互相轉(zhuǎn)換。對(duì)于HTML FORM的url encode/decode可以使用java.net.URLEncoder和java.net.URLDecoder來完成,但是對(duì)URL對(duì)象不適用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容