明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

在Visual J++中編寫(xiě)ASP COM組件

[摘要]Java是一種以網(wǎng)絡(luò)為中心的編程語(yǔ)言,許多只使用ASP腳本難以完成的任務(wù)可以用Java輕松地實(shí)現(xiàn)。同時(shí),擴(kuò)展ASP應(yīng)用最好的方法莫過(guò)于加入COM組件。那么,可以利用Java為ASP開(kāi)發(fā)組件嗎?本文通過(guò)實(shí)例,說(shuō)明了在Visual J++環(huán)境下開(kāi)發(fā)COM組件的具體過(guò)程。 一、概述 自Java問(wèn)世以來(lái)...

Java是一種以網(wǎng)絡(luò)為中心的編程語(yǔ)言,許多只使用ASP腳本難以完成的任務(wù)可以用Java輕松地實(shí)現(xiàn)。同時(shí),擴(kuò)展ASP應(yīng)用最好的方法莫過(guò)于加入COM組件。那么,可以利用Java為ASP開(kāi)發(fā)組件嗎?本文通過(guò)實(shí)例,說(shuō)明了在Visual J++環(huán)境下開(kāi)發(fā)COM組件的具體過(guò)程。
一、概述

自Java問(wèn)世以來(lái),各種開(kāi)發(fā)工具、開(kāi)發(fā)環(huán)境不斷出現(xiàn)。這些環(huán)境和工具面向不同層次的用戶,具有各自的優(yōu)點(diǎn)。那么,使用Visual J++作為Java開(kāi)發(fā)平臺(tái)又有哪些優(yōu)點(diǎn)呢?粗略地講,這些優(yōu)點(diǎn)包括:

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

接下來(lái)我們將用Visual J++創(chuàng)建一個(gè)可用于ASP環(huán)境的組件。這個(gè)組件只包含一個(gè)方法,它的參數(shù)是字符串URL,功能是提取并返回由URL指定的HTML文檔的內(nèi)容。

本文將逐步介紹整個(gè)組件開(kāi)發(fā)過(guò)程。包括如何在Visual J++中創(chuàng)建工程,輸入必要的Java代碼并解釋這些Java代碼的作用,以及如何在ASP腳本內(nèi)應(yīng)用這個(gè)組件。

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

二、創(chuàng)建Visual J++工程

啟動(dòng)Visual J++,出現(xiàn)如下對(duì)話框:







【圖1】

在這個(gè)對(duì)話框中選擇新建工程,輸入這個(gè)工程的名字FetchURL以及合適的工作目錄,然后選擇COM DLL圖標(biāo),最后單擊“打開(kāi)”按鈕。

Visual J++將自動(dòng)為新建工程創(chuàng)建一個(gè)Java文件,名為Class1.java。在Project Explorer窗格,雙擊工程名字,按右鍵,然后將Class1.java改名為FetchURL.java。雙擊FetchURL.java文件名即可看到文件內(nèi)容。FetchURL.java中由Visual J++自動(dòng)加入的代碼是創(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要求每一個(gè)類的名字與其對(duì)應(yīng)的Java文件名完全相同(大小寫(xiě)敏感)。

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

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

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

要查看所導(dǎo)入的包定義了哪些類,可以在Class Outline窗格內(nèi)擴(kuò)展相應(yīng)的目錄。FetchURL將利用java.io包中定義的類從打開(kāi)的網(wǎng)絡(luò)連接讀入數(shù)據(jù),利用java.net包提供的類建立與遠(yuǎn)程服務(wù)器的連接并請(qǐng)求文檔。

public String Fetch(String strURL)
FetchURL包含唯一的方法Fetch,它的參數(shù)是一個(gè)字符串,該字符串指向要求提取的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)頁(yè)面的整個(gè)文檔,F(xiàn)etch方法最后返回的就是這個(gè)strResponse變量。在這幾行代碼中,程序創(chuàng)建了一個(gè)URL對(duì)象并嘗試用該對(duì)象建立連接。這兩行代碼都封裝在try...catch塊內(nèi)以處理任何可能出現(xiàn)的異常。Java利用“異!眮(lái)處理任何程序遇到的例外情況(通常是錯(cuò)誤)。例如,如果傳遞給Fetch方法的URL參數(shù)格式錯(cuò)誤,或程序運(yùn)行時(shí)未能與指定服務(wù)器建立連接,都會(huì)引發(fā)異常,此時(shí)程序?qū)旬惓P畔⒎祷亟o調(diào)用Fetch方法的應(yīng)用。異常處理代碼見(jiàn)相應(yīng)的catch關(guān)鍵字。

BufferedReader objInReader = new BufferedReader(
new InputStreamReader(
objConnection.getInputStream()));
這一行代碼有點(diǎn)復(fù)雜,所以在完全搞懂它的意思之前先不要著急。在這行代碼中,程序利用了象Java這樣完全面向?qū)ο缶幊陶Z(yǔ)言所提供的優(yōu)勢(shì)。首先,它用objConnection對(duì)象創(chuàng)建了一個(gè)InputStream類的對(duì)象,這實(shí)際上是一個(gè)可以從服務(wù)器讀取數(shù)據(jù)的流;然后,又把這個(gè)InputStream類的對(duì)象傳遞給InputStreamReader,后者將負(fù)責(zé)從InputStream對(duì)象讀取數(shù)據(jù);最后,又用這個(gè)InputStreamReader類的對(duì)象創(chuàng)建BufferedReader類的對(duì)象,也就是objInReader。程序?qū)⒗眠@個(gè)objInReader對(duì)象完成實(shí)際的數(shù)據(jù)讀取操作,并將結(jié)果保存為一個(gè)字符串。

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

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

如果使用Visual J++ 6,將.java文件編譯成.class文件和相應(yīng)的.dll文件很簡(jiǎn)單,只需從Build菜單選擇Build命令就可以了。如果測(cè)試FetchURL.dll的機(jī)器和編譯是同一臺(tái)計(jì)算機(jī),則不需要任何附加的工作了;如果不在同一臺(tái)機(jī)器上,則還需要在測(cè)試機(jī)器上用regsvr32 FetchURL.dll命令注冊(cè)它,就像其他COM對(duì)象的注冊(cè)一樣。

對(duì)于使用Visual J++早期版本的用戶,編譯.java文件的方法也類似,但還需要額外的注冊(cè)步驟,即使用JavaReg /register 命令注冊(cè)該類。

三、編寫(xiě)ASP腳本

測(cè)試FetchURL的ASP代碼非常簡(jiǎn)單:

< %
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對(duì)象的創(chuàng)建方法一樣。然后,程序調(diào)用Fetch方法,將結(jié)果字符串返回給客戶瀏覽器。保存上述腳本為Test.asp,然而用類如“http://localhost/scripts/Test.asp”的URL打開(kāi)它,就可以看到結(jié)果了
以上我們介紹了在Visual J++中開(kāi)發(fā)ASP COM組件的具體過(guò)程。對(duì)于ASP應(yīng)用來(lái)說(shuō),Java以網(wǎng)絡(luò)為中心所提供的許多功能是Visual Basic所缺乏的,如果代碼有可能要在不同的平臺(tái)下重用,更值得認(rèn)真考慮Java;此外,我們還看到,即使是使用Visual J++,我們?nèi)耘f沒(méi)有使用Microsoft的私有Java擴(kuò)展,在Visual J++中完全可以寫(xiě)出能夠用其他Java編譯器編譯的Java代碼。
(出處:熱點(diǎn)網(wǎng)絡(luò))