技术开发 频道

为DB2编写基于Web的表编辑器 GUI

    【IT168 技术文档】您希望您的电子商务能够全天候(每天 24 小时,每周 7 天)运行,因为这对企业非常有利。然而,这对于那些使电子商务运行起来的人来说,可就不大妙了。在本文的 前一篇文章 中,我们为您提供了一个基于 Java™ Swing 的应用程序,IBM® DB2® Universal Database™ 的用户可用这个应用程序在数据库中添加、修改和删除数据记录。然而,事实上很多时候您可能身处远离数据库的异地,但仍然需要能够对企业数据执行这样的一些操作。那么,为什么不利用万维网呢?

    在本文中,我们将为您提供一个完备的 Web 应用程序,我们称之为 DB2 webSQL,这个应用程序允许通过 HTTP 访问 DB2 V8 数据。要使用这里的代码,需要确保有一个能够处理 JSP 和 Servlet 的 Web 应用程序服务器正在运行。我们是针对 WebSphere® Application Server来开发代码的。但是,我们的设计不用做太多的修改就应该能够在其他的 Web 应用程序服务器上工作。

    至于开发环境,我们使用 WebSphere Studio Application Developer4.0。内建的 WebSphere V4.0 测试环境让我们可以找出程序中的纽结(kink)。WebSphere Studio Application Developer 让我们可以使用一种遵从 J2EE 规范的方法无缝地构建应用程序。

    在本文中,我们通过 DB2 V8 的 Type 4 JDBC Universal 驱动程序来使我们的项目得以实现。这种驱动程序是针对 DB2 V8 的一种新驱动程序,它提供了以下特性:

    可更新的 ResultSet 支持。
    改进的 DB2 认证(authentication)安全。
    改进的 Java SQL 错误消息。
    程序化(programmatic)的跟踪功能。

    注意,要使用 JDBC Universal 驱动程序,必须将 db2jcc.jar 文件包括到 Java CLASSPATH 环境变量中。当查看代码时您将注意到,在使用 Type 4 驱动程序的过程当中,您可能已经习惯的 JDBC 语法又变了不少。

    我们之所以对使用这种新驱动程序如此热心,是因为我们希望使用可更新的 ResultSet 支持。您可以在 http://www.ibm.com/developerworks/cn/dmdd/library/techarticles/0209hutchison/index.shtml一文中阅读更多有关 Type 4 JDBC 驱动程序和 DB2 V8 提供的新特性的信息。

    先决条件

    在编写本文时,我们假设您对以下技术有比较系统的理解:

    Java Servlets
    Java Server Pages (JSPs)
    JDBC

    能移动游标,能对结果集进行更新,这正是 JDBC 2.0 API 带来的强大功能的一部分。您可能需要通过阅读 http://java.sun.com/docs/books/tutorial/jdbc/jdbc2dot0/index.html来熟悉相关语法。

    为了安装应用程序,我们建议采用以下先决条件:

    客户端:Internet Explorer Browser 4.0 或更高版本。
    服务器端:
    一个运行有 JRE 1.3 的 Java Servlet 引擎。JRE 1.3 支持 JSP 1.0 规范或更高版本,并且支持 Java Servlet 2.2 规范 或更高版本。
    DB2 Version 8。

    该应用程序是以一个 WAR 文件的形式发布的。

    在 Windows NT® 下的 WebSphere Application Server 4.0 中安装应用程序

    下载 WAR 文件。

    定位到 Start>Programs>IBM WebSphere> WebSphere Admin Server 4.0> Start Admin Sever,打开 Admin Console。
    使用 Install 向导将 Enterprise Application 部署为一个独立的(stand-alone)Web 应用程序。
    选择下载的 WAR 文件,为该应用程序选择一个上下文环境(例如 DB2WebSQL)。
    向导将请求您选择一个虚拟主机(选择 default_host)和应用程序服务器(选择缺省的应用程序服务器)。
    向导将询问与 EJB 部署描述符相关的各种问题。忽略这些问题,连续单击 Next,直到向导的最后一页。单击 Finish。
    安装完毕之后,您将收到一条消息,表明应用程序已经安装成功。
    在 Admin Console 中的 Enterprise Applications 下您将看到安装好的应用程序。右键单击该应用程序,启动应用程序。
    在节点上单击右键,重新为该节点生成插件(plug-in)。
    可以使用下面的 URL 来访问该应用程序: http:// yourservername/application_context_name/login.html。

    DB2 webSQL 的架构

    图 1. WebSQL 架构

    DB2 webSQL 应用程序是基于 Model-View-Controller(MVC)模式的。在 MVC 模式中:

    模型(Model)代表企业数据。
    视图(View)呈现模型的内容。
    控制器(Controller)将与视图的交互转换成由模型执行的动作。

    在我们的应用程序中,模型是驻留在 DB2 数据库中的数据,我们正想通过 HTTP 访问这些数据。视图由一些 JSP(也就是 choosetable.jsp 、 dberror.jsp 和 manipulatetable.jsp )组成,这些 JSP 是由客户机上的 Web 浏览器显示的。最后,控制器由两个 servlet( AuthenticateServlet.java 和 DBManipulateServlet.java )组成,这两个 servlet 执行请求并将结果发送到适当的视图(也就是 JSP)。

    通过将 MVC 模式应用到 DB2 webSQL 应用程序,我们将表示逻辑和控制逻辑与数据分离开来。用这种方式开发的 Web 应用程序具有如下优点:

    减少了更改的影响。
    增加了可维护性。
    客户机独立。

    此外,这种 MVC 架构允许在应用程序的开发过程中清晰地划分开发人员角色。在我们的应用程序中,表示逻辑(即 JSP 页面)与数据访问和业务逻辑(即两个 servlet 以及它们的助手类)是分开的。为什么这么做有利呢?因为这种清晰的分离让您可以更改应用程序的外观和感觉(look and feel);这种更改比起将所有代码都紧紧混合在一起的情况下的更改要轻松得多。

    在 http://www.redbooks.ibm.com/abstracts/sg246585.html上提供的 IBM 红皮书 WebSphere Studio Application Developer Programming Guide, SG24-6585-00 中就有一章介绍使用 WebSphere Studio Application Developer 以 MVC 模式进行开发,内容相当精彩。

    应用程序概述

    就像基于 Swing 的 同类应用程序 一样,DB2 webSQL 允许通过一个 Web 浏览器完成四件与 IBM DB2 数据库相关的事情:

    查看一个表。
    添加一行到一个表中。
    从一个表中删除一行。
    更新一个表。

    进一步研究应用程序

    webSQL 应用程序允许查看和更改数据库中的表。为了防止对数据库的未授权访问,您必须通过登录来使自己可以合法地访问数据库。 图 2是登录屏幕,当用户首次访问应用程序时就会看到这个屏幕。登录页面的代码是静态的 HTML,存放在 login.html 中。

    图 2. 登录进入 WebSQL

    该页面要求用户在登录表单中输入每一个域,但不需要输入模式。如果您是在自己的机器上使用该应用程序,机器上也有 DB2、Web 应用程序服务器和客户机,那么这里服务器应填“localhost”。而且,如果您使用了缺省的安装选项,那么端口就是 50000。

    当您在登录屏幕上输入了所需的信息并单击 Submit 时,该请求就被发送到 AuthenticateServlet。这个 servlet 接收在登录时输入的信息并验证您是否具有访问数据库的许可。查看一下 AuthenticationServlet.java 的代码。在代码中您将注意到,这里实例化了一个“DBInfo”对象。正是通过这个对象我们才得以建立自己的数据库,才能够收集关于数据库数据的信息(例如,表名、列名,等等)。如果您得到了授权,就会进入下一个屏幕(见 图 3),这个屏幕是由 choosetable.jsp 呈现的,通过这个屏幕可以从一个列表中选择要访问的表。如果您在登录时未得到授权,那么将看到 error.jsp 页面。

    图 3. 选择要编辑的表

    为了收集表名列表,应用程序调用 DBInfo 的 getTables 方法。getTables 方法通过查询 DB2 编目表 sysibm.tables 来收集这些表名。

    登录成功之后,您就可以查看和更改 DB2 数据库的内容了。所有这些请求都由 DBManipulateServlet.java 这个 servlet 来处理。

    DBManipuateServlet servlet 是一个控制器 servlet,负责处理对在一个表中插入一行、删除一行和更新一行这些操作的请求。它使用一个助手类 DBHandler 来做一些低级的工作。DBHandler 类最重要的部分是 executeSQL() 方法,该方法将执行请求来修改 DB2 数据。

    通过查看 executeSQL() 方法的代码我们可以发现,这里使用了一个可滚动的(scrollable) ResultSet 对象。通过使用 JDBC 2.0 API 函数,我们可以在需要的时候将游标移到一个特定的行。我们也可以使 ResultSet 对象成为可更新的,以便于更改我们的行数据。

    查看表数据

    为了查看特定表的内容,从 Table Chooser 下拉列表中选择一个特定的表,然后单击 Change Table(见 图 3),这将显示出一个如 图 4所示的屏幕。

    该屏幕显示表的内容,同时还包括一个名为 Current Function 的下拉列表,通过这个下拉列表您可以更改表中的数据。这个页面是由 manipulatetable.jsp 呈现的。在查看这个 JSP 的代码时请注意,它包含了大量嵌入在 Java Server Page scriptlet 中的 JavaScript。代码中有很多换码符(escape character),这是为了便于容纳 JSP 中嵌入的 JavaScript,即 scriptlet 代码。这里嵌入 JavaScript 是有必要的,因为这样可以呈现用于控制 Add 和 Update 功能的弹出窗口。

    关于该代码的一个重要方面是,我们如何确立要传递给 DBManipulateServlet 的参数。实际上,我们无法预先知道一个未确定的表中有些什么样的列。因此,我们要动态地创建这些表单变量。通过使用 DBInfo 的 getColumns 方法,我们可以根据计划使用请求变量的方式而在列名中缀上 “pre” 或 “post”。为了更好地理解 manipulatetable.jsp 的工作,我们建议您查看一下由该 JSP 为一个给定的表生成的 HTML 代码,并将其与 manipulatetable.jsp 的代码相比较。这样您将更加了解在页面装载时,该页面是如何动态地生成用于显示不同表和列的代码的。

    图 4. 选择一个功能

    添加一行

    为了添加一行,需从 Current Function 下拉列表中选择 Add Row。这时将显示一个新的 JavaScript 弹出窗口,通过这个窗口可以插入一个新行( 图 5)。

    图 5. 将一个新行插入到表中

    您可以在第二列中输入新行所需的一些值,然后单击 Add Row 以便将更改应用到数据库中。刚才添加的那一行将在 GUI 中反映出来( 图 6)。

    图 6. 新插入的行显示在屏幕上

    删除一行

    为了删除一行,需从 Current Function 下拉列表中选择 Delete Row,然后在您想删除的行上单击左键,高亮显示这一行。注意,这个版本的代码没有包含 “Are you sure” 消息,所以如果您需要这条消息的话,就要自己添加。

    图 7. 删除一行

    更新一行

    为了更新已有的一行,需从 Current Function 下拉列表中选择 Modify Row,然后在您想更新的那一行上单击左键,高亮显示这一行。这时将弹出一个对话框,通过这个对话框您可以更改列值,如 图 8所示。

    图 8. 更新一行

    为您想更新的列输入新值,然后单击 Modify Row以便将更新应用到数据库。同样,这里也没有 “Are you sure?” 消息。刚才更新过的行将在 GUI 中反映出来,如 图 9所示。

    图 9. 更新一行

    同步问题

    就像在前一篇文章中提到的基于 Swing 的同族兄弟一样,这里介绍的基于 Web 的应用程序不是实时的。应用程序先从 DB2 表中收集数据,然后由 Web 用户来操作这些数据。当 Web 用户对数据进行操作时,很可能其他用户或进程也在操作后端。这样当然会出现一些使用户迷惑不解的异常。这里我们采用了一种非常笨的方法,那就是在数据库操作期间,只有一个用户在操作数据库。

    性能问题

    这个应用程序考虑到您将操作的表规模较小。当使用该应用程序时您将注意到,每当执行一次事务时,表数据都是从数据库传递到 Web 服务器的。如果表中有很多行,或者每一行有很多列,上述做法就会消耗大量的网络和计算机资源。如果能够使用分页(pagination)技术将从数据库中提取出来的数据拆散,那么该应用程序在性能方面就可以让人满意了。通过使用 DB2 Version 8 提供的 JDBC 2.0 API 可以实现分页。

    结束语

    本文介绍的基于 Web 的应用程序允许用户远程操作 DB2 数据。当您需要随地访问数据时,这一功能就很有价值。通过使用 MVC 架构,我们使得向应用程序添加新功能非常容易。DBC Version 8 中的 Type 4 JDBC Universal 驱动程序提供了使我们的项目得以实现的 API。当然,每一家企业都有其自身的特定需求。因此,我们提供了 DB2 webSQL 的代码,以便您自己能够加以扩展和修改。

    应用程序概述

    就像基于 Swing 的 同类应用程序 一样,DB2 webSQL 允许通过一个 Web 浏览器完成四件与 IBM DB2 数据库相关的事情:

    查看一个表。
    添加一行到一个表中。
    从一个表中删除一行。
    更新一个表。

    进一步研究应用程序

    webSQL 应用程序允许查看和更改数据库中的表。为了防止对数据库的未授权访问,您必须通过登录来使自己可以合法地访问数据库。 图 2是登录屏幕,当用户首次访问应用程序时就会看到这个屏幕。登录页面的代码是静态的 HTML,存放在 login.html 中。

    图 2. 登录进入 WebSQL

    该页面要求用户在登录表单中输入每一个域,但不需要输入模式。如果您是在自己的机器上使用该应用程序,机器上也有 DB2、Web 应用程序服务器和客户机,那么这里服务器应填“localhost”。而且,如果您使用了缺省的安装选项,那么端口就是 50000。

    当您在登录屏幕上输入了所需的信息并单击 Submit 时,该请求就被发送到 AuthenticateServlet。这个 servlet 接收在登录时输入的信息并验证您是否具有访问数据库的许可。查看一下 AuthenticationServlet.java 的代码。在代码中您将注意到,这里实例化了一个“DBInfo”对象。正是通过这个对象我们才得以建立自己的数据库,才能够收集关于数据库数据的信息(例如,表名、列名,等等)。如果您得到了授权,就会进入下一个屏幕(见 图 3),这个屏幕是由 choosetable.jsp 呈现的,通过这个屏幕可以从一个列表中选择要访问的表。如果您在登录时未得到授权,那么将看到 error.jsp 页面。

    图 3. 选择要编辑的表

    为了收集表名列表,应用程序调用 DBInfo 的 getTables 方法。getTables 方法通过查询 DB2 编目表 sysibm.tables 来收集这些表名。

    登录成功之后,您就可以查看和更改 DB2 数据库的内容了。所有这些请求都由 DBManipulateServlet.java 这个 servlet 来处理。

    DBManipuateServlet servlet 是一个控制器 servlet,负责处理对在一个表中插入一行、删除一行和更新一行这些操作的请求。它使用一个助手类 DBHandler 来做一些低级的工作。DBHandler 类最重要的部分是 executeSQL() 方法,该方法将执行请求来修改 DB2 数据。

    通过查看 executeSQL() 方法的代码我们可以发现,这里使用了一个可滚动的(scrollable) ResultSet 对象。通过使用 JDBC 2.0 API 函数,我们可以在需要的时候将游标移到一个特定的行。我们也可以使 ResultSet 对象成为可更新的,以便于更改我们的行数据。

    查看表数据

    为了查看特定表的内容,从 Table Chooser 下拉列表中选择一个特定的表,然后单击 Change Table(见 图 3),这将显示出一个如 图 4所示的屏幕。

    该屏幕显示表的内容,同时还包括一个名为 Current Function 的下拉列表,通过这个下拉列表您可以更改表中的数据。这个页面是由 manipulatetable.jsp 呈现的。在查看这个 JSP 的代码时请注意,它包含了大量嵌入在 Java Server Page scriptlet 中的 JavaScript。代码中有很多换码符(escape character),这是为了便于容纳 JSP 中嵌入的 JavaScript,即 scriptlet 代码。这里嵌入 JavaScript 是有必要的,因为这样可以呈现用于控制 Add 和 Update 功能的弹出窗口。

    关于该代码的一个重要方面是,我们如何确立要传递给 DBManipulateServlet 的参数。实际上,我们无法预先知道一个未确定的表中有些什么样的列。因此,我们要动态地创建这些表单变量。通过使用 DBInfo 的 getColumns 方法,我们可以根据计划使用请求变量的方式而在列名中缀上 “pre” 或 “post”。为了更好地理解 manipulatetable.jsp 的工作,我们建议您查看一下由该 JSP 为一个给定的表生成的 HTML 代码,并将其与 manipulatetable.jsp 的代码相比较。这样您将更加了解在页面装载时,该页面是如何动态地生成用于显示不同表和列的代码的。

    图 4. 选择一个功能

    添加一行

    为了添加一行,需从 Current Function 下拉列表中选择 Add Row。这时将显示一个新的 JavaScript 弹出窗口,通过这个窗口可以插入一个新行( 图 5)。

    图 5. 将一个新行插入到表中

    您可以在第二列中输入新行所需的一些值,然后单击 Add Row 以便将更改应用到数据库中。刚才添加的那一行将在 GUI 中反映出来( 图 6)。

    图 6. 新插入的行显示在屏幕上

    删除一行

    为了删除一行,需从 Current Function 下拉列表中选择 Delete Row,然后在您想删除的行上单击左键,高亮显示这一行。注意,这个版本的代码没有包含 “Are you sure” 消息,所以如果您需要这条消息的话,就要自己添加。

    图 7. 删除一行

    更新一行

    为了更新已有的一行,需从 Current Function 下拉列表中选择 Modify Row,然后在您想更新的那一行上单击左键,高亮显示这一行。这时将弹出一个对话框,通过这个对话框您可以更改列值,如 图 8所示。

    图 8. 更新一行

    为您想更新的列输入新值,然后单击 Modify Row以便将更新应用到数据库。同样,这里也没有 “Are you sure?” 消息。刚才更新过的行将在 GUI 中反映出来,如 图 9所示。

    图 9. 更新一行

    同步问题

    就像在前一篇文章中提到的基于 Swing 的同族兄弟一样,这里介绍的基于 Web 的应用程序不是实时的。应用程序先从 DB2 表中收集数据,然后由 Web 用户来操作这些数据。当 Web 用户对数据进行操作时,很可能其他用户或进程也在操作后端。这样当然会出现一些使用户迷惑不解的异常。这里我们采用了一种非常笨的方法,那就是在数据库操作期间,只有一个用户在操作数据库。

    性能问题

    这个应用程序考虑到您将操作的表规模较小。当使用该应用程序时您将注意到,每当执行一次事务时,表数据都是从数据库传递到 Web 服务器的。如果表中有很多行,或者每一行有很多列,上述做法就会消耗大量的网络和计算机资源。如果能够使用分页(pagination)技术将从数据库中提取出来的数据拆散,那么该应用程序在性能方面就可以让人满意了。通过使用 DB2 Version 8 提供的 JDBC 2.0 API 可以实现分页。

    结束语

    本文介绍的基于 Web 的应用程序允许用户远程操作 DB2 数据。当您需要随地访问数据时,这一功能就很有价值。通过使用 MVC 架构,我们使得向应用程序添加新功能非常容易。DBC Version 8 中的 Type 4 JDBC Universal 驱动程序提供了使我们的项目得以实现的 API。当然,每一家企业都有其自身的特定需求。因此,我们提供了 DB2 webSQL 的代码,以便您自己能够加以扩展和修改。

0
相关文章