uri、url和urn.1--未完待续

本文探讨了URI、URL和URN的概念及其在Java API中的应用。详细解释了这些标识符的作用、区别及如何使用Java进行处理。
uri、url和urn是识别、定位和命名互联网上的资源的标准途径。本文分析了uri、url和urn和java api的uri和url类(以及与url相关的类),并演示了如何在程序中使用这些类。
体系中的uri、url和urn是彼此关联的。uri的范畴位于体系的顶层,url和urn的范畴位于体系的底层。这种排列显示url和urn都是uri的子范畴.

uri表示的是统一的资源标识,它是以某种统一的(标准化的)方式标识资源的简单字符串。典型情况下,这种字符串以scheme(命名uri的名字空间的标识符--一组相关的名称)开头,语法如下:

  [scheme:] scheme-specific-part

  uri以scheme和冒号开头。scheme用大/小写字母开头,后面为空或者跟着更多的大/小写字母数字加减号点号。

冒号把scheme与scheme-specific-part分开了,并且scheme-specific-part的语法和语义(意思)由uri的名字空间决定。

eg.http://www.baidu.com,http是scheme,//http://www.cnn.com是 scheme-specific-part
uri按照绝对相对的分类。绝对的uri指以scheme(后面跟着冒号)开头的uri。再如ftp:hehe@java.comnews:comp.lang.java.help和xyz://whatever。绝对的uri是以某种方式引用某种资源,而这种方式对标识符出现的环境没有依赖。相对的uri不是以scheme(后面跟着冒号)开始的uri。它的一个例子是articles/articles.html。你可以把相对的uri看作是以某种方式引用某种资源,而这种方式依赖于标识符出现的环境  与基本的uri不同,相对的uri在某种资源的生存周期内可以永远不需要改变。因为基本的和相对的uri都不能完整的识别某种资源,有必要把两种uri通过解析过程合并。相反地,通过相对化从合并的uri中提取相对的uri也是可行的。
  uri不能定位或读取/写入资源。这是统一的资源定位器(url)的任务。url是一种uri,但是它的大纲组件是已知的网络协议(简称协议),并且它把uri组件与某种协议处理程序(一种资源定位器和根据协议建立的约束规则与资源通讯的读/写机制)。
  uri一般不能为资源提供持久不便的名称。这是统一的资源命名(urn)的任务。urn也是一种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对象转换为url对象。
uri类有五个构造函数。uri(string uri)把uri作为string类型的参数,把uri分解为组件,并把这些组件存储在一个新的uri对象中。
如果string对象的uri(通过uri引用)违反了rfc 2396的语法规则,其它的四个构造函数uri(string uri)将会产生一个java.net.urisyntaxexception对象。

  eg:建立封装的uri组件的uri对象:uri uri = new uri ("http://www.baidu.com");
  uri构造函数用于建立封装用户指定的uri的uri对象。因为用户可能输入不正确的uri,所以uri构造函数产生已检查的urisyntaxexception对象。这意味着你的代码必须明确地尝试着调用某个uri构造函数并捕捉异常,或者通过在该方法的throws子句中列举urisyntaxexception以"推卸责任"。

  如果uri是有效的(例如在源代码中的uri),将不会产生urisyntaxexception对象。因为在这种情况下处理某个uri构造函数的异常处理要求可能有困难,所以uri提供了静态的create(string uri)方法。这个方法分解通过uri引用的string对象中包含uri,如果该uri没有违反任何语法规则就建立uri对象(并从方法中返回对它的引用),否则将捕捉到一个内部的urisyntaxexception对象,把该对象包装在一个未检查的illegalargumentexception对象中,并抛出这个illegalargumentexception对象。因为illegalargumentexception是未检查的,你不需要明确的尝试代码并捕捉异常或把它的类名称列举在throws子句中。
  uri uri = uri.create ("http://www.baidu.com");

  uri构造函数和create(string uri)方法试图分解出某个uri的授权机构组件的用户信息、主机和端口部分。对于按正常形式形成的基于服务器的授权机构组件,它们是会成功的。对于按拙劣的形式形成的基于服务器的授权机构组件,他们将会失败--并且把该授权机构组件当作是基于注册的。有时你可能知道某个uri的授权机构组件必须是基于服务器的。你可以确保该uri的授权机构组件分解出用户信息、主机和端口,或者你可以确保将产生一个异常(伴随着相应的诊断信息)。你可以通过调用uri的parseserverauthority()方法实现这种操作。如果成功分解出uri,该方法将返回包含提取的用户信息、主机和端口部分的uri的新uri对象的一个引用(但是如果授权机构组件已经被分解过了,将会返回调用parseserverauthority()的uri对象的引用。),否则该方法将产生一个urisyntaxexception对象。
 uri uri = new uri ("//foo:bar").parseserverauthority();
一旦拥有了uri对象,你就可以通过调用getauthority()、getfragment()、gethost()、getpath()、getport()、getquery()、getscheme()、getschemespecificpart()和 getuserinfo()方法提取多种组件。你也可以通过调用isabsolute()确定该uri是绝对的还是相对的,通过调用isopaque()确定该uri是不透明的还是分层的


 


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值