打印本文 打印本文 关闭窗口 关闭窗口
用 Tomcat 和 MySQL 生成动态内容
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1958  更新时间:2009/4/22 20:48:55  文章录入:mintao  责任编辑:mintao
ndler 类连接到数据库更加熟悉。

字段
BannerServlet 使用五个字段:

String _databaseUrl:要访问数据库的名称(jdbc:odbc:\\localhost\BANNER)。

String _driverName:用来与数据库通信的驱动程序的名称。正如上面所描述的那样,我们将使用 MM MySQL JDBC 驱动程序。该驱动程序的名称是 org.gjt.mm.mysql.Driver。

Logger _logger:Logger 类的名称,用此类来记录我们应用程序中发生的所有事件。

HashMap _banners:所有 Banner 对象的 HashMap。用 servlet 的 init() 方法填充该 HashMap。将数据库表中的每一行转换成存储在 HashMap 中的一个 Banner 对象。我们过一会儿将详细说明这一点。

int _totalWeight:所有 Banner 权重之和。该值也是在 init() 方法中设置的;我们将很快讨论这一点。
init()
任何 servlet 的 init(ServletConfig) 方法都在容器首次装入该 servlet 时被调用。在这里,容器就是 Tomcat。Tomcat 生成并传入 ServletConfig 对象,该对象包含容器设置的缺省配置信息以及开发人员(您)在 servlet 的配置文件中可以进行设置的定制配置信息。对于我们的用途,不需要传入任何配置信息,但您有时可能需要扩展 servlet,并使用这一功能。

我们调用 super.init() 之后在 init() 中所做的第一件事是初始化 HashMap 变量 _banners,并将 _totalWeight 设置为 0。然后,连接到数据库,以 ResultSet 的形式从 ADS 表获取所有行。我们使用 for 循环对 ResultSet 进行循环遍历,从每行构造一个 Banner 对象,接着,把 for 循环的索引作为散列值,将 Banner 对象添加到 HashMap。(我们也可以方便地使用 Vector 或其它一些 Collection 类来完成同样的任务。)

现在,内存中有了一个包含所有 Banner 的 HashMap。如果更新数据库,那么只需调用 init() 方法就可重新装入 HashMap。我们将在 increaseImpressions() 和 decreaseClicksRemaining() 方法中用到这一点。

service()
service() 方法是在我们的 BannerServlet 继承的 HttpServlet 类中定义的,可以处理任何请求,不管它是 GET 方法还是 POST 方法。对于 service() 方法的实现有两个核心部分。第一个部分处理 Web 页面发送图像请求时 servlet 的行为,第二部分处理链接请求。

最后,我们看一下从客户机发送来的 type 参数。如果 type 的值是 image,那么我们从数据库获取一个随机的 Banner 对象,将该 Banner 对象添加到用户的会话,同时增加这一给定横幅的已显示次数,并将用户路由至 Banner 对象的图像字段中所引用的图像。

如果 type 的值是 link,那么我们从会话中除去 Banner 对象,减少该横幅的剩余点击次数,并将用户重定向至 Banner 对象的 URL 字段中指定的链接。

其它方法
getRandomBanner()、increaseImpressions() 和 decreaseClicksRemaining() 都是助手方法,从 service 方法中调用它们。getRandomBanner() 使用一个简单的算法从 _banners HashMap 随机地选择一个横幅。increaseImpressions() 和 decreaseClicksRemaining() 使用 DBHandler 连接到数据库并更新给定 Banner 的信息。在这两个方法的结束部分,我们调用 init() 方法将已更新的 Banner 信息重新装入到 HashMap。

结束语
我们已经创建一个应用程序,该应用程序演示了 Apache Tomcat 和 MySQL 相互之间如何通信,并向您提供了一个能为您处理大多数数据库工作的、非常有用的可重用工具。您可以以几种方式来扩展这个应用程序,这些已超出本文的范围。正如我们前面描述的那样,您可以把这个应用程序扩展成一个系统,在这个系统中,您可以根据特定点击次数或者甚至是特定的显示次数向客户收费。可以很容易地用某个其它字段替代数据库中的 CustomerName 字段,这个字段可以是另一个包含所有客户信息的表中的主键。

您可以扩充 DBHandler 类以处理数据库连接合用。此外,可以将希望用于应用程序的查询具体化成文本、特性或 XML 文件,从而允许扩充或更改查询定义而无需编写更多代码。

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口