Servlets是Java编程环境中一个非常有生命力的新鲜事物,本文描述了Servlets,并介绍如何用VisualAge for Java迅速开发Servlets。Servlets开发中应用到的VisualAgeforJava的关键技术是VisualAgeforJava的模拟多种虚拟机环境的能力,以及代码增加编辑并连接到运行中的程序中的能力。
背景
在WWW的初期,程序员们很快就意识到,通过使用公共网关界面(CGI),WWW可以成为一个引人注目的应用开发平台。事实上,一个CGI程序就是把各种能力扩展到Web服务器中的一个插入模块。然而,CGI的最初设计要求为每一个请求服务创建一个单独的进程,从而增加了性能和资源的消耗。为改进CGI的性能和可扩展性,Web服务器厂商引进了专有的APIs,例如网景公司的NSAPI、微软公司的ISAPI和IBM的GWAPI,同时,网景公司还为Navigator引人了一个Web浏览器插入API。这样一来,Web客户机和服务器都可以通过插入而加以扩展。不幸的是,这一插入要求使用专用的APIs,对于不同的操作系统版本也不同。
Sun公司推出的Java和定义的AppletAPI带来了WWW的第二次进步,AppletAPI为开发者提供了一个扩展Web浏览器的标准和与平台无关的方式。现在,Sun公司使Java成为建立N层企业级应用软件又推出了ServletAPI,为Web服务器带来了同样的优点。热心者可以通过访问http://java.sun.com了解Servlet,还可以从这里下载文档和JavaServlet开发工具包(JSDK)。在下面的讨论中,我们将会提到JSDK1.0.1。
运行Servlet
运行Servlet的最好开端是下载JSDK和运行范例,并在Web服务器上配置Servlet。使用者可以用ServletRunner(srun)测试Servlet,ServletRunner是一个包含在JSDK中的小程序,是一个简化的Web服务器,与AppletViewer相似,只要Applet一连接上,它就能够成为一个简化的Web浏览器。
假设使用者正在WindowsNT平台上工作,并已安装了JSDK1.1.x或JSDK1.0.1,打开一个命令提示符,并转到JSDK目录,例如,E:/JSDK。在这个目录中,bin子目录中包含了ServletRunner,servlet子目录中包含了servlet范例。然后进入servlet子目录,键入下面命令:
E:/JSDK/servlet>../bin/srun-v
现在,就有了一个监听8080端口的Web服务器,"-v"选项向命令提示符窗口产生详细的输出。下面,打开任意一个Web浏览器,例如网景的Navigator,并打开http://127.0.0.1:8080/servlet/HelloWorldServlet。ServletRunner加载了HelloWorldServlet类,为它构造一个环境,调用其init()方法,然后调用它的service()方法,service()方法有一个请求参数和响应参数。HelloWorldServlet对象简单地给响应对象写一个HTML主页,该响应对象被返回到Web浏览器并显示。在第一次服务请求之后,该servlet保持激活状态,并处于待命状态,可以处理进一步的请求。servlet的构造必须能够处理多个并发服务请求,因为每一请求都是从自己的线程开始的。当ServletRunner终止时,它调用servlet的destroy()方法。
在Servlet生命周期的最后阶段,使用者必须停止并重新启动ServletRunner(或Web服务器),以得到一个更新的servlet类文件。在开发过程中,使用者会经常改变servlet代码,所以使用ServletRunner可能会很单调乏味,特别是在servlet开始运行了一段时间以后,不得不调试一个问题的时候。幸运的是,来自IBM的VisualAgeforJava提供了一个效率更高的开发Servlet软件的方式。
要停止ServletRunner,在命令提示符窗口中键入Ctrl-C即可。
VisualAge for Java有两个关键技术,使开发servlet非常方便:一个是多种虚拟机环境模拟,另一个是代码增加编辑并连接到运行中的程序。
JSDK包含了ServletRunner源代码(srun.c),如果仔细考察一下,就会看到ServletRunner只是简单地运行sun.servlet.http.HttpServer类。由于ServletRunner是一个Java程序,可以在VisualAgeforJava中把它当作一个模拟虚拟机环境来运行。启动VisualAgeforJava,并创建一个叫做JSDK的新项目。下面,解压缩E:/JSDK/lib/classes.zip文件,输出到一个temp目录(或简单地拷贝到classes.jar),并把类文件(或jar文件)输入到JSDK项目下。这时会产生几个问题,因为classes.zip文件丢失了某些用于NetscapeWeb服务器支持的类。删除sun.servlet.netscape软件包来清除这些问题,选择sun.servlet.http.HttpServer类并运行它(提供-v参数来把详细结果输出到控制台窗口)。现在,开发环境就是一个Web服务器!
下一步,对于范例sevlets,把这些源代码从E:/JSDK/servlrts目录输入到JSDK项目,在Workbench窗口中的项目制表符中扩展HelloWorldServlets类,并选择doGetO方法。在源窗格中,在该行的起始处放入一个插入点,内容如下:out.printin(HelloWorld);插入一个断点,在Web浏览器中重新载入HelloWorldServletsURL。将命令改成:out.print("Hello VisualAge");然后,存储这一变更。VisualAgeforJava仅仅编辑这个修改的类方法,并将其连接到运行程序中。其重要之处在于:认识到增加编辑只是事情的一半,真正的效率在于不必重新启动正在调试的程序,也不必重新创建引起问题的程序执行状态,正是这种程序执行状态产生了这些问题,而使用者正在设法处理。
通过几行程序代码,检测任何感兴趣的变量,单击Resume按钮来完成服务请求,修改后的HTML页将在Web浏览器中出现。
使用VisualAgeforJava,可以修改运行中的servlet,因此没有必要重复性地停止和启动Web服务器。此外,当服务器运行时,使用者仍会拥有所有希望的开发环境。
结论
Servlet是Web应用开发中的一个重要进步。VisualAgeforJava通过ServletRunner对开发Servlet、增加编辑和连接到运行中的程序有很好的支持。将来,IBM还会通过将Web连接技术扩展到Smalltalk和C++对Java的连接,进一步来加强对Servlet的支持。在IBM软件技术的帮助下,使用者将能够从HTMLJavaBean中使用VisualAgeforJavaCompositionEditor,进而可视化地创建Servlets。