URI構(gòu)造函數(shù)和create(String
uri)方法試圖分解出某個URI的授權(quán)機構(gòu)組件的用戶信息、主機和端口部分。對于按正常形式形成的基于服務(wù)器的授權(quán)機構(gòu)組件,它們是會成功的。對于按拙劣的形式形成的基于服務(wù)器的授權(quán)機構(gòu)組件,他們將會失敗--并且把該授權(quán)機構(gòu)組件當(dāng)作是基于注冊的。有時你可能知道某個URI的授權(quán)機構(gòu)組件必須是基于服務(wù)器的。你可以確保該URI的授權(quán)機構(gòu)組件分解出用戶信息、主機和端口,或者你可以確保將產(chǎn)生一個異常(伴隨著相應(yīng)的診斷信息)。你可以通過調(diào)用URI的parseServerAuthority()方法實現(xiàn)這種操作。如果成功分解出URI,該方法將返回包含提取的用戶信息、主機和端口部分的URI的新URI對象的一個引用(但是如果授權(quán)機構(gòu)組件已經(jīng)被分解過了,將會返回調(diào)用parseServerAuthority()的URI對象的引用。),否則該方法將產(chǎn)生一個URISyntaxException對象。
下面的代碼片斷演示了parseServerAuthority():
// 下面的parseServerAuthority()調(diào)用出現(xiàn)后會發(fā)生什么情況?
URI uri = new URI
("http://foo:bar").parseServerAuthority();
一旦擁有了URI對象,你就可以通過調(diào)用getAuthority()、getFragment()、getHost()、getPath()、getPort()、getQuery()、getScheme()、getSchemeSpecificPart()和
getUserInfo()方法提取多種組件。你也可以通過調(diào)用isAbsolute()確定該URI是絕對的還是相對的,通過調(diào)用isOpaque()確定該URI是不透明的還是分層的。如果返回值是true意味著該URI是絕對的或不透明的,如果返回值是false意味著該URI是相對的或分層的。
列表1中的程序用命令行參數(shù)建立了一個URI對象,調(diào)用URI組件提取方法來檢索URI的組件,并調(diào)用URI的isAbsolute()和isOpaque()方法把該URI分類為絕對的/相對性和不透明的/分層的。
列表1: URIDemo1.java
// URIDemo1.java
import java.net.*;
class URIDemo1
{
public static void main (String [] args) throws
Exception
{
if (args.length != 1)
{
System.err.println ("usage: java
URIDemo1 uri");
return;
}
URI uri = new URI (args [0]);
System.out.println ("Authority = " +uri.getAuthority
());
System.out.println ("Fragment = " +uri.getFragment
());
System.out.println ("Host = " +uri.getHost ());
System.out.println
("Path = " +uri.getPath ());
System.out.println ("Port = " +uri.getPort
());
System.out.println ("Query = " +uri.getQuery ());
System.out.println
("Scheme = " +uri.getScheme ());
System.out.println ("Scheme-specific part =
" +
uri.getSchemeSpecificPart ());
System.out.println ("User Info = "
+uri.getUserInfo ());
System.out.println ("URI is absolute: " +uri.isAbsolute
());
System.out.println ("URI is opaque: " +uri.isOpaque ());
}
}
輸入java URIDemo1命令后,列表1的輸出結(jié)果如下:
上面的輸出顯示該URI是絕對的,因為它指定了一個大綱(query),并且該URI是分層的,因為query后面有/符號。
技巧
你應(yīng)該調(diào)用URI的compareTo(Object o)和equals(Object
o)來決定URI的次序(為了排序目的)和等同性。你可以參考SDK文檔,查閱這些方法的更多信息。
URI類支持基本的URI操作,包括標(biāo)準(zhǔn)化(normalization)、分解(resolution)和相對化(relativization)。標(biāo)準(zhǔn)化是通過URI的normalize()方法支持的。調(diào)用normalize()時,它返回對新URI對象的引用,該對象包含調(diào)用的URI對象的URI的標(biāo)準(zhǔn)的表現(xiàn)。
列表2演示了normalize()方法。它把URI作為程序的唯一的參數(shù),URIDemo2打印出標(biāo)準(zhǔn)的相等的URI。
列表2: URIDemo2.java
// URIDemo2.java
import java.net.*;
class URIDemo2
{
public static void main (String [] args) throws
Exception
{
if (args.length != 1)
{
System.err.println ("usage: java
URIDemo2 uri");
return;
}
URI uri = new URI (args [0]);
System.out.println ("Normalized URI = " +
uri.normalize ().toString
());
}
}?
在編譯URIDemo2后,在命令行輸入java URIDemo2 x/y/../z/./q,將看到下面的輸出:
Normalized URI = x/z/q
上面的輸出顯示y、..和.消失了。這是因為..意味著你想直接在x下面訪問名字空間的z部分,.意味著你希望訪問與z部分相關(guān)的名字空間的q部分。
URI通過提供resolve(String uri)、resolve(URI uri)和relativize(URI
uri)方法支持反向解析和相對化操作。如果uri引用是空的(null)這三個方法都會產(chǎn)生NullPointerException對象。同樣,如果指定的URI違反了RFC
2396語法規(guī)則,resolve(String uri)通過的內(nèi)部的create(String
uri)調(diào)用間接地產(chǎn)生一個IllegalArgumentException對象。
列表3的代碼演示了resolve(String uri)和relativize(URI uri)。
列表3: URIDemo3.java
// URIDemo3.java
import java.net.*;
class URIDemo3
{
public static void main (String [] args) throws
Exception
{
if (args.length != 2)
{
System.err.println ("usage: "
+
"java URIDemo3 uriBase uriRelative");
return;
}
URI uriBase = new URI (args [0]);
System.out.println ("Base URI = "
+uriBase.toString ());
URI uriRelative = new URI (args [1]);
System.out.println ("Relative URI
= " +uriRelative.toString ());
URI uriResolved = uriBase.resolve (uriRelative);
System.out.println
("Resolved URI = " +uriResolved.toString ());
URI uriRelativized = uriBase.relativize
(uriResolved);
System.out.println ("Relativized URI = "
+uriRelativized.toString ());
}
}
技巧
調(diào)用URI的toURL()方法把URI轉(zhuǎn)換為URL。
在本周日的專題中我將向讀者介紹如何使用URL以及MIME(多用途的網(wǎng)際郵件擴充協(xié)議)的概念以及它如何與URL發(fā)生聯(lián)系,敬請期待。
posted on 2006-04-03 15:11
SIMONE 閱讀(576)
評論(0) 編輯 收藏 所屬分類:
JAVA