top
Loading...
在VisualJ++中編寫ASPCOM組件
Java是一種以網絡為中心的編程語言,許多只使用ASP腳本難以完成的任務可以用Java輕松地實現。同時,擴展ASP應用最好的方法莫過于加入COM組件。那么,可以利用Java為ASP開發組件嗎?本文通過實例,說明了在Visual J++環境下開發COM組件的具體過程。
一、概述

自Java問世以來,各種開發工具、開發環境不斷出現。這些環境和工具面向不同層次的用戶,具有各自的優點。那么,使用Visual J++作為Java開發平臺又有哪些優點呢?粗略地講,這些優點包括:

熟悉的開發環境。Microsoft的許多開發工具,在風格、使用方法上都非常相似。熟悉Visual Basic和Visual C++開發環境的用戶很快可以學會Visual J++的使用。
與其他開發環境的協作。例如,Visual J++可以與Visual InterDev無縫協作,所有HTML、ASP和JavaScript代碼的編寫均可以在同樣的環境內完成。
調試器。使用集成開發環境(IDE)最顯著的優點之一在于可以使用內置的調試器。與所有其他Microsoft開發環境一樣,Visual J++的調試器功能也非常強大。
當然,Visual J++的IDE也具有其他許多優點,比如關鍵詞彩色顯示、代碼自動格式化、應用結構全局視圖等等。
特別地,對于那些在Java門外躍躍欲試,卻又不知從何開始的開發者,我們認為Visual J++是一個非常好的起點。然而我們知道,Sun和Microsoft曾經因為后者對Java的“擴展”而發生爭議。不管我們是否把Java類封裝成COM對象,Java程序都是擴展ASP應用的一種好方法。但考慮到Microsoft私有的擴展不可能得到所有Java平臺或環境的支持,因此,在Visual J++編程中應當慎重考慮是否使用Microsoft的Java擴展。

接下來我們將用Visual J++創建一個可用于ASP環境的組件。這個組件只包含一個方法,它的參數是字符串URL,功能是提取并返回由URL指定的HTML文檔的內容。

本文將逐步介紹整個組件開發過程。包括如何在Visual J++中創建工程,輸入必要的Java代碼并解釋這些Java代碼的作用,以及如何在ASP腳本內應用這個組件。

注意:本文將使用Visual J++ 6.0,但也可以使用更早版本的Visual J++,必要的時候我們會指出不同版本之間的差異。

二、創建Visual J++工程

啟動Visual J++,出現如下對話框:

【圖1】

在這個對話框中選擇新建工程,輸入這個工程的名字FetchURL以及合適的工作目錄,然后選擇COM DLL圖標,最后單擊“打開”按鈕。

Visual J++將自動為新建工程創建一個Java文件,名為Class1.java。在Project Explorer窗格,雙擊工程名字,按右鍵,然后將Class1.java改名為FetchURL.java。雙擊FetchURL.java文件名即可看到文件內容。FetchURL.java中由Visual J++自動加入的代碼是創建ASP組件必需的骨架代碼,內容如下:

/**
* 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) {}
*/
}
首先要做的是更改類的名字,即把內容為“public class Class1”的行改為“public class FetchURL”。Java要求每一個類的名字與其對應的Java文件名完全相同(大小寫敏感)。

請注意上述代碼中的COM指令,它由“@com.register”開始(在注釋內)。該指令告訴Visual J++編譯器把當前Java類包裝成相應的COM DLL文件。將編譯后的代碼以DLL形式包裝使得我們可以在ASP腳本中直接使用它。

接下來,我們要修改自動生成的初始代碼,使其具備前面提出的功能。完整的代碼工程見本文后面的鏈接,此處我們依次介紹所輸入代碼的含義。

import java.io.*;
import java.net.*;
這兩行代碼導入了本組件要用到的Java包。Java API由一系列的包組成,這些包提供的是直接可以使用的代碼,類似于C++中的庫。在Java程序中使用import關鍵字有點類似于在C++程序中使用#include命令。

要查看所導入的包定義了哪些類,可以在Class Outline窗格內擴展相應的目錄。FetchURL將利用java.io包中定義的類從打開的網絡連接讀入數據,利用java.net包提供的類建立與遠程服務器的連接并請求文檔。

public String Fetch(String strURL)
FetchURL包含唯一的方法Fetch,它的參數是一個字符串,該字符串指向要求提取的HTML文檔的URL。

String strInputLine = new String();
String strResponse = new String();
try
{
URL objURL = new URL(strURL);
try
{
URLConnection objConnection = objURL.openConnection();
變量strInputLine將作為程序從遠程服務器讀取數據的緩沖區,變量strResponse將保存目標頁面的整個文檔,Fetch方法最后返回的就是這個strResponse變量。在這幾行代碼中,程序創建了一個URL對象并嘗試用該對象建立連接。這兩行代碼都封裝在try...catch塊內以處理任何可能出現的異常。Java利用“異常”來處理任何程序遇到的例外情況(通常是錯誤)。例如,如果傳遞給Fetch方法的URL參數格式錯誤,或程序運行時未能與指定服務器建立連接,都會引發異常,此時程序將把異常信息返回給調用Fetch方法的應用。異常處理代碼見相應的catch關鍵字。

BufferedReader objInReader = new BufferedReader(
new InputStreamReader(
objConnection.getInputStream()));
這一行代碼有點復雜,所以在完全搞懂它的意思之前先不要著急。在這行代碼中,程序利用了象Java這樣完全面向對象編程語言所提供的優勢。首先,它用objConnection對象創建了一個InputStream類的對象,這實際上是一個可以從服務器讀取數據的流;然后,又把這個InputStream類的對象傳遞給InputStreamReader,后者將負責從InputStream對象讀取數據;最后,又用這個InputStreamReader類的對象創建BufferedReader類的對象,也就是objInReader。程序將利用這個objInReader對象完成實際的數據讀取操作,并將結果保存為一個字符串。

while ((strInputLine = objInReader.readLine()) != null)
strResponse += strInputLine + "
";
objInReader.close();
在這部分代碼中,程序使用了一個while循環讀入所有數據,直至輸入為空(null)。objInReader是一個BufferedReader類的對象,它將緩沖讀入的字符,整塊地返回給strInputLine變量。然后,又把這個strInputLine和一個“ ”加到strResponse的末尾。“ ”是Java的一個轉義字符,表示一個新的文本行。在讀入目標文檔的所有內容后,程序調用objInReader對象的close()方法顯式地關閉輸入流。

在所有代碼輸入完畢之后就可以編譯這個FetchURL工程了。Visual J++不僅將從Java源文件生成通常的類文件,還將生成一個DLL文件。這個DLL文件封裝了Java類文件,它使得我們可以從任何COM環境(包括ASP)訪問Java類文件所提供的功能。

如果使用Visual J++ 6,將.java文件編譯成.class文件和相應的.dll文件很簡單,只需從Build菜單選擇Build命令就可以了。如果測試FetchURL.dll的機器和編譯是同一臺計算機,則不需要任何附加的工作了;如果不在同一臺機器上,則還需要在測試機器上用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
% >
這段代碼首先創建FetchURL的實例,創建方法和其他COM對象的創建方法一樣。然后,程序調用Fetch方法,將結果字符串返回給客戶瀏覽器。保存上述腳本為Test.asp,然而用類如“http://localhost/scripts/Test.asp”的URL打開它,就可以看到結果了
以上我們介紹了在Visual J++中開發ASP COM組件的具體過程。對于ASP應用來說,Java以網絡為中心所提供的許多功能是Visual Basic所缺乏的,如果代碼有可能要在不同的平臺下重用,更值得認真考慮Java;此外,我們還看到,即使是使用Visual J++,我們仍舊沒有使用Microsoft的私有Java擴展,在Visual J++中完全可以寫出能夠用其他Java編譯器編譯的Java代碼。

北斗有巢氏 有巢氏北斗