Tomcat教程

访问JNDI与JDBC的资源

许多Web应用程序需要去访问关系型数据库。为了使Web应用程序便于适应不同环境的 移植(portable,或安装),J2EE规范要求在Web应用程序的WEB-INF/web.xml文件中包含独立于数椐库(database-independent)的描述,并允许容器开发者提供与数据库 相关的细节,Tomcat开发者自然会选择将此放在server.xml文件中,然后,JNDI (Java Naming and Directory Interface, Java命名和目录接口)则用来夺找数据库源及其他资 源。与通过JNDI来访问时,这些资濂则被称为“范围” (context)。

JDBC DataSource

您大概知道Web应用程序是否需要JDBC数据源(DataSource)。如果不确定,请査看该 应用程序的web.xml文件,并搜索如下内容:

<resource-ref>
<description>
The database DataSource for the Acme web application.
<description>
<res-ref-name>jdbc/JabaDotDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
/resource-ref>

下面是一种备选方法,如果有Java源程序代码,则可以査找类似子下面的内容:

Context ctx=new InitialContext();
DataSource ds = (DataSource)
ctx.lookup("java:comp/env/jdbc/JabaDotDB");

Connection conn = ds.getConnection();
...Java code that accesses the database ...
conn.close();

如果您不熟悉在Java中使用JNDI的方法,那么笔者可以告诉你DataSource是能按需送出 JDBC Connection对象的对象,而且通常来自一个预先分配好的连接池。

在上述两个程序片段中,资源宇符串jdbc/JabaDotDB表示在Web应用程序的Context容器 元素中需要配置引用的具体内容,请找到Web应用程序的Context元素,并插入类似于示 例2-12所示的Resource元素。

示例2-12: DataSource Web应用程序范围中的Resource元素

<!--配置用户数据库的JDBC DataSource-->
<Resouice name="jdbc/JabaDotDB"
             type="javax.sql.DataSource" 
             auth="Container" 
             user="ian"
             password="top_secret stuff" 
             driverClassName="org.postgresql.Driver" 
             ur="jdbc: postgresql: iabadot" 
             maxActive="8"
             maxIdle="4"/>

其他JNDI资源

Tomcat允许您使用其建立的JNDI context,查找可通过JNDI的所有资源。如果被查询的 Java类符合标准的"JavaBeans惯例"(至少它必须是含有不带参数的构造函数的公共类,而且必须使用setXXX()/geXXX()的样式),则可以使用Tomcat提供的BeanFactory 类。否则,就必须编写某些Java程序来创建factory类。

笔者在此处会设定BeanFactory,以返回java.util.Calendar对象实例。首先,将这些内容加入web.xml中:

<!--
如何按溶取得Calendar(实际代码只需调用Calendar get Instance);
笔者只是为了方便才选择Calendar。
-->
<resource-env-ref>
<description>
Fake up a Factory for Calendar objects 
</description>
<resource-env-ref-name>
bean/CalendarFactory 
</resource-env-ref-name>
<resource-env-ref-type>
java.util.GregorianCalendar 
</resource-env-ref-type>
</resource-env-ref>

然后,在server.xml中加入下列内容:

<!--设定Calendar factory类-->

因为本书的主要对象并非Java开发者,笔者并未包括定制factory类的内容。

关注微信获取最新动态