JDK1.5開始:
1、統一資源定位符(uniform resource location URL)和統一資源標識符(uniform resource identifier URI)。
2、URI是個純粹的句法結構,用於指定標識Web資源的字符串的各個不同部分。URL是URI的一個特例,它包含了定位Web資源的足夠信息。其他URI,比如mailto:cay@horstman.com,則不屬於定位符,因為根據該標識符無法定位任何資源。因此,籠統地說,每個 URL 都是 URI,但不一定每個 URI 都是 URL。這是因為 URI 還包括一個子類,即統一資源名稱 (uniform resource name URN),它命名資源但不指定如何定位資源。
3、URI 和 URL 概念上的不同反映在URI類和 URL 類的不同中。
URI類的實例代表由 RFC 2396(Request For Comments 是由互聯網工程任務組(IETF)發布的一系列備忘錄。文件收集了有關互聯網相關信息,以及UNIX和互聯網社群的軟件文件,以編號排定。目前RFC文件是由互聯網協會(ISOC)贊助發行。) 定義的語法意義上的一個 URI 引用。URI 可以是絕對的,也可以是相對的。對 URI 字符串按照一般語法進行解析,不考慮它所指定的方案(如果有),不對主機(如果有)執行查找,也不構造依賴於方案的流處理程序。相等性、哈希計算以及比較都嚴格地根據實例的字符內容進行定義。換句話說,一個 URI 實例和一個支持語法意義上的、依賴於方案的比較、規范化、解析和相對化計算的結構化字符串差不多。
作為對照,URL 類的實例代表了 URL 的語法組成部分以及訪問它描述的資源所需的信息。URL 必須是絕對的,即它必須始終指定一個方案。URL 字符串按照其方案進行解析。通常會為 URL 建立一個流處理程序,實際上無法為未提供處理程序的方案創建一個URL實例。相等性和哈希計算依賴於方案和主機的 Internet 地址(如果有);沒有定義比較。換句話說,URL 是一個結構化字符串,它支持解析的語法運算以及查找主機和打開到指定資源的連接之類的網絡 I/O 操作。
在Java類庫中,URI類不包含任何訪問資源的方法,它唯一的作用就是解析。
相反的是,URL類可以打開一個到達資源的流。
因此URL類只能作用於那些 Java類庫知道該如何處理的模式,
例如http:,https:,ftp:,本地文件系統(file:),和Jar文件(jar:)。
4、URI—Uniform Resource Identifier 統一資源標識符(比如:人的身份證號)
Web上可用的每種資源如HTML文檔、圖像、視頻片段、程序等都是由一個URI來定位的
URI一般由三部分組成
①訪問資源的命名機制
②存放資源的主機名
③資源自身的名稱,由路徑表示,着重強調於資源。
URL—Uniform Resource Location 統一資源定位符(比如:人的居住地址)
URL是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上,特別是著名的Mosaic。
采用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。
URL一般由三部組成
①協議(或稱為服務方式)
②存有該資源的主機IP地址(有時也包括端口號)
③主機資源的具體地址。如目錄和文件名等
5、Java類庫里有兩個對應的類java.net.URL和java.net.URI,官方的定義分別如下:
(URL)A Uniform Resource Locator thatidentifies the location of an Internet resource as specified by RFC 1738.(統一資源定位符用於標示網絡資源的位置)
(URI,統一資源標識符)A Uniform Resource Identifier that identifies an abstract or physical resource, as specified by RFC 2396.(統一資源標識符用於標示一個抽象或者物理資源)。
也就是說URI是以一種抽象的,高層次概念定義統一資源標識,而URL則是具體的資源標識的方式。URL是一種URI。
在Java的URI中,一個URI實例可以代表絕對的,也可以是相對的,只要它符合URI的語法規則。而URL類則不僅符合語義,還包含了定位該資源的信息,因此它不能是相對的,schema(protocol)必須被指定。
6、舉例:
①大家平常用圖片的時候。到底是imgUrl好呢,還是imgUri好?顯然,如果說imgUrI是肯定沒問題的,因為即使它實際上是url,那它也是uri的一種。那么用imgUri
有沒有問題呢?此時則要看它的可能取值,如果是絕對路徑,能夠定位的,那么用imgUri是沒問題的,而如果是相對路徑,那還是不要用ImgUri的好。總之,用imgUrl是肯定沒問題的,而用imgUri則要視實際情況而定。
②StringHttpServletRequest.getRequestURI();和StringBufferHttpServletRequest.getRequestURL();返回的內容有何不同?為什么會如此?
從HttpServletRequest的javadoc中可以看出,getRequestURI返回一個String,“the part of this request’s URL from theprotocol 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, andserver path, but it does not include query string parameters.”,完整的請求資源路徑,不包括querystring。
③ URL示例
文件的URL:用URL表示文件時,服務器方式用file表示,后面要有主機IP地址、文件的存取路徑(即目錄)和文件名等信息。有時可以省略目錄和文件名,但“/”符號不能省略。
例1:file://ftp.linkwan.com/pub/files/foobar.txt
代表存放主機ftp.linkwan.com上的pub/files/目錄下的一個文件,文件名是foobar.txt。
例2:file://ftp.linkwan.com/pub
代表主機ftp.linkwan.com上的目錄/pub。
例3:file://ftp.linkwan.com/
代表主機ftp.linkwan.com上的根目錄。
例4:http://homepage.yesky.com/175/2603675.shtml
HTTP的URL:使用超級文本傳輸協議HTTP,提供超級文本信息服務的資源。
其計算機域名為homepage.yesky.com。超級文本文件(文件類型為.shtml)是在目錄/175下的2603675.shtml。這是天極網的一台計算機。