用Tomcat和MySQL生成动态内容(1)

当因特网开始从教育和政府信息存储器转变成国际商业中心起,横幅广告就已经出现了。滚动横幅是 Web 页面上一块已分配的空间,每次装入或重新装入 Web 页面时,就用该空间内来显示广告 ― 随机显示或基于某些业务逻辑来显示。驱动滚动横幅广告的程序虽然相当

当因特网开始从教育和政府信息存储器转变成国际商业中心起,横幅广告就已经出现了。滚动横幅是 Web 页面上一块已分配的空间,每次装入或重新装入 Web 页面时,就用该空间内来显示广告 ― 随机显示或基于某些业务逻辑来显示。驱动滚动横幅广告的程序虽然相当简单,但却是重要的广告工具。正如它们的同类,如半分钟广播和电视广告一样,这些动态广告工具允许单个 Web 页面显示不同来源的广告,并使不同公司针对相同的观众建立他们产品和服务的品牌效应。

无论您怎么看待 Web 横幅广告(是的,我们都发现它们有时令人讨厌),它们已成为因特网上的一种生活方式。存在这样的事实:Web 的观众由庞大的消费者群体所组成,他们的金钱使电子商务的车轮得以转动。在因特网市场营销的短暂历史中,电子商务所有者已表现出他们愿意花大把的钱在热门站点上做横幅广告。

有些公司(如 doubleclick.net)已经通过担当应用程序服务供应商(ASP),提供诸如跟踪对特定横幅广告的点击之类的服务,从 Web 横幅现象中获利。随后这些 ASP 告诉广告客户他们的 Web 广告活动的有效程度。

当然,象 doubleclick.net 这样的 ASP 是要收费的。如果您和我们一样,那么您不会愿意在能够免费得到服务时还要花钱。稍等一会儿 ― 您可能已经听过世上没有免费的午餐这句话。不过别担心。本文将花费的只是您的时间。事实上,我们将向您演示如何组成一个开放源码(即 免费)环境来建立您自己的功能强大的 Web 横幅跟踪系统。为了完成这一任务,我们挑选的“武器”是 Tomcat、MySQL、一个 Java servlet 和几个助手类。兴奋吗?那么,让我们进行软件安装吧。

安装 Tomcat 和 MySQL
在这一节中,我们将逐步介绍 Tomcat 和 MySQL 的安装。然后,我们将向您介绍如何安装支持这两个应用程序相互通信所需的驱动程序。

安装 Tomcat

下载并安装 Tomcat。对于本文,我们使用了 Tomcat 4.1 Windows 版,它有一个很好的安装软件包,并且会为您创建图标和 Start 菜单文件夹。它还创建一个用于启动和停止 Tomcat 服务器的“Windows 服务(Windows Service)”。安装应该非常简单,但如果您遇到麻烦,请查阅 Tomcat 文档。

安装了 Tomcat 之后,还要完成几个步骤以设置我们的滚动横幅 Web 应用程序。首先,我们将在 [installdir]\webapps 目录下创建一个名为 banner 的子目录。然后在 banner 子目录下,创建标准的 Web 应用程序目录结构:


[installdir]\webapps\banner
[installdir]\webapps\banner\WEB-INF
[installdir]\webapps\banner\WEB-INF\classes
[installdir]\webapps\banner\WEB-INF\lib

接下来,我们将添加指向我们 Web 应用程序的 context。context 只是一个别名,它告诉 Tomcat 在哪里可以访问 Web 应用程序。我们的 context 路径将是 /banner ,它将指向我们刚刚创建的 banner 子目录。在用户输入 http://localhost:8080/banner 后,将转至 webapps 下的顶级 banner 目录。如果他想运行我们的 BannerServlet (将存在于 WEB-INF/classes 目录中),他可以使用 http://localhost:8080/banner/servlet/BannerServlet

要添加 /banner context,首先,我们需要编辑 Tomcat conf 目录中的 server.xml 文件。在接近该文件底部的位置,您会看到几个 context 标记。那里应该有一个用于 /admin 的 context 和一个用于 /examples 的 context。请添加以下 context 标记:




添加了 context 标记之后,重新启动 Tomcat 以使对 server.xml 文件所做的更改生效(在我们的示例中,我们只重新启动 Tomcat 安装的 Windows 服务)。

安装 MySQLs
MySQL 因其价格(免费)而成为一种强有力的数据库,许多公司都使用 MySQL 来处理它们的数据。由于许多公司都想以较低的预算进入 Web 市场,所以使用 MySQL 的公司的数量每天都在增加。开放源码社区已张开双臂欢迎 MySQL。有关这个功能强大的数据库的文档十分丰富,而且同时有 Linux 和 Windows 版本。

下载并安装 MySQL,采用“Typical”安装选项进行安装(对于本文,我们假定您使用 MySQL 的 WinNT 版本)。完成安装后,您将注意到 MySQL 一个恼人的方面:它没有在 Start 菜单中放入任何东西。您需要到数据库的安装目录(缺省情况下是 c:\mysql\ )下,然后转至 bin 目录,在那里您会找到运行 MySQL 的可执行文件。

首先,双击 winmysqladmin.exe 文件。首次打开该文件时,会要求您输入用户名和密码。接下来,在任务栏中出现的红绿灯图标上单击鼠标右键。转至 WinNT 并选择“Start the service”以使 MySQL 在后台运行。最后,双击“mysql.exe”图标以启动“MySQL Monitor”,您将在此使用 MySQL。

使 MySQL 和 Tomcat 共同工作
使 MySQL 和 Tomcat 相互通信可能有些困难。然而,通过使用 JDBC API,我们将能够相对容易地从 Java 类使用 SQL 与 MySQL 数据库通信。

我们将使用 MM MySQL JDBC 驱动程序(一个开放源码驱动程序),使 MySQL 和 Tomcat 之间的通信变得容易。(在撰写本文时,2.0.14 是其最新版本。)

遗憾的是,安装该驱动程序略微有些麻烦。首先,要从 这里下载该驱动程序的合适的 JAR 文件。我们下载了名为 mm.mysql-2.0.14-you-must-unjar-me.jar 的文件。接下来,将文件解压缩(unjar 或 unzip)至一个临时目录。最后,将包含驱动程序的文件从解压缩的目录结构复制到 WEBAPPS/BANNER/WEB-INF/lib 目录中,然后重新启动 Tomcat。在我们下载的驱动程序版本中,文件的名称是 mm.mysql-2.0.14-bin.jar

我们本可以使用 JDBC/ODBC 桥驱动程序与 MySQL 通信,但我们认为本机驱动程序在性能上有更大优势(尽管我们没有运行任何基准测试程序来证实我们的假设)。对于这个应用程序,在性能上它可能不会有很大区别,但我们决定演示如何使用本机 JDBC 驱动程序,以便您不必在设计较大的应用程序时才去了解它。

滚动横幅应用程序
既然我们已经安装了所有的软件,就让我们来看一下这个应用程序能够做什么以及我们是如何组织其架构和开发它的。

实质上,您可以使用我们的横幅 servlet 执行两个操作。首先,您可以用它查看 Web 页面上的随机横幅图像,每次装入包含横幅广告的 Web 页面时,该随机横幅图像就会出现。其次,您可以点击横幅图像,这将使您转至与装入的这个图像对应的链接。

按照 HTML,其代码类似于:






如果希望装入随机图像,那么显然图像标记不能指向静态图像文件,因此我们将指示它运行 servlet,本例中将调用 BannerServlet。我们将使用 HTTP GET 方法参数来指示 servlet 为我们提供图像。因此,图像标记类似于:



该标记调用 servlet 并传入参数键值对 type=image 。servlet 的 service() 方法会解释该请求,然后向浏览器返回随机图像。当然,servlet 必须以某种方式记住将哪个图像发送给了客户机,这样当客户机点击该图像时,它就知道应链接至何处。我们会把与发送的图像相关的元数据存储在客户机的会话上,这样,当用户点击图像时,将从他的会话装入元数据,并重新导向至适当的 URL。

链接标记看起来几乎与图像标记相同:





当用 type=link 键值对调用 servlet 时,servlet 抓取横幅的元数据并将用户重新路由至适当的 URL。

代码和 CLASSPATH 设置
为了使用与本文一起提供的代码,您必须首先解压缩这个 zip 文件(在 参考资料中),然后用命令行 javac 编译器或您喜欢的 IDE 编译这个 .java 文件。要编译该代码,请设置 CLASSPATH 以包含这两个 JAR 文件。

  • mm.mySQL-2.0.14-bin.jar (或从 MM MySQL 网站获取的其它任何版本)
  • servlet.jar (如果它没有和您使用的 JDK 打包在一起)

将已编译的 .class 文件复制到先前创建的 [tomcat_installdir]\webapps\banner\WEB-INF\classes 目录中。必须将作为示例提供的图像文件和 .htm 文件放入 [tomcat_installdir]\webapps\banner 目录。

数据库设置
我们应用程序的数据库部分只是用来持久存储系统中每个横幅的元数据。换句话说,我们实际上并不在数据库中存储图像文件,而只是存储指向每个图像文件的引用。在我们的数据库中,我们将使用七个列来描述每个横幅广告。

表 1 中的描述说明了每条记录将包含的内容。我们实际上将在应用程序中只使用这七个数据库列中的五个。我们的版本中没有使用 CustomerNameNumberOfClicksPurchased ,但我们把它们作为占位符放置在这里以用于扩展。您可以很容易地扩展这个应用程序,并把它用于现实的商业应用程序,其中客户为每个横幅的点击次数付款。

表 1. 数据库字段

字段名称 描述 示例
ImageFile 对横幅图像物理位置的引用 /images/sitea.gif
URL 站点用户点击横幅之后,应重新路由他们的目标 URL http://www.sitea.com
CustomerName 购买横幅的客户名称 John Doe
NumberOfClicksPurchased 用户购买的点击次数 140
NumberOfClicksRemaining 客户剩余的点击次数 139
NumberOfImpressions 横幅已被显示的次数 23
BannerWeight 正在显示的这一横幅的权重 10

当然,在现实环境中,您会有一个以上的站点横幅。根据您的横幅“赞助商”支付的金额与其他赞助商的比较,您可能希望较多地或较少地显示他的横幅。 BannerWeight 字段将被用来实现这一功能。我们已经实现了一个非常简单的加权系统,每个要显示的横幅所具有的百分比概率为:


(BannerWeight / Sum of all BannerWeights) * 100

将刚才所说的内容转换成 SQL,您可以使用 MySQL Monitor 输入以下语句:


mysql> create database BANNER;

要连接到数据库,您可以输入:


mysql> use BANNER;