當(dāng)你需要存儲或者獲取一個資源地址時用URI好還是URL好侨糟?首先要明確一下三個名稱的意義
URI、URL和URN
URI?:Uniform Resource Identifier,統(tǒng)一資源標(biāo)識符烦粒;
URL:Uniform Resource Locator,統(tǒng)一資源定位符荠列;
URN:Uniform Resource Name,統(tǒng)一資源名稱载城。
URIs, URLs, and URNs
首先,URI费就,是uniform resource identifier诉瓦,統(tǒng)一資源標(biāo)識符,用來唯一的標(biāo)識一個資源力细。而URL是uniform resource locator睬澡,統(tǒng)一資源定位器,它是一種具體的URI眠蚂,即URL可以用來標(biāo)識一個資源煞聪,而且還指明了如何locate這個資源。而URN逝慧,uniform resource name昔脯,統(tǒng)一資源命名,是通過名字來標(biāo)識資源笛臣,比如mailto:java-net@java.sun.com云稚。也就是說,URI是以一種抽象的沈堡,高層次概念定義統(tǒng)一資源標(biāo)識静陈,而URL和URN則是具體的資源標(biāo)識的方式。URL和URN都是一種URI。
在Java的URI中鲸拥,一個URI實例可以代表絕對的拐格,也可以是相對的,只要它符合URI的語法規(guī)則刑赶。而URL類則不僅符合語義捏浊,還包含了定位該資源的信息,因此它不能是相對的角撞,schema必須被指定呛伴。
ok,現(xiàn)在回答文章開頭提出的問題谒所,到底是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”。現(xiàn)在可以明白為什么是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。
總結(jié)一下:URL是一種具體的URI,它不僅唯一標(biāo)識資源烁焙,而且還提供了定位該資源的信息航邢。URI是一種語義上的抽象概念,可以是絕對的骄蝇,也可以是相對的膳殷,而URL則必須提供足夠的信息來定位,所以九火,是絕對的赚窃,而通常說的relative URL,則是針對另一個absolute URL岔激,本質(zhì)上還是絕對的勒极。
注:這里的絕對(absolute)是指包含scheme,而相對(relative)則不包含scheme鹦倚。
URI抽象結(jié)構(gòu)[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
authority為[user-info@]host[:port]
http://域名河质,其中http是scheme,//域名是scheme-specific-part震叙,并且它的scheme與scheme-specific-part被冒號分開了掀鹅。