在Visual J++中编写ASP COM组件(转)

来源:岁月联盟 编辑:zhuzhu 时间:2003-07-11
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代码。