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

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

本文简介:

String url = "http://www.altavista.com/cgi-bin/query?" + qs;
System.out.println(url);



URLDecoder
与URLEncoder 类相对应的URLDecoder 类有两种静态方法。它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符:

public static String decode(String s) throws Exception
public static String decode(String s, String encoding)  // Java 1.4
  throws UnsupportedEncodingException



第一种解码方法在java1.3和java1.2中使用。第二种解码方法在java1.4和更新的版本中使用。如果你拿不定主意用哪种编码方式,那就选择UTF-8吧。它比其他任何的编码形式更有可能得到正确的结果。

如果string包含了一个“%”,但紧跟其后的不是两位16进制的数或者被解码成非法序列,该方法就会抛出IllegalArgumentException 异常。当下次再出现这种情况时,它可能就不会被抛出了。这是与运行环境相关的,当检查到有非法序列抛不抛出IllegalArgumentException 异常,这时到底会发生什么是不确定的。在Sun's JDK 1.4中,不会抛出什么异常,它会把一些莫名其妙的字节加进不能被顺利编码的string中。这的确令人头疼,可能就是一个安全漏洞。

由于这个方法没有触及到非转义字符,所以你可以把整个URL作为参数传给该方法,不用像之前那样分块进行。例如:

String input = "http://www.altavista.com/cgi-bin/" + 
"query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3";
try {
  String output = URLDecoder.decode(input, "UTF-8");
  System.out.println(output);
}



The URI Class

URI是URL的一个抽象,它不仅包括了统一资源定位符(URL),还包括了统一资源名(URN).大多数实际应用中使用的URI都是URL,但是许多规范和标准像XML都是用URI来定义的.在java1.4和更新的版本中, URI被java.net.URI 类所表示.这个类与java.net.URL 相比有如下3点重要的区别:
·        URI 类只关心资源的标识和对URI的解析.它没有方法来检索它的URI所标识的资源。
·        URI 类与URL 类相比,它更能适应相关的规范。
·        一个URI 对象能表示一个相对URI 。URL 类在存放之前,就已经对所有的URI进行了“绝对化”的处理。

简而言之,一个URL 对象就是网络应用层协议进行网络检索的一个代理,而一个URI 对象就只纯粹地做string的解析和操作的工作。URI 类没有进行网络检索的能力。URL 类有一些进行string解析的方法。比如getFile( ) 和 getRef( ) 方法,但很多都是蹩脚的方法,总是不完全像有关的规范上所说的那样好用。假如你现在用的是java1.4版本或更新的版本,这时你就可以做出选择,如果你想下载一个URL指示的内容时,你应该使用 URL类;如果你想使用URI类来进行标识的工作而不是用来检索的时候, 你应该用URI类。例如,去标识一个XML namespace 的URI。在一些情况下,当你同时需要实现这两种功能时,你可以用方法toURL( ) 把一个URI 转换成一个 URL 。在java1.5中,你还能用类URL 中的方法toURI( )  把一个URL 转换成一个URI 。

构造一个 URI
URI是由string构成的。不像类URL ,类URI

不依靠底层协议的处理程序。只要URI是语义上正确的,java就不需要知道它的什么协议,然后才创建其代表的URI对象。因此,不象类URL ,类URI 可以被用到新的试验性的URI协议中去。

public URI(String uri) throws URISyntaxException

这是一个简单的构造函数,它用一个合适的string创建了一个新的URI 对象。例如:

URI voice = new URI("tel:+1-800-9988-9938");
URI web   = new URI("http://www.xml.com/pub/a/2003/09/17/stax.html#id=_hbc");
URI book  = new URI("urn:isbn:1-565-92870-9");



如果参数string不符合URI的语法规则—比如,如果它以“:”开始—构造函数就会抛出URISyntaxException 异常。这是一个需要被检察的异常,所以你要么捕获该异常,要么在构造函数会被执行的方法中,声明这个方法会抛出该异常。尽管如此,但是有一条语法规则是不能被检察到的。与URI规范相矛盾的是,在URI中使用的字符不会被限制在ASCII字符集上。它们可以包含其它的Unicode字符,比如ø 和 é。从语义上讲,对URI几乎就没有什么限制,特别是一旦不需要对非ASCII字符进行编码时,一切URI都是被允许的。几乎任何的string都可以被看成是URI。

public URI(String scheme, String schemeSpecificPart, String fragment) throws URISyntaxException

这个构造函数主要是用在不存在有层次关系的URI中。Scheme是指URI的协议,比如http, urn, tel等。它必须专门有ASCII字母,数字和标点符(+, -, 和.)组成。第一个位置上必须是一个字母。如果省略了参数scheme,就用null代替。这时创建的是一个相对URI。例如:

URI absolute = new URI("http", "//www.ibiblio.org" , null);
URI relative = new URI(null, "/javafaq/index.shtml", "today");



scheme-specific部分的内容遵从于参数scheme给出的URI协议;对一个http 协议的URL来说,是一种形式,对于mail协议的 URL来说又是另一种形式,对于tel协议的 URI又是其它的什么形式。因为类URI 会以%xx对非法字符进行编码,所以显而易见,你不会在这步犯语法方面的错误。最后,只要有需要的话,第三个参数可以是指一个部分标识符。同样地,在这个部分标识符中,字符的合法性也顺理成章地不需要检察。如果省略了参数fragment,就用null代替。

public URI(String scheme, String host, String path, String fragment) throws URISyntaxException

这个构造函数被用在有层次关系的URI中,比如http 和 ftp 协议的URL。主机名和路径名(用“/”分开)一起构成URI的scheme-specific部分。例如:

URI today= new URI("http", "www.ibiblio.org", "/javafaq/index.html", "today");
produces the URI http://www.ibiblio.org/javafaq/index.html#today



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

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

go top