JNDI入门学习

我们知道jndi是java的命名和目录服务的api,为什么要有它了,是因为我们在网络条件下可能要查找和使用一些分布式的资源。

 

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。

 

JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。

 

Name Service:命名服务,将名字和一个对象关联起来

Directory Service:目录服务,是命名服务扩展和提高,对象不但有名称,还有属性,它提供对命名信息管理和操作(增删改查)

 

JNDI-API:面向应用程序的开发者

JNDI-SPI:(服务提供者接口)面向服务器生产商

 

应用服务器一般都会自带一个目录服务器

 

在J2EE容器中配置JNDI参数

 

所有命名操作都相对于某一上下文,该初始上下文实现Context接口并提供解析名称的起始点(类似于JS的document)

 

JBoss的JNDI连接工厂

env.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");

设置命名服务器的URL

env.put("java.naming.provider.url", "localhost:1099");

备注:不同的应用服务器,JNDI的连接工厂代码是不一致的,URL的端口也不一致。

 

使用Jboss动态的设定JNDI对象

 

package hb.jndi;

import java.io.FileInputStream;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;

public class TestJbossJNDI {

	public TestJbossJNDI() {
		super();
	}

	public static void main(String[] args) {
		try {
			Properties env = new Properties();

			// 载入jboss的SPI相关参数,包括初始上下文工厂,服务URL,等等
			env.put("java.naming.factory.initial",
					"org.jnp.interfaces.NamingContextFactory");
			env.put("java.naming.provider.url", "localhost:1099");

			// 通过JNDI api 初始化上下文
			InitialContext ctx = new javax.naming.InitialContext(env);
			// InitialContext ctx = new javax.naming.InitialContext();
			System.out.println("Got context");
			// create a subContext
			ctx.createSubcontext("/sylilzy");
			ctx.createSubcontext("sylilzy/sily");
			// rebind a object
			ctx.rebind("sylilzy/sily/a", "I am sily a!");
			ctx.rebind("sylilzy/sily/b", "I am sily b!");

			// lookup context
			Context ctx1 = (Context) ctx.lookup("sylilzy");
			Context ctx2 = (Context) ctx1.lookup("/sylilzy/sily");
			ctx2.bind("/sylilzy/g", "this is g");
			// lookup binded object
			Object o;
			o = ctx1.lookup("sily/a");
			System.out.println("get object from jndi:"
					+ "get object from jndi:" + o);
			// rename the object
			ctx2.rename("/sylilzy/g", "g1");
			o = ctx2.lookup("g1");
			System.out.println("get object from jndi:"
					+ "get object from jndi:" + o);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

操作步骤:

1、新建一个web工程,并引入C:\jboss-4.2.2.GA\client目录下面的所有jar包

(将java文件打包成jar,然后放在jboss容器中即可)

2、在工程中添加上面这个java文件

3、启动jboss,然后再运行上面的java文件

 

运行结果:

Got context

get object from jndi:get object from jndi:I am sily a!

get object from jndi:get object from jndi:this is g

 

备注:如果不适用Properties 对象设置环境变量,则可以使用jndi.properties文件,然后放在class目录下面,即最外层的包目录

jndi.properties的内容如下:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

 

 

使用JBoss 配置数据源,并访问数据库

1、将C:\jboss-4.2.2.GA\docs\examples\jca目录下的oracle-ds.xml文件拷贝到C:\jboss-4.2.2.GA\server\default\deploy目录下面,并做相应的修改,内容如下:

<?xml version="1.0" encoding="UTF-8"?>


<datasources>
  <local-tx-datasource>
    <jndi-name>huangbiaoDS</jndi-name>
    <use-java-context>false</use-java-context>?
	<connection-url>jdbc:oracle:thin:@localhost:1521:orcl</connection-url>
	
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>huangbiao</user-name>
    <password>huangbiao</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
       <metadata>
         <type-mapping>Oracle9i</type-mapping>
      </metadata>
  </local-tx-datasource>

</datasources>

2、然后在工程目录下新建ConnectDB.java文件,用来测试连接数据库

package hb.jndi.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectDB {

	public static void main(String[] args) {
		Properties env = new Properties();

		// 载入jboss的SPI相关参数,包括初始上下文工厂,服务URL,等等
		env.put("java.naming.factory.initial",
				"org.jnp.interfaces.NamingContextFactory");
		env.put("java.naming.provider.url", "localhost:1099");

		Connection conn = null;
		PreparedStatement preStmt = null;
		ResultSet resultSet = null;
		try {
			// 通过JNDI api 初始化上下文
			InitialContext ctx = new InitialContext(env);
			
			DataSource datasource = (DataSource)ctx.lookup("huangbiaoDS");
			
			conn = datasource.getConnection();
			String sql="select * from student";
			preStmt = conn.prepareStatement(sql);
			resultSet = preStmt.executeQuery();
			while(resultSet.next()){
				System.out.println(resultSet.getString(2));
			}
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				resultSet.close();
				preStmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

}

备注:

对应的数据库驱动应该添加到:C:\jboss-4.2.2.GA\server\default\lib目录下面(server目录中对应的lib下),否则将无法连接到数据库

操作步骤如下:

1、先启动Jboss

2、然后在运行ConnectDB.java文件

猜你喜欢

转载自hbiao68.iteye.com/blog/1916017