这一段时间想做一下JNDI应用,走了不少弯路 T_T
希望大家在学习的时候可以先看一下标准文档,为了大家看的方便一此,特此译了一些比较重要的文字,请指正 :)
Introduction 介绍
Tomcat5提供了一个JNDI InitialContext(首要上下文)实现的实例供web应用程序在它之上运行,它的风格和其它J2EE应用服务器是一致的。他的登记是在$CATALINA_HOME/conf/server.xml 文件里,部署文件(/WEB-INF/web.xml)的配置请参考以下的元素:
首要上下文的配置是被做为一个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指定的服务器特性如下:
每一个可用的JDNI资源的配制都在$CATALINA_HOME/conf/server.xml中定义,所用到的元素如下:
<Environment> - 为环境登记配置名称及数值,它将被通过JNDI首要上下文暴露于web应用程序(等同于在web布署器中包含的<env-entry>). <Resource> - 为可用的资源配置名称及数据类型 (等同于在web布署器中包含的<resource-ref>). <ResourceParams> - 配置资源工厂用到的java类, 比如JavaBeans的属性值. <ResourceLink> - 在全局JDNI上下文中添加一个资源链接. 所有这些元素都放置于<Context>元素或<DefaultContext>元素内.Tomcat5为我们的web应用提供了几个标准的资源工厂,但是却不通过修改应用布署器给了您更大的弹性(在 $CATALINA_HOME/conf/server.xml 中).以下的几个小节都应用了标准资源工厂。
如果您想知道更多的关于建立,安装,配置,使用自定义资源工厂,请见Adding Custom Resource Factories。
注意:对于标准资源工厂,只有"JDBC Data Source"和"User Transaction"才能在其它的平台上使用,并且它们只是在平台实现了J2EE时才需要。所有其它的标准资源工厂,以及你自定义的工厂,都只能在 TOMCAT中使用,而不能被其它平台接受。
这个资源工厂用来建立任何一个符合标准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>
注意资源名称必须符合布署器的规定。
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特性).
要使用JDBC数据源,JNDI资源工厂要求您必须将合适的JDBC驱动放在Tomcat内建类和应用程序中。很方便的实现方法是将驱动放入$CATALINA_HOME/common/lib目录里 :).
下面修改你的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
一个典型的应用参考如下:
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标准数据源配置工厂所需要的属性如下:
本文地址:http://com.8s8s.com/it/it16818.htm