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代码。
