Tomcat 5 servlet/JSP 容器 JNDI 资源使用说明 (一)
这一段时间想做一下JNDI应用,走了不少弯路 T_T
希望大家在学习的时候可以先看一下标准文档,为了大家看的方便一此,特此译了一些比较重要的文字,请指正 :)
Introduction 介绍
Tomcat5提供了一个JNDI InitialContext(首要上下文)实现的实例供web应用程序在它之上运行,它的风格和其它J2EE应用服务器是一致的。他的登记是在$CATALINA_HOME/conf/server.xml 文件里,部署文件(/WEB-INF/web.xml)的配置请参考以下的元素:
<env-entry> - 环境进入, 单值参数,它用来指定应用怎么样被操作.
<resource-ref> - 资源参考, 典型的应用是指向一个对象的工厂,比如一个JDBC数据源, 一个JavaMail会话, 或者一个被配置进tomcat 5 的自定义对象的工厂.
<resource-env-ref> - 资源环境参考, 这是一个Servlet2.4中新加的变量。它更简单地配置了不需要验证信息的资源。
首要上下文的配置是被做为一个web应用首先部署的,它可以被web应用的组件所访问(只读)。所有的配置登记和资源将会被放置于java:comp/env下,它是JNDI命名空间的一部分,如此,一个典型的访问资源(在这个例子中,是一个对JDBC数据源的访问)方法如下:
// Obtain our environment naming context
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// Look up our data source
DataSource ds = (DataSource)
envCtx.lookup("jdbc/EmployeeDB");
// Allocate and use a connection from the pool
Connection conn = ds.getConnection();
... use this connection to access the database ...
conn.close();
See the following Specifications for more information about programming APIs for JNDI, and for the features supported by Java2 Enterprise Edition (J2EE) servers, which Tomcat emulates for the services that it provides:
请参见以下关于JNDI的APIs详细信息,tomcat提供的J2EE指定的服务器特性如下:
Java Naming and Directory Interface (included in JDK 1.4, available separately for prior JDK versions)
J2EE Platform Specification (in particular, see Chapter 5 on Naming)
Configuring JNDI Resources 配置JNDI资源
每一个可用的JDNI资源的配制都在$CATALINA_HOME/conf/server.xml中定义,所用到的元素如下:
<Environment> - 为环境登记配置名称及数值,它将被通过JNDI首要上下文暴露于web应用程序(等同于在web布署器中包含的<env-entry>).
<Resource> - 为可用的资源配置名称及数据类型 (等同于在web布署器中包含的<resource-ref>).
<ResourceParams> - 配置资源工厂用到的java类, 比如JavaBeans的属性值.
<ResourceLink> - 在全局JDNI上下文中添加一个资源链接.
所有这些元素都放置于<Context>元素或<DefaultContext>元素内.
另外,所有的布署器(/WEB-INF/web.xml)中包含的<env-entry>元素都被配置进了首要上下文!仅当conf/server.xml里的<Environment> 元素被允许重载时,conf/server.xml和/WEB-INF/web.xml相一致的内容才被重载。
Tomcat Standard Resource Factories
Tomcat5为我们的web应用提供了几个标准的资源工厂,但是却不通过修改应用布署器给了您更大的弹性(在 $CATALINA_HOME/conf/server.xml 中).以下的几个小节都应用了标准资源工厂。
如果您想知道更多的关于建立,安装,配置,使用自定义资源工厂,请见Adding Custom Resource Factories。
注意:对于标准资源工厂,只有"JDBC Data Source"和"User Transaction"才能在其它的平台上使用,并且它们只是在平台实现了J2EE时才需要。所有其它的标准资源工厂,以及你自定义的工厂,都只能在 TOMCAT中使用,而不能被其它平台接受。
一般JavaBean资源
0.介绍
这个资源工厂用来建立任何一个符合标准JavaBeans命名规范的java类。它有一个零参数的 constructor,还有一些类似于setFoo()命名的property setters。当lookup()被使用时,这个工厂每次都会建立一个bean的实例。
使用此工厂的例子如下:
1.建立一个javabean类
建立一个资源工厂可以实现的类。这个例子,建议你用com.mycompany.MyBean类,它应该象下面这样:
package com.mycompany;
public class MyBean {
private String foo = "Default Foo";
public String getFoo() {
return (this.foo);
}
public void setFoo(String foo) {
this.foo = foo;
}
private int bar = 0;
public int getBar() {
return (this.bar);
}
public void setBar(int bar) {
this.bar = bar;
}
}
2.定义你需要的资源
下面,修改你的应用布署器(/WEB-INF/web.xml)来声名JNDI名称,最简单的方法是用<resource -env-ref>元素,象这样:
<resource-env-ref>
<description>
Object factory for MyBean instances.
</description>
<resource-env-ref-name>
bean/MyBeanFactory
</resource-env-ref-name>
<resource-env-ref-type>
com.mycompany.MyBean
</resource-env-ref-type>
</resource-env-ref>
注意:必须遵守应用布署器所需要的DTD定义的元素规则。详情见 Servlet Specification
3.编写应用此资源的应用。
一个典型的应用此资源的参考如下:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
writer.println("foo = " + bean.getFoo() + ", bar = " +
bean.getBar());
4.配置tomcat的资源工厂
配置资源工厂在$CATALINA_HOME/conf/server.xml文件里面要添加元素,在 上下文元素(或默认的上下文元素)里添加。
<Context ...>
...
<Resource name="bean/MyBeanFactory" auth="Container"
type="com.mycompany.MyBean"/>
<ResourceParams name="bean/MyBeanFactory">
<parameter>
<name>factory</name>
<value>org.apache.naming.factory.BeanFactory</value>
</parameter>
<parameter>
<name>bar</name>
<value>23</value>
</parameter>
</ResourceParams>
...
</Context>
注意资源名称必须符合布署器的规定。
在这个例子中,setBar函数必须在类中有定义。
JDBC Data Sources JDBC数据源
0.介绍
很多web应用都需要通过JDBC访问数据库来支持应用所需要的功能。为了实现这一目的,J2EE服务器需要一个数据源的实现(即一个JDBC连接池)。 tomcat5很好的实现了这一要求,所以你基于数据库的应用在其它的J2EE服务器上不需要修改就可以很好地运行。
JDBC相关信息,请参考以下内容:
http://java.sun.com/products/jdbc/ - JDBC的老家.
http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame.html - JDBC 2.1 API 说明.
http://java.sun.com/products/jdbc/jdbc20.stdext.pdf - JDBC 2.0 标准扩展 API (包含 javax.sql.DataSource API). 这个包被称为"JDBC可选包".
http://java.sun.com/j2ee/download.html - J2EE Platform说明 (包含了J2EE必须实现的所有JDBC特性).
1.安装JDBC驱动
要使用JDBC数据源,JNDI资源工厂要求您必须将合适的JDBC驱动放在Tomcat内建类和应用程序中。很方便的实现方法是将驱动放入$CATALINA_HOME/common/lib目录里 :).
2. 定义资源
下面修改你的web应用布署器(/WEB-INF/web.xml),在你将要查找的资源之前定义JNDI名称。约定是这样的:所有的这些名字都被放在JDBC子上下文之下(标准上下文的根目录是 java:comp/env),一个典型的web.xml内容如下:
<resource-ref>
<description>
Resource reference to a factory for java.sql.Connection
instances that may be used for talking to a particular
database that is configured in the server.xml file.
</description>
<res-ref-name>
jdbc/EmployeeDB
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
注意:必须遵守应用布署器所需要的DTD定义的元素规则。详情见 Servlet Specification
3.编写应用此资源的代码
一个典型的应用参考如下:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)
envCtx.lookup("jdbc/EmployeeDB");
Connection conn = ds.getConnection();
... use this connection to access the database ...
conn.close();
注意应用程序使用到的名字是和应用布署器中一致的,它也必须和定义于$CATALINA_HOME/conf/server.xml 里的资源工厂一致,描述如下:
4. 配置tomcat的资源工厂
配置工厂,请在$CATALINA_HOME/conf/server.xml里添加元素,放置于这个web应用的上下文中(或者放在被<Host> 或 < Engine>元素包围的DefaultContext元素中 )
<Context ...>
...
<Resource name="jdbc/EmployeeDB" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/EmployeeDB">
<parameter>
<name>username</name>
<value>dbusername</value>
</parameter>
<parameter>
<name>password</name>
<value>dbpassword</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.hsql.jdbcDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:HypersonicSQL:database</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>8</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>4</value>
</parameter>
</ResourceParams>
...
</Context>
注意资源名称(在这里是jdbc/EmployeeDB)必须要符合web应用布署器的规定。
这个例子采用的是HypersonicSQL数据库JDBC驱动。请修改相应的驱动程序名以及连接URL以符合您所用的数据库。
tomcat标准数据源配置工厂所需要的属性如下:
driverClassName - JDBC 所用到的数据库驱动的类全名.
maxActive - 连接池在同一时刻内所提供的最大活动连接数。
maxIdle - 连接池在空闲时刻保持的最大连接数.
maxWait - 当发生异常时数据库等待的最大毫秒数 (当没有可用的连接时).
password - 连接数据库的密码.
url - 连接至驱动的URL. (为了向后兼容, driverName也被允许.)
user - 数据库用户名.
validationQuery - 这是一个select 的SQL语句,它将被工厂所调用以保证数据库可用。
译:yifi (yifi@tom.com)
出处 jakarta.apache.org