直播中
自Java問世以來,各種開發(fā)工具、開發(fā)環(huán)境不斷出現(xiàn)。這些環(huán)境和工具面向不同層次的用戶,具有各自的優(yōu)點(diǎn)。那么,使用Visual J++作為Java開發(fā)平臺又有哪些優(yōu)點(diǎn)呢?粗略地講,這些優(yōu)點(diǎn)包括:
熟悉的開發(fā)環(huán)境。Microsoft的許多開發(fā)工具,在風(fēng)格、使用方法上都非常相似。熟悉Visual Basic和Visual C++開發(fā)環(huán)境的用戶很快可以學(xué)會Visual J++的使用。
與其他開發(fā)環(huán)境的協(xié)作。例如,Visual J++可以與Visual InterDev無縫協(xié)作,所有HTML、ASP和JavaScript代碼的編寫均可以在同樣的環(huán)境內(nèi)完成。
調(diào)試器。使用集成開發(fā)環(huán)境(IDE)最顯著的優(yōu)點(diǎn)之一在于可以使用內(nèi)置的調(diào)試器。與所有其他Microsoft開發(fā)環(huán)境一樣,Visual J++的調(diào)試器功能也非常強(qiáng)大。
當(dāng)然,Visual J++的IDE也具有其他許多優(yōu)點(diǎn),比如關(guān)鍵詞彩色顯示、代碼自動格式化、應(yīng)用結(jié)構(gòu)全局視圖等等。
特別地,對于那些在Java門外躍躍欲試,卻又不知從何開始的開發(fā)者,我們認(rèn)為Visual J++是一個非常好的起點(diǎn)。然而我們知道,Sun和Microsoft曾經(jīng)因?yàn)楹笳邔ava的“擴(kuò)展”而發(fā)生爭議。不管我們是否把Java類封裝成COM對象,Java程序都是擴(kuò)展ASP應(yīng)用的一種好方法。但考慮到Microsoft私有的擴(kuò)展不可能得到所有Java平臺或環(huán)境的支持,因此,在Visual J++編程中應(yīng)當(dāng)慎重考慮是否使用Microsoft的Java擴(kuò)展。
接下來我們將用Visual J++創(chuàng)建一個可用于ASP環(huán)境的組件。這個組件只包含一個方法,它的參數(shù)是字符串URL,功能是提取并返回由URL指定的HTML文檔的內(nèi)容。
本文將逐步介紹整個組件開發(fā)過程。包括如何在Visual J++中創(chuàng)建工程,輸入必要的Java代碼并解釋這些Java代碼的作用,以及如何在ASP腳本內(nèi)應(yīng)用這個組件。
注意:本文將使用Visual J++ 6.0,但也可以使用更早版本的Visual J++,必要的時候我們會指出不同版本之間的差異。
二、創(chuàng)建Visual J++工程
啟動Visual J++,出現(xiàn)如下對話框:
【圖1】
在這個對話框中選擇新建工程,輸入這個工程的名字FetchURL以及合適的工作目錄,然后選擇COM DLL圖標(biāo),最后單擊“打開”按鈕。
Visual J++將自動為新建工程創(chuàng)建一個Java文件,名為Class1.java。在Project Explorer窗格,雙擊工程名字,按右鍵,然后將Class1.java改名為FetchURL.java。雙擊FetchURL.java文件名即可看到文件內(nèi)容。FetchURL.java中由Visual J++自動加入的代碼是創(chuàng)建ASP組件必需的骨架代碼,內(nèi)容如下:
/**
* This class is designed to be packaged with a COM DLL output format.
* The class has no standard entry points, other than the constructor.
* Public methods will be exposed as methods on the default COM interface.
* @com.register ( clsid=600455A0-B534-11D3-A434-0080AD38C188,
* typelib=600455A1-B534-11D3-A434-0080AD38C188 )
*/
public class Class1
{
// TODO: Add additional methods and code here
/**
* NOTE: To add auto-registration code, refer to the documentation
* on the following method
* public static void onCOMRegister(boolean unRegister) {}
*/
}
首先要做的是更改類的名字,即把內(nèi)容為“public class Class1”的行改為“public class FetchURL”。Java要求每一個類的名字與其對應(yīng)的Java文件名完全相同(大小寫敏感)。
請注意上述代碼中的COM指令,它由“@com.register”開始(在注釋內(nèi))。該指令告訴Visual J++編譯器把當(dāng)前Java類包裝成相應(yīng)的COM DLL文件。將編譯后的代碼以DLL形式包裝使得我們可以在ASP腳本中直接使用它。
接下來,我們要修改自動生成的初始代碼,使其具備前面提出的功能。完整的代碼工程見本文后面的鏈接,此處我們依次介紹所輸入代碼的含義。
import java.io.*;
import java.net.*;
這兩行代碼導(dǎo)入了本組件要用到的Java包。Java API由一系列的包組成,這些包提供的是直接可以使用的代碼,類似于C++中的庫。在Java程序中使用import關(guān)鍵字有點(diǎn)類似于在C++程序中使用#include命令。
要查看所導(dǎo)入的包定義了哪些類,可以在Class Outline窗格內(nèi)擴(kuò)展相應(yīng)的目錄。FetchURL將利用java.io包中定義的類從打開的網(wǎng)絡(luò)連接讀入數(shù)據(jù),利用java.net包提供的類建立與遠(yuǎn)程服務(wù)器的連接并請求文檔。
public String Fetch(String strURL)
FetchURL包含唯一的方法Fetch,它的參數(shù)是一個字符串,該字符串指向要求提取的HTML文檔的URL。
String strInputLine = new String();
String strResponse = new String();
try
{
URL objURL = new URL(strURL);
try
{
URLConnection objConnection = objURL.openConnection();
變量strInputLine將作為程序從遠(yuǎn)程服務(wù)器讀取數(shù)據(jù)的緩沖區(qū),變量strResponse將保存目標(biāo)頁面的整個文檔,F(xiàn)etch方法最后返回的就是這個strResponse變量。在這幾行代碼中,程序創(chuàng)建了一個URL對象并嘗試用該對象建立連接。這兩行代碼都封裝在try...catch塊內(nèi)以處理任何可能出現(xiàn)的異常。Java利用“異?!眮硖幚砣魏纬绦蛴龅降睦馇闆r(通常是錯誤)。例如,如果傳遞給Fetch方法的URL參數(shù)格式錯誤,或程序運(yùn)行時未能與指定服務(wù)器建立連接,都會引發(fā)異常,此時程序?qū)旬惓P畔⒎祷亟o調(diào)用Fetch方法的應(yīng)用。異常處理代碼見相應(yīng)的catch關(guān)鍵字。
BufferedReader objInReader = new BufferedReader(
new InputStreamReader(
objConnection.getInputStream()));
這一行代碼有點(diǎn)復(fù)雜,所以在完全搞懂它的意思之前先不要著急。在這行代碼中,程序利用了象Java這樣完全面向?qū)ο缶幊陶Z言所提供的優(yōu)勢。首先,它用objConnection對象創(chuàng)建了一個InputStream類的對象,這實(shí)際上是一個可以從服務(wù)器讀取數(shù)據(jù)的流;然后,又把這個InputStream類的對象傳遞給InputStreamReader,后者將負(fù)責(zé)從InputStream對象讀取數(shù)據(jù);最后,又用這個InputStreamReader類的對象創(chuàng)建BufferedReader類的對象,也就是objInReader。程序?qū)⒗眠@個objInReader對象完成實(shí)際的數(shù)據(jù)讀取操作,并將結(jié)果保存為一個字符串。
while ((strInputLine = objInReader.readLine()) != null)
strResponse += strInputLine + "
";
objInReader.close();
在這部分代碼中,程序使用了一個while循環(huán)讀入所有數(shù)據(jù),直至輸入為空(null)。objInReader是一個BufferedReader類的對象,它將緩沖讀入的字符,整塊地返回給strInputLine變量。然后,又把這個strInputLine和一個“ ”加到strResponse的末尾?!?”是Java的一個轉(zhuǎn)義字符,表示一個新的文本行。在讀入目標(biāo)文檔的所有內(nèi)容后,程序調(diào)用objInReader對象的close()方法顯式地關(guān)閉輸入流。
在所有代碼輸入完畢之后就可以編譯這個FetchURL工程了。Visual J++不僅將從Java源文件生成通常的類文件,還將生成一個DLL文件。這個DLL文件封裝了Java類文件,它使得我們可以從任何COM環(huán)境(包括ASP)訪問Java類文件所提供的功能。
如果使用Visual J++ 6,將.java文件編譯成.class文件和相應(yīng)的.dll文件很簡單,只需從Build菜單選擇Build命令就可以了。如果測試FetchURL.dll的機(jī)器和編譯是同一臺計算機(jī),則不需要任何附加的工作了;如果不在同一臺機(jī)器上,則還需要在測試機(jī)器上用regsvr32 FetchURL.dll命令注冊它,就像其他COM對象的注冊一樣。
對于使用Visual J++早期版本的用戶,編譯.java文件的方法也類似,但還需要額外的注冊步驟,即使用JavaReg /register 命令注冊該類。
三、編寫ASP腳本
測試FetchURL的ASP代碼非常簡單:
< %
Set objFetchURL = Server.CreateObject("FetchURL.FetchURL")
strResponse = objFetchURL.Fetch("http://www.chinabyte.com/")
Response.Write(strResponse)
Set objFetchURL = Nothing
% >
這段代碼首先創(chuàng)建FetchURL的實(shí)例,創(chuàng)建方法和其他COM對象的創(chuàng)建方法一樣。然后,程序調(diào)用Fetch方法,將結(jié)果字符串返回給客戶瀏覽器。保存上述腳本為Test.asp,然而用類如“http://localhost/scripts/Test.asp”的URL打開它,就可以看到結(jié)果了
以上我們介紹了在Visual J++中開發(fā)ASP COM組件的具體過程。對于ASP應(yīng)用來說,Java以網(wǎng)絡(luò)為中心所提供的許多功能是Visual Basic所缺乏的,如果代碼有可能要在不同的平臺下重用,更值得認(rèn)真考慮Java;此外,我們還看到,即使是使用Visual J++,我們?nèi)耘f沒有使用Microsoft的私有Java擴(kuò)展,在Visual J++中完全可以寫出能夠用其他Java編譯器編譯的Java代碼。