URLs,URIs,Proxies和Passwords 解析[5]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

如果构造函数从得到的几个参数中不能获得一个有合法层次关系的URI—例如,假如给定了参数scheme,它要求这个URI是一个绝对的URI可是path参数却又不是一“/”开始的—它就会抛出异常URISyntaxException

Public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException

这个构造函数和前边所讲的那个基本相同,除了它增加了一个进行查询的string 参数。例如:

URI today= new URI("http", "www.ibiblio.org", "/javafaq/index.html", 
                   "referrer=cnet&date=2004-08-23",  "today");



与通常一样,遇到任何的语法错误它都会抛出异常URISyntaxException ,如果其中的哪个参数被省略,就用null代替。

public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException

这是构造一个有层次关系的URI的父亲构造函数,也就是说,前面提到的两个构造函数都会调用它。它把认证信息(authority)分成了user info, host, 和 port几部分。它们中的每一个都具备其自身的语法规则。比如:

URI styles = new URI("ftp", "anonymous:elharo@metalab.unc.edu", 
  "ftp.oreilly.com",  21, "/pub/stylesheet", null, null);



尽管这样,但是最后得到的URI仍然得遵从URI的一般规则。同样地,如果任何一个参数被省略,就用null代替。
public static URI create(String uri)

它不是个构造函数,而是个静态factory方法。不象构造函数那样,它不会抛出异常URISyntaxException 。如果你确信你的URI一定会是合法的,会遵从任一条规则,那么你就可以用该方法。比如,这次调用创建了一个用来匿名登陆一个FTP的URI ,它用一个邮箱地址当密码:

URI styles = URI.create(
  "ftp://anonymous:elharo%40metalab.unc.edu@ftp.oreilly.com:
                                         21/pub/stylesheet");



如果该URI确实存在问题,这个方法会抛出异常IllegalArgumentException 。它是在运行时才抛出的异常,所以你不能声明或捕获它。

The Parts of the URI
一个URI最多就三部分:scheme, scheme-specific , fragment identifier。一般形式:

scheme:scheme-specific-part:fragment



如果省略了scheme,这个URI就是相对的。如果fragment identifier被省略了,这个URI就很简单了。类URI有返回方法,它们能返回每个URI对象的这三部分。方法getRawFoo( ) 返回编码后的URI,与此类似的还有方法getFoo() ,它先解码%xx形式的字符,然后返回解码后的URI。

public String getScheme( )
public String getSchemeSpecificPart( )
public String getRawSchemeSpecificPart( )
public String getFragment( )
public String getRawFragment( )



注意: 这里没有方法getRawScheme( )  ,因为在URI规范中所有的协议名应专门由合法的ASCII字符组成。不允许%xx在协议名中出现。
如果URI 对象不具备相关的内容,这些方法都返回null:例如,对一个没指定协议的相对URI,或一个没有fragment identifier的http 协议的URI。一个指定了协议(scheme)的URI是一个绝对的URI。没有指定协议的URI是相对的URI。方法isAbsolute()  返回true如果这个URI是绝对的,如果是相对的就返回false:

public boolean isAbsolute( )



scheme-specific在细节上的变化取决于scheme的类型。比如在一个tel URL中,scheme-specific需要用类似电话号码的语法。尽管如此,但是在许多有用的URI中,包括很常见的file 和 http URL里面,scheme-specific都有其独特的描述层次关系的模式,包括authority, path, query string。Authority又被细分为user info, host,  port。方法isOpaque()  返回false如果这是个有层次关系的URI,否则返回true—也就是说,如果是层次模糊的:

public boolean isOpaque( )



如果URI是层次模糊的,所有你能得到的就只是scheme, scheme-specific ,  fragment identifier。尽管如此,但是如果URI是有层次关系的,下面的getter方法还是能获取该URI的所有内容:

public String getAuthority( )
public String getFragment( )
public String getHost( )
public String getPath( )
public String getPort( )
public String getQuery( )
public String getUserInfo( )



所有这些方法返回的都是解码后的内容;换句话说,这种形式%xx,例如%3c,都会被转换成它本身所表示的字符,比如符号“<”。如果你想得到未经解码的URI,这里有5个相并列的方法:

public String getRawAuthority( )
public String getRawFragment( )
public String getRawPath( )
public String getRawQuery( )
public String getRawUserInfo( )



本文关键:URLs,URIs,Proxies和Passwords 解析
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top