访问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类的内容。