Java网络编程之URI、URL研究专题二
最后一个组件是fragment。尽管该组件作为URI的一部分出现,但不是绝对的。当使用URI进行某种检索操作时,后面执行操作的软件使用fragment聚焦于软件感兴趣的资源部分(在该软件成功检索到资源的数据后)。
为了实际表现前面提到的组件信息,可以使用下面的URI:
ftp://george@x.com:90/public/notes?text=shakespeare#hamlet
上面的URI把ftp识别为大纲,把george@x.com:90识别为基于服务器的授权机构(其中george是用户信息,x.com是主机,90是端口),把/public/notes识别为路径,把text=shakespeare识别为查询,把hamlet识别为片断。
本质上它是一个叫做george的用户希望通过/public/notes路径在服务器x.com的90端口上检索shakespeare文本的hamlet信息。在shakespeare成功的返回到该程序后,程序定位hamlet段并把它呈献给该用户。
标准化可以通过目录术语来理解。假定目录x直接位于根目录之下,x有子目录a和b,b有文件memo.txt,a是当前目录。为了显示memo.txt中的内容(在微软Windows下),你可能输入type \x\.\b\memo.txt。
你也可能输入type \x\a\..\b\memo.txt,在这种情况下,a和..的出现是没有必要的。这两种形式都不是最简单的。但是如果输入\x\b\memo.txt,你就指定了最简单的路径了,从根目录开始访问memo.txt。最简单的\x\b\memo.txt路径就是标准化的路径。
通常通过基本的和相对的URI访问资源。基本的URI是绝对的URI,它唯一地标识了某种资源的名字空间,而相对的URI标识了与基础的URI相对的资源。(与基本的URI不同,相对的URI在某种资源的生存周期内可以永远不需要改变)。因为基本的和相对的URI都不能完整的识别某种资源,有必要把两种URI通过解析过程合并。相反地,通过相对化从合并的URI中提取相对的URI也是可行的。
注意
不透明的URI与其它的URI不同,它不服从标准化、分解和相对化。
假定你把x://a/作为基础的URI,并把b/c作为相对的URI。根据基础URI分解这个相对的URI将产生x://a/b/c。根据x://a/相对化x://a/b/c将产生b/c。
URI不能定位或读取/写入资源。这是统一的资源定位器(URL)的任务。URL是一种URI,但是它的大纲组件是已知的网络协议(简称协议),并且它把URI组件与某种协议处理程序(一种资源定位器和根据协议建立的约束规则与资源通讯的读/写机制)。
URI一般不能为资源提供持久不便的名称。这是统一的资源命名(URN)的任务。URN也是一种URI,但是全球唯一的、持久不便的,即使资源不在存在或不再使用。
使用URI
网络API通过提供了URI类(位于java.net程序包中),使我们在源代码层使用URI成为可能。URI的构造函数建立了封装URI的URI对象;URI的方法建立URI对象。
如果授权机构组件是基于服务器的就分析它,提取URI组件,决定URI对象的URI是绝对的还是相对的;决定URI对象的URI是不透明的还是分层的。
比较两个URI对象中的URI;标准化(normalize)URI对象的URI;根据URI对象的基础URI分解某个相对的URI以得到已分解的URI。根据URI对象的基础URI关联某个已分解的URI以得到相对的URI,把URI对象转换为URL对象。
我们进一步查看URI类,在它里面有五个构造函数。最简单的是URI(String uri)。这个构造函数把URI作为String类型的参数,把URI分解为组件,并把这些组件存储在一个新的URI对象中。
如果String对象的URI(通过uri引用)违反了RFC 2396的语法规则,其它的四个构造函数URI(String uri)将会产生一个java.net.URISyntaxException对象。
下面的代码片断演示了使用URI(String uri)建立封装了一个简单的URI组件的URI对象:
URI uri = new URI ("http://www.cnn.com");