jndi:java命名和目錄接口
jndi把object和context(還可以有subcontext)組織成一個jndi樹
這樣object就可一被綁定到不同的context上面
jndi是一種查找服務,用于查找:
web應用環境變量
EJB和他們的環境變量
通過DataSource的數據庫連接池
JMS沒有表和連接工廠
其他服務
不要將jndi當做數據庫使用
jndi對象存儲在內存中
訪問jndi對象與網絡性能有關
jndi樹:
InitialContext是JNDI樹所有搜索的起點
對象綁定到jndi樹上,java對象是樹葉,context是節點
一個綁定把對象與一個邏輯名和一個context關聯起來
創建Initial Context
從服務器端對象連接到jndi
//創建一個InitialContext
context ctx=new InitialContext();//鏈接到當前的jndi樹上
從任何一個地方連接到jndi
.創建Environment對象
weblogic.jndi.Enviroment env=new Weblogix.jndi.Enviroment();
填寫Enviroment
env.setProviderurl("t3://127.0.0.1:7001");//weblogic server的位置
env.setSecurityPrincipal("system");//安全信息
env.setSecurityCredentiais("password");
//使用Environment對象創建InitialContext
context ctx=env.getInitialContext();
.hashtable的用法....
創建subcontext
創建一個用于綁定對象的subcontext
創建Environment對象
context ctx=env.getInitialContext();//首先獲得已經存在的subcontext或者initialcontext
填寫Environment
context subcontext=ctx.createSubcontext("newSubcontext");
subcontext.rebind("boundobject",object);
subcontext.close();
ctx.close();
其他鏈接到jndi的方法:
使用ConstantProperties名和hashtable類:
HashTable env=new HashTable();
env.put(Context.initial_context_factory,"weblogic.jndi.WLInitialContextFactory");
env.put(Context.procider_url,"t3://localhost:7001");
env.put(Context.security_principal,"system");
env.put(Context.crrdentials,"password");
Context ctx=new InitialContext(env);
另一個例子:使用hardcoded名和properties類
Properties env=new Properties();
env.setProperties("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
env.setProperties("java.naming.provider.url","t3://localhost:7001")
env.setProperties("java.naming.security.principal","system");
env.setProperties("java.naming.security.credentials","password");
Context ctx=new InitialContext(env);
jndi.properties
.jndi.properties文件為所有的Initial Contexts設置默認的屬性
.jndi.properties文件的搜索順序
.classpath
.$JAVA_HOME/lib
實例:
java.naming.factoyr.initial=weblogic.jndi.WLInitialContextFactory
java.naming.security.url=t3://localhost:7001
java.naming.security.pricipal=system
java.naming.security.credentials=password
使用默認值:
Context ctx=new InitialContext();
從jndi查找:
.lookup()從jndi樹獲得對象
.通過lookup()返回的對象必須映射到他們合適的類型
try{
//先獲得InitialContext
//Context ic=new Context();
Object obj;
obj=ic.lookup("javax.transation.UserTransaction");
UserTransaction ut=(UserTransaction)obj;
ut.begin();
.....
ic.close();
}catch(NamingEcxeption e){....}
遠程綁定對象:
.遠程綁定到遠程命名服務的對象必須是序列化的
.訪問命名服務時,對象是采用復制機制
查找的對象是序列化到客戶端的
一個binding實例:
public static Context getInitialContext()throws NamingException{
創建Environment對象
weblogic.jndi.Environment env=new Weblogix.jndi.Environment();
填寫Enviroment
env.setProviderurl("t3://127.0.0.1:7001");//weblogic server的位置
env.setSecurityPrincipal("system");//安全信息
env.setSecurityCredentiais("password");
//使用Environment對象創建InitialContext
context ctx=env.getInitialContext();
return ctx;
}
//獲得Initial Context
Context ctx=getInitialContext();
//創建名為band的對象
Bank myBank=new Bank();
//把對象綁定到jndi樹
ctx.rebind("theBank",myBank);
ctx.close();