我們知道jndi是java的命名和目錄服務的api,為什么要有它了,是 因為我們在網絡條件下可能要查找和使用一些分布式的資源。
?
JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是一組在Java應用中訪問命名和目錄服務的API。命名服務將名稱和對象聯(lián)系起來,使得我們可以用名稱訪問對象。目錄服務是一種命名服務,在這種服務里,對象不但有名稱,還有屬性。
?
JNDI(Java Naming and Directory Interface)是一個應用程序設計的API,為開發(fā)人員提供了查找和訪問各種命名和目錄服務的通用、統(tǒng)一的接口,類似JDBC都是構建在抽象層上。
?
Name Service:命名服務,將名字和一個對象關聯(lián)起來
Directory Service:目錄服務,是命名服務擴展和提高,對象不但有名稱,還有屬性,它提供對命名信息管理和操作(增刪改查)
?
JNDI-API:面向應用程序的開發(fā)者
JNDI-SPI:(服務提供者接口)面向服務器生產商
?
應用服務器一般都會自帶一個目錄服務器
?
在J2EE容器中配置JNDI參數(shù)
?
所有命名操作都相對于某一上下文,該初始上下文實現(xiàn)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動態(tài)的設定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相關參數(shù),包括初始上下文工廠,服務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 對象設置環(huán)境變量,則可以使用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 配置數(shù)據(jù)源,并訪問數(shù)據(jù)庫
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文件,用來測試連接數(shù)據(jù)庫
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相關參數(shù),包括初始上下文工廠,服務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();
}
}
}
}
?
備注:
對應的數(shù)據(jù)庫驅動應該添加到: C:\jboss-4.2.2.GA\server\default\lib目錄下面 (server目錄中對應的lib下),否則將無法連接到數(shù)據(jù)庫 。
?
操作步驟如下:
1、先啟動Jboss
2、然后在運行ConnectDB.java文件
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

