|
Ed Van Gennip
经理,DB2 UDB Solution Development Service, IBM 加拿大有限公司
2002 年 6 月
这是描述如何安装和配置 WebSphere Application Server,以使用 DB2 数据的三部分文章的第一部分。本文已更新而用于 WAS 4.0 和 DB2 UDB 7.2
简介
数字,数字无处不在,每个人都想得到不同形式的数据。本文描述了我是如何编写几个 servlet 和 JSP(Java Server Pages)来允许管理员、开发人员、测试员、计划人员以及任何人访问最新的测试结果并用多种格式显示它们的,这几个 servlet 和 JSP 运行在 IBM HTTP Web 服务器上的 WebSphere Advanced Edition (AE v4.01) 下,使用 Java™ 1.3 JDK,访问存储在 IBM DB2 UDB V7.2 数据库中的原始测试数据。
阅读本文后,您将能够安装和配置 WebSphere AE 版本 4.01、安装和配置 DB2 以及编写 servlet 和 JSP。您还将学习如何配置这些 servlet 和 JSP 以便与 AE 协调工作、创建 DB2 表并向它们填充数据、在更多机器中的某一台上运行整个配置以及最终启动诸如 Netscape (v4.7) 那样的 Web 浏览器并查看它完全正确地运行。为了增加一些乐趣,我在浏览器中包含了诸如自动切换页面那样的几个小项,还包含了声音字节。我将描述如何添加允许测试员用新的测试运行更新数据库的附加 servlet。
最后再提一句,我想说的是:本示例解决了需要用从高级摘要到非常详细信息在内的多种格式的测试信息的特殊问题。有一种非常类似的方法可用于多种类型的数据。
本文适用于希望了解 Web 世界的 DB2 开发人员。本文的内容很基础,足以适用于所有类别的新手,这些类别是:DB2、Web、servlet、JSP 和 HTML。其中的示例很简单、步骤也很详细,您足以轻松读懂它们。
概述
图 1显示了最终配置。诸如 Netscape 或 Internet Explorer 那样的 Web 浏览器担当 WebSphere 高级版服务器的客户机。
图 1:典型的生产拓扑结构
服务器可以与浏览器位于同一台机器上,也可以位于远程机器上。Web 服务器连接至一个数据库服务器以便检索数据,然后该 Web 服务器格式化该数据以在浏览器中显示。该数据库服务器可以与该 Web 服务器位于同一台机器上,也可以位于不同的机器上。开发这样的环境时,所有组件都在一台机器上较容易而且较实际。开发、测试和调试的任务也更容易。
但是,一旦应用程序准备用于生产,那么浏览器可以在任何机器上,或许不在 Web 服务器的机器上,而根据负载,Web 服务器和数据库服务器可能是同一台机器,也可能是不同的机器。本文中所有步骤都已在一台机器上完成。我将指出这个开发环境和生产环境之间的区别。2002-6-30
环境设置
在实际开始享受编写和测试应用程序的乐趣之前,我们需要安装各种组件。因为这涉及 servlet,所以我们需要编写 Java 代码,这意味着您将需要安装 Java JDK 版本 1.3,因为这是 WebSphere AE 4.01 支持的版本。我们还需要安装 DB2。我在这篇更新的文章中使用了版本 7.2。最后,安装 AE 4.01。作为替代选择,如果您没有或不希望获取 JDK 和 DB2,那么您只要安装包括 IBM 版本的 JDK 1.3 以及还包括 DB2 Instant DB(DB2 的较小版本)的 AE。我将把后一选项作为最直接的方法描述。侧栏中是前一选项所需的步骤。所有步骤和抓屏都是在安装了 Service Pack 2 的 Windows 2000 上完成的。对于 Windows NT 平台,这些步骤应当是相同的。
WebSphere 高级版安装
本文中我将自始至终使用 WAS 表示 WebSphere 高级版的主要组件 WebSphere Application Server。
|
图 2:安装技巧
安装 JDK 1.3:从您喜爱的网站下载 Java 开发者工具箱,运行自解压可执行文件或解压缩,然后运行安装。完成安装后,在 PATH 环境变量中添加 <inst.-path>\jre\bin;<inst.-path>\bin;。同时在 CLASSPATH 中添加 <inst.-path>\jre\lib\rt.jar;<inst.-path>\lib\tools.jar;。
安装 DB2 UDB:插入 IBM DB2 UDB V7.2 CD。自动播放应该启动安装程序。确保安装了样本数据库,并测试它以确保每一步都正确完成。将自动配置运行时环境。如果您查看 PATH 和 CLASSPATH 环境变量,那么应该看到那儿有一些 DB2 信息。作为替代选择,如果已安装了 V7.1,那么在 V7.1 上面安装 FixPak 3 或更高版本。
安装 WAS 4.01:最容易的方法是选择 Typical 安装,它安装所有您需要的组件。对于 Custom 安装,取消选择您已安装的组件。要使用您现有的 JDK 1.3,取消选择它,然后按下 Other JDK 按钮。确保找到您的 JDK。如果没有,那么使用 Browse... 按钮来定位。类似地,如果您已安装了 HTTP 服务器,那么从列表上取消选择它。我建议您不要取消选择样本,因为它们提供了可用于学习的多种代码。
|
插入 WebSphere CD,自动播放应该使安装程序开始运行。如果没有,那么通过从位于 Windows 桌面的 Start 菜单上选择“Run”来运行 CD 上的 install.exe。大致遵循这些步骤:
- 选择 Typical Install 或 Custom Install。Typical Install 将安装 HTTP 服务器、WAS、DB2 和 JDK。Custom Install 允许您选择您希望安装的组件,所以如果您已安装了 DB2 或 JDK,那么使用这个选项。下列步骤假设选择 Typical Install,因为那可能是最常见的安装类型。
- 输入作为 WAS 安全性标识的用户标识和密码。仅为简单起见,我使用我的 Windows 登录标识。
- 选择安装 WAS 的目录。如果您正在安装 HTTP 服务器,那么还将要求您输入它的安装目录。我建议采用不同位置。
- 输入 DB2 用户标识和密码以便 WebSphere 设置和访问 DB2。WAS 为一起提供的样本创建一个名为“was”的数据库。注:这可能不是访问运行在 Web 服务器上的 DB2(通过 servlet 或类似的方法)的用户标识和密码。由于我已经安装了 DB2,所以我输入现有的用户标识和密码。
- 输入 WAS 的文件夹名以便创建桌面快捷方式。
- 既然已经收集了所有信息,那么安装可以继续。取决于您的安装选择,在安装了 HTTP 服务器、DB2 和 JDK 后将安装 WAS。
- 安装完成后,需要重新引导。
- 重新引导之后,您将看到一个打开的 DB2 CLP 窗口以及正在创建的 WAS 数据库。这用于随 WAS 一起提供的样本。根据您机器的性能,它将运行几分钟。
数据库配置
本节的目的不是解释如何创建 DB2 表、列和键等。在本节中,我们将演示一种使用包括 DB2 在内的多种工具以解决特定问题的方法。因此,这里将不探究数据库配置、表设置和数据填充。DB2 有极佳的手册、联机帮助和控制中心(Control Center)或命令中心(Command Center)GUI 工具来辅助这个任务。
在本示例中使用了两张表。TSTCASES 包含诸如每个平台上每种产品的测试用例号那样的静态信息。TSTRSLTS 表包含诸如每个平台上每种产品每次测试运行的结果等动态信息。这两张表都包含在 TESTSTAT(测试统计)数据库中。TESTSTAT 数据库和这些表都是由以下 DB2 命令创建的。无论您的模式名是什么(通常是您的机器名),字段“machinename”应该用模式名来替代。
TSTCASES 表是由以下 DB2 命令创建的:
CREATE TABLE "machinename.TSTCASES"("PROD_ID" CHAR(10) NOT NULL, "PRODUCT" CHAR(30)
NOT NULL,"PLATFORM" CHAR(20) NOT NULL, "NUM_C_AUTO_TCS" INTEGER NOT NULL ,
"NUM_JAVA_AUTO_TCS" INTEGER NOT NULL , "NUM_C64_AUTO_TCS" INTEGER NOT NULL,
"NUM_C_MANUAL_TCS" INTEGER NOT NULL , "NUM_JAVA_MANUAL_TCS" INTEGER NOT NULL ,
"NUM_C64_MANUAL_TCS" INTEGER NOT NULL,
"NUM_JSUI_TCS" INTEGER NOT NULL , "NUM_OLT_TCS" INTEGER NOT NULL ,
"NUM_LOGBR_TCS" INTEGER NOT NULL , "NUM_OTHER_TCS" INTEGER NOT NULL) ;
ALTER TABLE "machinename.TSTCASES" ADD PRIMARY KEY ("PROD_ID", "PLATFORM");
|
TSTRSLTS 表是由以下 DB2 命令创建的:
CREATE TABLE "machinename"."TSTRSLTS" ("DRIVER" CHAR(15) NOT NULL, "PLATFORM"
CHAR(20) NOT NULL, "PROD_ID" CHAR(10) NOT NULL,
"TEST_MACHINE" CHAR(15) NOT NULL, "JDK_LEVEL" CHAR(15) NOT NULL, "COMPILER_LEVEL"
CHAR(15) NOT NULL, "OS_LEVEL" CHAR(15) NOT NULL, "NUM_TCS" INTEGER NOT NULL,
"NUM_PASSED" INTEGER NOT NULL, "DATE_TIME" TIMESTAMP NOT NULL, "C_AUTO_PASSED"
INTEGER NOT NULL WITH DEFAULT 0, "C_AUTO_FAILED" INTEGER NOT NULL WITH DEFAULT 0,
"JAVA_AUTO_PASSED" INTEGER NOT NULL WITH DEFAULT 0, "JAVA_AUTO_FAILED"
INTEGER NOT NULL WITH DEFAULT 0, "C64_AUTO_PASSED" INTEGER NOT NULL
WITH DEFAULT 0, "C64_AUTO_FAILED" INTEGER NOT NULL WITH DEFAULT 0,
"C_MANUAL_PASSED" INTEGER NOT NULL WITH DEFAULT 0, "C_MANUAL_FAILED" INTEGER NOT NULL
WITH DEFAULT 0, "JAVA_MANUAL_PASSED" INTEGER NOT NULL WITH DEFAULT 0,
"JAVA_MANUAL_FAILED" INTEGER NOT NULL WITH DEFAULT 0, "C64_MANUAL_PASSED"
INTEGER NOT NULL WITH DEFAULT 0, "C64_MANUAL_FAILED" INTEGER NOT NULL WITH DEFAULT
0, "JSUI_PASSED" INTEGER NOT NULL WITH DEFAULT 0, "JSUI_FAILED" INTEGER
NOT NULL WITH DEFAULT 0, "OLT_PASSED" INTEGER NOT NULL WITH DEFAULT 0,
"OLT_FAILED" INTEGER NOT NULL WITH DEFAULT 0, "LOGBR_PASSED" INTEGER
NOT NULL WITH DEFAULT 0, "LOGBR_FAILED" INTEGER NOT NULL WITH DEFAULT 0,
"OTHER_PASSED" INTEGER NOT NULL WITH DEFAULT 0, "OTHER_FAILED" INTEGER
NOT NULL WITH DEFAULT 0, "LATEST" CHAR(1) NOT NULL WITH DEFAULT 'N');
ALTER TABLE "machinename"."TSTRSLTS" ADD CONSTRAINT PRIMARY
KEY ("DRIVER", "PLATFORM", "PROD_ID", "JDK_LEVEL", "COMPILER_LEVEL", "OS_LEVEL);
|
通过以下命令,将数据填充到 TSTCASES 表中:
IMPORT FROM <path>\tstcases OF DEL MODIFIED BY chardel"" coldel,
decpt. MESSAGES dummy INSERT INTO <machine-name>.TSTCASES
|
通过以下命令,将数据填充到 TSTRSLTS 表中:
IMPORT FROM <path>\tstrslts OF DEL MODIFIED BY chardel"" coldel,
decpt. MESSAGES dummy INSERT INTO <machine-name>.TSTRSLTS
|
注:DB2 有辅助创建数据库、表等的向导。不一定非得学习上面的命令,但却很有用,特别是对于要获得经验的人员。
WebSphere 高级版配置
下一个任务是在开始添加我们新的应用程序之前配置 WAS,并确保它正确地运行。我们将配置 WAS,所以它的样本中至少有一个将运行。有一个到 http://<node>/WSsample.index.html 的桌面链接,该链接是对样本、如何配置它们以及运行它们的链接的介绍。我将不描述如何设置所有样本,所以有关那方面的信息,请参考该链接。稍后当我们集成新的应用程序时,将有更多信息。
- 作为 IBM HTTP 服务器安装的一部分,创建了两个服务:IBM HTTP Server 和 IBM HTTP Administration。这两个服务应该被自动启动,而且现在的状态应该是 Started。
- WAS 安装添加了一个名为 IBM WS Adminserver 4.0 的服务。可能没有启动它,但需要启动它。现在从 Services 控制面板或从 Start 菜单启动它。选择 Start->Programs->IBM WebSphere->Application Server V4.0 AE->Start Admin Server来启动这个服务。如果它不能启动,那么转至 MS-Command 提示窗口,切换至 <install-path>/appserver/bin 目录,并输入 adminserver.exe以显示启动过程和失败的原因。
- 从 Start 菜单点击 Start->Programs->IBM WebSphere->Application Server V4.0 AE->Administration Console启动 WAS Administration Console。根据您在安装期间使用的组名,您的菜单名可能稍有不同。如果出现问题,那么遵循那些类似的适用于管理服务器的步骤,但是要运行 adminclient.bat。
- 在 Administration Console 的左上窗格中,展开 WebSphere Administrative Domain。展开 Nodes 选择项。您将看到列出的您的机器名。选中您的机器名以便更新右边窗格。这样允许您更改各种配置。您的机器被称为节点。打开您的机器以便查看应用程序服务器列表。打开那个列表,查看缺省服务器列表。如果服务器正在运行,那么其图标将是一个带箭头的框,如果服务器不在运行,其图标将是含有红色 X 的框。如果它不在运行,则您希望启动服务器。从菜单栏选中 PLAY按钮(或 start 按钮)。
注:如果启动您的节点时出现问题,您可以查看位于 <install-path>/appserver/logs 目录中的各种日志文件。同时,Administration Console 的底部显示了近期发生的各种事件。如果有问题,您可以查看那里,然后滚动列表以进行故障诊断。您可以选中一条消息,并按下 Details 按钮来查看更多信息。
- 现在查看它是否完全工作正常。转至 Start->Programs->IBM WebSphere->Application Server V4.0 AE->Samples。这样就启动了您的缺省浏览器,并显示 Samples 页面。我们将测试 Form 样本。在浏览器的左窗格中,从 Samples.ear节下选中 YourCo链接。现在右窗格显示各种样本。选中 Form链接。这里,您可以阅读该样本做什么,然后选中 Run this sample链接。或许将启动一个新的浏览器窗口,其中显示一个表单。输入一些信息,然后按下 Submit按钮。几秒钟后,应该显示结果页面。此时,我们知道已配置了 WAS,而且它正在运行。现在转至我们的应用程序!
开始享受乐趣 — 您的第一个页面
图 3演示了我们应用程序的最终文件结构。它是一个 Java 服务器页面、HTML 页面和 servlet 的组合。没有扩展名的文件是 servlet。缩进显示了层次结构或者哪个页面调用了另一个页面。在本文中,我不会包括或描述所有页面的详细信息,因为该功能的许多方面都是多次重复的。所有代码都包括在 提供的 zip 文件中。
图 3.应用程序结构
我们将创建第一个 HTML 页面 TestTeam.html,在浏览器中打开该页面然后配置 WAS 以便在请求时提供这个页面。这是第一个页面,但不是主页。从 图 3中,我们看到 TestTeam.html 只调用 TestMain.jsp。 图 4a显示了这个 HTML 源代码。请注意 1-2 行的样本文本。这意味着这个页面应该显示 8 秒钟(Content="8"),然后要显示的 URL 是 TestMain.jsp。TestMain.jsp 是主页。下面的 图 4b 显示了这个 HTML 文件的结果。
5-15 行显示了 HTML 的几个基础知识。它按序显示了如何将背景设置为图像,在本例中它是小的 jpg 文件,当一次又一次重复使用该文件时,它构成了一个白色大理石背景。接着是标题,随后是 1-2 行中显示的介绍性语句,它是一张 DB2 UDB V7.1 徽标的图片以及一张 WebSphere Advanced Edition 徽标的图片。请注意 alt="..b..."。如果不能显示图片,那么就显示该文本。接近末尾的 19-21 行是嵌入声音字节(wav 文件)的语句。当显示该页面时,声音字节就播放了。我将这个页面设置为显示 8 秒钟的原因是为了允许声音字节播放完成。这个特定的声音是取自 Star Trek 的开门声。
图 4a:TestTeam.html 代码样本及其显示
1 <HTML><HEAD><META HTTP-EQUIV="Refresh"
2 Content="8; URL=TestMain.jsp">
3 <TITLE>Test Results</TITLE></HEAD>
4 <body text="#FF0000" bgcolor="#FFFFFF" link="#FFFF00" vlink="#F00000"
5 alink="#FF8080" background="resources/whtmarb.jpg">
6 <center><H1>Test Results</H1>
7 <p><font color="#0000FF"> This Web site
8 is driven by WebSphere Advanced Edition
9 4.01, IBM HTTP server, DB2 UDB V7.2,
10 JDK 1.3 SR?</font></p>
11 <table><tr><td><center><img
12 src="resources/dbv5bkmd.gif" alt="DB2 Universal Database V7.2">
13 </center></td></tr>
14 <tr><td><center><IMG SRC="resources/WasBanner.gif"
15 alt="WebSphere AE 4.01"></center>
16 </td></tr></table>
17 <p>Owner/Designer : Ed Van Gennip. vagennip@ca.ibm.com</p>
18 </center>
19 <embed SRC="resources/holodeck.wav" autostart=true
20 hidden=true width=2 height=2>
21 </embed>
22 </body></HTML>
|
图 4b:第一个测试页面的结果
创建新的应用程序
编写一些 HTML 只有一半乐趣,真正的乐趣是将代码集成到 Web 服务器中、启动浏览器、坐下来欣赏您用心血和汗水编写的应用程序按照设计的那样运行。在编写任何附加代码之前,最好确保我们能将这单个页面作为简单应用程序来正确地运行。因为我们添加页面、JSP 和 servlet 时,应用程序就更复杂了。如果发生问题,那么要确定问题在哪里就比较困难。如果我们有一页应用程序,并且出现错误,那么缩小问题的范围并解决它将容易得多。所以那就是我们将采用的方法。
- 从 WebSphere Advanced Administration Console 工具栏上选中 Tools,然后选中 Application Assembly Tool。这样将启动创建应用程序(*.ear 文件)或独立模块(*.war 文件)的新工具。
- 在第一个屏幕上选中 Create Web Module Wizard 图标。双击或按下 OK 按钮。这样将创建可以在稍后可选地添加到应用程序的 .war 文件。
- 在 Filename 字段中输入 test.war。可选地输入显示名称和描述。按 Next 按钮继续。
- 在下一个屏幕中我们添加 servlet 类文件、图片和图标。由于这时我们只尝试运行初始 HTML 屏幕,因此我们将输入最少的信息。这是‘迭代’开发方法。即,当我们开发它们时添加这些部分,而不是设计并开发每个部分,然后将它们都放置在一起,希望它们都能完全正确地运行。单击 Add Resource Files 按钮。我们希望添加该页面本身的 HTML 文件以及所有图片、声音文件和您想要放置在该页面上的任何其它内容。
在 Root Directory or Archive字段中输入指向该样本文件位置的路径,例如 c:/article。按 Enter 键。在树状窗格中,选中 Web 图标。现在右窗格显示那个目录的内容。选中 TestTeam.html。按下 Add 按钮。
现在在左窗格中选中 Resources 图标。选中 TestTeam.html 文件需要的所有资源。选中一个,然后按下 Add 按钮。对每个文件(holodeck.wav、dbv5bkmd.gif、whtmrb.jpg 和 wasbanner.gif)都执行这一操作。一旦所有这些文件都在下面的窗格中后,按下 OK 按钮。选中 Next 按钮。
- 在 Web Modules 页面上,选中 Next 按钮。在 Icons、Web Components、security roles、servlet mappings 和 Add Resource Reference页面上选中 NEXT 按钮。
- 在 context parameters、Errors、>MIME mappings 和 Tag Libraries页面上选中 NEXT 按钮。
- 在 Welcome Files页面上我们可以添加主 html 文件,它是当我们的应用程序启动时所显示的第一个文件。然后我们能够输入无 HTML 名称的 URL,这个页面可以作为缺省页面显示。然而,对于这个应用程序,我们不这样做。按下 Next 按钮继续。
- 在最后一个页面,即 EJB References页面上,按下 Finish 按钮。
- 在 Application Assembly Tool(AAT)窗口中,现在您将看到前面所有步骤的结果。在标有 Display name field的右窗格中,重新输入您可能在前面指定的可选名称。我输入了 DB2TestSample。您可能看到 .war 文件的名称不是我们前面输入的 test.war。要更改它,转至 File 菜单然后选中 save。一定要记住并记下保存文件的位置。
- 现在我们将测试这个文件来查看我们的主页是否将正确运行。切换至 Administration Console。从 Console 菜单上选中 Wizards,然后是 Install Enterprise Application。
- 选中 Install stand-alone module单选按钮。输入路径名或使用 Browse... 按钮,将 test.war名称输入到 Path字段中。
- 在 Application name 域中输入诸如 TestSample那样的名称。在 Context root 域中输入 /testTeam。按下 Next 按钮继续。
- 连续按 Next 按钮,直到显示最终屏幕为止,此时启用了 Finish 按钮,而禁用了 Next 按钮。请阅读该页上的注释,记下将要存储文件的位置。按下 Finish 按钮。
- 几秒钟后,您应该看到表示成功完成安装的对话框。按下 OK 按钮。
- 现在回到 WebSphere Administration Console中,选中 Default Server,单击鼠标右键然后选中 STOP。
- 选中节点,它通常是您的机器名,单击鼠标右键,然后选中 Regen Webserver plugin。这样将告知 HTTP Server 新的 Web“页面”是可用的。
- 现在再次启动服务器。在 Default Server 上单击鼠标右键然后选中 START。
此时,我们只希望显示如 图 4b 中演示的第一个 Web 页面。我们只完成了定义应用程序和将它安装在 Web 服务器中的任务。这些文件将被复制到 <Websphere-path>/appserver/installedApps/ 目录树。所有文件都位于它们必需在的位置。
- 启动您所选的浏览器。输入 http://your-machine-name/testTeam/Web/TestTeam.html作为 URL。很快,TestTeam.html 页面就出现了。正如 Anakin Skywalker 说的那样,“它运行了,它运行了!”。
- 请注意 testTeam是您在 AAT 中输入的上下文根。那里有 web部分,因为这就是复制 TestTeam.html 的出处。如果您查看该目录结构,那么您还将看到图像就象它们原先所在的那样已经被保存在 resources 子目录中。
注:我们刚才测试的这个 Web 页面将只出现并被显示 8 秒钟,然后它将自动切换至主页 TestMain.jsp。但由于我们还没有编写 TestMain.jsp,因而它不存在,所以浏览器切换将失败,而且可能显示一串错误。这并不意味着这第一个页面有错误,而是 链接至页面有错误,因为它不存在。如果您希望查看第一个页面,那么就在显示第一个页面时的 8 秒内单击 STOP 按钮。
一些真正的 HTML:TestMain.jsp 主页
这时,样本应用程序运行时,您应该启动 Web 服务器。同时也应验证 DB2 正在运行,因为一些样本正在使用 DB2。最后,我们正编写的应用程序应该运行在单一 HTML 页面的当前状态。现在我们创建真正的主页。这是一个 JSP(Java Server Page)。原因是这个页面有到 servlet、HTML 页面和其它 JSP 的链接。所有这些都可以从 HTML 页面而不是 JSP 上完成,但是我认为 JSP 代码比 HTML 更优雅更清晰。 图 5 显示了 JSP。要注意的第一点是它看上去象 HTML。JSP 基本上是包含少许额外功能的 HTML。
图 5:TestMain.jsp 代码样本
1 <HTML><HEAD><TITLE>Test team homepage</TITLE></HEAD>
2 <body text="#FF0000" bgcolor="#FFFFFF" link="#FF00FF" vlink="#F00000"
3 alink="#FF8080" background="../resources/whtmarb.jpg">
4 <center><h1><i>Debugger/OLT Test Team Homepage</i></h1>
5 <embed SRC="../resources/bgsnd.mid" autostart=true
6 hidden=true width=2 height=2></embed>
7 <sl><table BORDER=5 COLS=1 WIDTH="90%" BGCOLOR="#FFFFFF">
8 <tr><td ALIGN=CENTER><img SRC="../resources/blob.gif"
9 height=34 width=34><font
10 face="Times New Roman,Times"><font color="#3333FF"><font
11 size=+3>Team
12 Mission</font></font></font><img
13 SRC="../resources/blob.gif" height=34 width=34></td></tr>
14 <tr><td><b><font face="Comic Sans MS"><font color="#000000"><font
15 size=+2>Provide continually improved Problem Determination tools
16 for each release we ship, each product we ship within, and each platform
17 we ship on.</font></font></font></b></td></tr></table>
18 <table WIDTH="80%" >
19 <tr><td><font size=+2><a href="Testmsp.html">Test Plan</a></font></td>
20 <td><font size=+2>View current test plan status</font></td></tr>
21 <tr><td><FORM METHOD="post" ACTION="TeamStruct.jsp">
22 <INPUT TYPE="submit" NAME="Results" ID="D810"
23 VALUE="Team Struct"></form></td>
24 <td><font size=+2>What we test where and how much</font></td></tr>
25 <tr><td><FORM METHOD="post" ACTION="RawData.jsp">
26 <INPUT TYPE="submit" NAME="Results" ID="D810"
27 VALUE="Raw Data"></form></td>
28 <tr><td><FORM METHOD="post" ACTION="TestResults.jsp">
29 <INPUT TYPE="submit" NAME="Results" ID="D810"
30 VALUE="Test Results"></form></td>
31 <td><font size=+2>Current test results </font></td></tr>
32 <tr><td><font size=+2><a href="drvhist.html">Driver
33 Ship History</a></font></td>
34 <td><font size=+2>History of drivers Shipped</font></td></tr>
35 <tr><td><FORM METHOD="post" ACTION="Update.html">
36 <INPUT TYPE="submit" NAME="Update" ID="D810"
37 VALUE="Result Updates"></form></td>
38 <td><font size=+2>TESTERS ONLY. Enter new test data </font></td></tr>
39 <tr><td><i><font size=+2><a href="http://xxx.ibm.com/Builds">Build's</a></font></i>
40 </td>
41 <td><font size=+2>Debugger Build site</font></td></tr>
42 <tr><td><font size=+2>
43 =<a href="http://xxxxxxxx.ibm.com/xxxxxx/cvt_results.html">CVT</a></fo
44 </td>
45 <td><font size=+2>Debugger CVT Results
46 site</font></td></tr></table>
47 <h1><font color="#3333FF">Products we test</font></h1>
48 <table BORDER COLS=2 WIDTH="100%" BGCOLOR="#99FF99" >
49 <tr><td>WebSphere 3.0.X, 3.5, 4.0 - Studio, Std, Adv, Enterprise</td>
50 <td>WebSphere/390 3.0.X, 3.5, 4.0 - Studio, Std, Adv, Enterprise</td></tr>
51 <tr><td>WebSphere/Linux 3.5, 4.0 - Studio, Std, Adv, Enterprise</td>
52 <td>WebSphere Linux/390 3.5, 4.0 - Studio, Std, Adv, Enterprise</td></tr>
53 <tr><td>VisualAge for Java 3.5</td></tr>
54 <tr><td>C for AIX, C++ for AIX</td><td>VACobol</td></tr>
55 <tr><td>XL Fortran</td><td>VisualAge for TPF</td></tr>
56 <tr><td>DT/390</td><td>PortaPak</td></tr>
57 <tr><td>3 Pack</td><td>Code/400, VRPG</td></tr>
58 <tr>Internal projects</tr></table></center></SL>
59 <jsp:include page="../DBBean" flush="true"/>
60 </body></HTML>
|
5-6 行 <embed SRC="../resources/bgsnd.mid" autostart=true hidden=true width=2 height=2></embed> 嵌入了另一个声音字节,在本例中是 .mid 文件,而不是 .wav 文件。当显示这个页面时,连续播放这个文件,而在前一个页面中,这个声音只播放一次。
8-9 行和第 13 行:<img SRC="../resources/blob.gif" height=34 width=34>导致插入一个动画 gif。这被插入两次,在标题两侧各插入一次。只要显示这个页面,这个动画就持续循环。
然后我用 <TABLE> 标记创建了一张表。在这张表内是到这个 Web 应用程序的执行各种功能的各个部分的链接。我将详细讨论在 28-30 行:<FORM METHOD="post" ACTION="TestResults.jsp"> <INPUT TYPE="submit" NAME="Results" ID="D810" VALUE="Test Results"></form>中显示的测试结果,因为这是最有趣的部分。在这里,从 DB2 上抽取测试运行的结果、然后用各种方法进行格式化并在浏览器中显示。我将简要解释其它链接及其目的。
图 5 中的 21-23、25-27、28-30 和 35-37 行显示了 <FORM> 标记。这用于显示一个按钮并将参数发送给另一个 JSP 或 servlet。您可能注意到第 35 行是一个到 HTML 页面的链接。这显示其灵活性。我本可以使用一个常规链接,但我希望表的外观一致(即,所有链接都是按钮)。
第 35 行:<a ref="http://xxx.ibm.com/Builds">Build's</a>< 演示了将一个 HTML 页面链接到另一个的常见方法。通过在 <BODY> 标记上使用 text="#FF0000" bgcolor="#FFFFFF" link="#FF00FF" vlink="#F00000" alink="#FF8080" ,您可以对您的信息部分作标志。您可以使用从十六进制 000000 到 FFFFFF 的数。
1 /*
2 Written by Ed Van Gennip. IBM Canada Limited. 2000
3 Purpose: initialize a pool of DB2 connections for the test team Web
4 application.
5 Bad points: hardcoded driver, URL, userid, password,
6 minConnections, maxConnections.
7 Notes: Connection pool is managed by the ConnectionPool class.*/
8
9 import javax.servlet.*;
10 import javax.servlet.http.*;
11 import java.io.IOException;
12 import java.io.PrintStream;
13 import java.sql.SQLException;
14
15 public class DBBean extends HttpServlet{
16 private ConnectionPool connectionPool;
17
18 public DBBean() { }
19
20 public void destroy() {
21 getServletContext().log("Destroying ConnectionPool now");
22 connectionPool.closeAllConnections();
23 }
24
25 public void doGet(HttpServletRequest httpServletRequest,
26 HttpServletResponse httpServletResp)
27 throws ServletException, IOException {
28 httpServletResp.setContentType("text/html");
29 httpServletResp.setHeader("Pragma", "no-cache");
30 httpServletResp.setHeader("Cache-Control", "no-cache");
31 }
32
33 public void init() {
33 String
34 string1 = "COM.ibm.db2.jdbc.net.DB2Driver";
35
36 String string2 = "jdbc:db2://vangennip:3456/TESTSTAT";
37 String string3 = "Administrator";
38 String string4 = "goodday";
39 try
40 connectionPool
41 = new ConnectionPool(string1, string2, string3
42 string4, initialConnections(), maxConnections(), true);
43
44 getServletContext().setAttribute("ConnPool", connectionPool);
45
46 } catch (Exception e) {
47 System.err.println
48 new StringBuffer("Error making pool: ").append(e).toString());
49 getServletContext().log(
50 new StringBuffer("Error making pool: ").append(e).toString());
51
52 connectionPool = null;
53
54 }
55 }
56 protected int initialConnections() { return 10; }
57 protected int maxConnections() { return 50; }
58 }
|
然后我有了一张列出与调试器和 OLT 一起提供的主要产品的表。这张表之后是我们遇到的第一段 DB2 特定的代码。 图 5 的第 59 行:<jsp:include page="../DBBean" flush="true"/> 中的代码导致嵌入 TestTeam Java 包中的 DBBean servlet,并作为这个页面一部分而执行。
这个 JSP 标记和较早的样本中的 JSP 标记( 图 5中的 21-30 和 35-37 行)之间的区别是这个标记导致立即包含虚拟页面,而其它标记用于当用户按下相应的按钮请求该页面时链接到该页面并显示该页面。我将这个页面称为虚拟页面是因为 Web 服务器假设 servlet 将生成浏览器要显示的某种 HTML 标记。在本例中,这个 servlet 运行一些 Java 代码以便连接至 DB2 数据库,它不显示任何内容。在 WebSphere 版本 4.0 中必须使用的 flush="true"在以前却是可选的。注:../DBBean 是一个别名,即到实际 servlet 的 URL 映射。为简单起见,我给 servlet 起了一个与它的名称相同的别名。这不是必需的。下面我将解释如何设置它。
既然已编写了这个页面,那么我们将把它包含在我们已运行的应用程序中。还要完成两步。首先,我们需要为 DBBean servlet 编写 servlet 和任何相关的代码。其次,我们需要将这个页面和 servlet 代码添加到 Web 服务器环境。
DBBean servlet
这个应用程序中的所有 servlet 都将是 TestTeam 包的一部分,因此 package 语句将出现在开始部分。紧随其后的是各种 import 语句,以包含所需的所有 Java 部分。然后定义 servlet 类。请注意 destroy方法。好的编码实践是清除您分配的任何资源,而不把它们留给垃圾收集器来处理,因为您永远无法知道那何时发生,并且这样会冒险浪费您系统上的资源。每当调用 TestMain.jsp 时就调用 doGet方法。这应该返回要显示的任何 HTML 标记和文本。正如上面提到的,这个 servlet 不显示任何内容,所以我们不返回任何内容。
图 6 中的 28-30 行定义了这个 servlet 将返回哪种 html 环境。它设置了内容类型,然后是关闭高速缓存的两条语句。通常页面被高速缓存,存储在 web 浏览器上的临时空间中。这可能是内存或磁盘空间。我们关闭高速缓存是因为这些 servlet 包含状态信息,特别是连接对象信息。每次当它显示这个页面时,我们希望确保那个信息是正确的,这样我们就希望获取该信息的一个新副本。通过关闭高速缓存,我们确保每次都检索到一个全新副本。
通过使用由 DB2提供的 jdbc net driver,DBBean servlet 创建了到数据库 TESTSTAT的连接。这个数据库在 机器 vangennip上。通过使用 用户标识 Administrator和 密码 goodday,该 servlet 应该连接到这台机器的 TCPIP 端口 3456上。这个设置显示在 图 6的 33-39 行中。 图 6的 40-46 和 52-58 行设置了数据库连接池,并通过使用 图 6的 33-39 行上的信息完成实际连接。ConnectionPool 类是我在 Web 上找到的由 Sun Microsystems 的 Marty Hall 编写的 Core Servlets and Java Server Pages一书的示例。为了方便和符合我的风格,我对它稍微做了一点修改。在参考资料中列出了到这个网站的链接。我将不描述连接池,也不显示它的源代码。在 Web 上和源代码中描述了它。我在 .zip 文件中包含了我的版本。要记住的重要一点是任意数目的用户可以同时连接到一个 Web 上。每个用户需要一个数据库连接。根据连接的用户数,您可能需要提高 maxConnections(),它目前返回 50。
图 6接近底部的 47-50 行是有趣的一节。它是一个出错通知示例。这里处理了两种类型。第一条语句将出错信息写到 System.err.println,即对 C 程序员来说是 stderr 。WAS 将 stderr 重定向到 <install-path>/appserver/logs 目录中的文件 adminserver_stderr.log。类似地,stdout 被重定向到 adminserver_stdout.log。第二条语句将完全相同的错误文本记录到 Web 服务器,然后把它记录到一个文件。在测试时把信息写到当前正在显示的 html 页面时,我使用第三种方法。在这种方式下,我可以立即轻易地看到正在发生什么,看到我自己特定的文本而不需要搜索日志。以后我将演示它的示例。
注:我使用的 ConnectionPool 类是我找到的第一个类。在那之后,我知道 WebSphere 和 DB2 都提供了它们自己的连接合用实现。我没有查看每种机制,所以我不评论在不同环境中哪个最好或者甚至哪个更好。这留给读者作为练习。
关于作者
Ed Van Gennip 是 IBM 多伦多实验室负责 DB2 UDB Solutions Development Service 团队的经理。他在诸如 CODE/400、CODE/370、VisualAge for C++、VisualAge for Java、Lotus Notes 样本开发以及对象级别跟踪(Object Level Trace(OLT))工具那样的产品方面拥有 13 年的开发以及团队领导经验。在担任当前职务之前,他是分布式调试器(Distributed Debugger)和 OLT 测试团队的经理,该产品是许多产品(包括 WebSphere 套件)的重要组件。可以通过 vagennip@ca.ibm.com与他联系。 |
|