3.2 HttpClient
■ 概況:這個API擴展了java.net包,提供了模擬瀏覽器的功能。
■ 官方資源:主頁,二進制,源代碼。
■ 何時適用:當你要構造Web瀏覽器的功能;當你的應用需要一種高效的辦法進行HTTP/HTTPS通信時。
■ 示例應用:HttpClientDemo.java。要求CLASSPATH中有commons-httpclient.jar,common-logging.jar。要求使用JDK 1.4或更高版本。
■ 說明:
HttpClient擴展和增強了標準java.net包,是一個內容廣泛的代碼庫,功能極其豐富,能夠構造出各種使用HTTP協議的分布式應用,或者也可以嵌入到現有應用,為應用增加訪問HTTP協議的能力。在Commons穩定版中,HttpClient的文檔似乎要比其他包更完善一些,而且還帶有幾個實例。下面我們通過一個簡單的例子來了解如何提取一個Web頁面,HttpClient文檔中也有一個類似的例子,我們將擴充那個例子使其支持SSL。注意本例需要JDK 1.4支持,因為它要用到Java Secure Socket Connection庫,而這個庫只有JDK 1.4及更高的版本才提供。
?、?首先確定一個可以通過HTTPS下載的頁面,本例使用的是https://www.paypal.com/。同時確保%JAVA_HOME%/jre/lib/security/java.security文件包含了下面這行代碼:security.provider.2=com.sun.net.ssl.internal.ssl.Provider。
除了這些設置之外,HTTPS連接的處理方式沒有其他特別的地方--至少對于本例來說如此。不過,如果遠程網站使用的根證書不被你使用的Java認可,則首先必須導入它的證書。
?、?創建一個HttpClient的實例。HttpClient類可以看成是應用的主驅動程序,所有針對網絡的功能都依賴于它。HttpClient類需要一個Connection Manager來管理連接。HttpConnectionManager允許我們創建自己的連接管理器,或者,我們也可以直接使用內建的SimpleHttpConnectionManager或MultiThreadedHttpConnectionManager類。如果在創建HttpClient時沒有指定連接管理器,HttpClient默認使用SimpleHttpConnectionManager。
//
?創建一個HttpClient的實例
HttpClient?client?
=
?
new
?HttpClient();
③ 創建一個HttpMethod的實例,即確定與遠程服務器的通信要采用哪種傳輸方式,HTTP允許采用的傳輸方式包括:GET,POST,PUT,DELETE,HEAD,OPTIONS,以及TRACE。這些傳輸方式分別作為一個獨立的類實現,但所有這些類都實現HttpMethod接口。在本例中,我們使用的是GetMethod,創建GetMethod實例時在參數中指定我們想要GET的URL。
//?創建一個HttpMethod的實例
HttpMethod?method?=?new?GetMethod(url);
?

④ 執行HttpMethod定義的提取操作。執行完畢后,executeMethod方法將返回遠程服務器報告的狀態代碼。注意executeMethod屬于HttpClient,而不是HttpMethod。
//?執行HttpMethod定義的提取操作
statusCode?=?client.executeMethod(method);⑤ 讀取服務器返回的應答。如果前面的連接操作失敗,程序將遇到HttpException或IOException,其中IOException一般意味著網絡出錯,繼續嘗試也不太可能獲得成功。服務器返回的應答可以按照多種方式讀取,例如作為一個字節數組,作為一個輸入流,或者作為一個String。獲得服務器返回的應答后,我們就可以按照自己的需要任意處置它了。
byte[]?responseBody?=?method.getResponseBody();

?、?最后要做的就是釋放連接。
method.releaseConnection(); 以上只是非常簡單地介紹了一下HttpClient庫,HttpClient實際的功能要比本文介紹的豐富得多,不僅健壯而且高效,請參閱API文檔了解詳情。
3.3 Net
■ 概況:一個用于操作Internet基礎協議的底層API。
■ 官方資源:主頁,二進制,源代碼。
■ 何時適用:當你想要訪問各種Internet底層協議之時(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP,以及SMTP)。
■ 示例應用:NetDemo.java。要求CLASSPATH中包含commons-net-1.0.0.jar。
■ 說明:
Net包是一個強大、專業的類庫,類庫里的類最初屬于一個叫做NetComponents的商業產品。
Net包不僅支持對各種低層次協議的訪問,而且還提供了一個高層的抽象。大多數情況下,Net包提供的抽象已能滿足一般需要,它使得開發者不再需要直接面對各種協議的Socket級的低層命令。使用高層抽象并不減少任何功能,Net API在這方面做得很出色,既提供了足夠的功能,又不至于在特色方面作過多的妥協。
SocketClient是支持所有協議的基礎類,它是一個抽象類,聚合了各種協議都需要的公用功能。各種不同協議的使用過程其實很相似,首先利用connect方法建立一個指向遠程服務器的連接,執行必要的操作,最后終止與服務器的連接。下面通過實例介紹具體的使用步驟。
//?…
//?①?創建一個客戶端。我們將用NNTPClient
// 從新聞服務器下載新聞組清單。
client?=?new?NNTPClient();
//?…
//?②?利用前面創建的客戶端連接到新聞服務器。
// 這里選用的是一個新聞組較少的服務器。
client.connect("aurelia.deine.net");
//?…
//?③?提取新聞組清單。下面的命令將返回一個
// NewsGroupInfo對象的數組。如果指定的服
// 務器上不包含新聞組,返回的數組將是空的,
// 如果遇到了錯誤,則返回值是null。
list?=?client.listNewsgroups();
//
//?④?最后終止與服務器的連接。
?if?(client.isConnected())
???client.disconnect();必須說明的是,listNewsgroups命令可能需要較長的時間才能返回,一方面是因為網絡速度的影響,另外也可能是由于新聞組清單往往是很龐大的。NewsGroupInfo對象包含有關新聞組的詳細信息,并提供了一些操作新聞組的命令,比如提取文章總數、最后發布的文章、發布文章的權限,等等。
其他客戶端,例如FingerClient、POP3Client、TelnetClient等,用法也差不多。
結束語:有關Web相關類和其他類的介紹就到此結束。在下一篇文章中,我們將探討XML類和包裝類,最后一篇文章則介紹工具類。
希望讀者有興趣試試本文提供的程序實例。很多時候Jakarta Commons給人以混亂的感覺,希望本文使你加深了對Jakarta Commons了解,或者至少引起了你對Commons子項目以及它提供的各種實用API和庫的興趣。
請從這里下載本文代碼:JakartaCommons1_code.zip