JNDI
JNDI(Java Naming and Directory Interface)是一個應用程式設計的API,為開發人員提供了查詢和訪問各種命名和目錄服務的通用、統一的介面,類似JDBC都是構建在抽象層上。 JNDI可訪問的現有的目錄及服務有: DNS、XNam 、Novell目錄服務、LDAP(Lightweight Directory Access Protocol 輕型目錄訪問協議)、 CORBA物件服務、檔案系統、Windows XP/2000/NT/Me/9x的登錄檔、RMI、DSML v1&v2、NIS。 JNDI優點: 包含了大量的命名和目錄服務,使用通用介面來訪問不同種類的服務; 可以同時連線到多個命名或目錄服務上; 建立起邏輯關聯,允許把名稱同Java物件或資源關聯起來,而不必指導物件或資源的物理ID。 JNDI程式包:
javax.naming:命名操作; javax.naming.directory:目錄操作; javax.naming.event:在命名目錄伺服器中請求事件通知; javax.naming.ldap:提供LDAP支援; javax.naming.spi:允許動態插入不同實現。
利用JNDI的命名與服務功能來滿足企業級APIs對命名與服務的訪問,諸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI透過JNDI來使用CORBA的命名服務。 JNDI與JDBC: JNDI提供了一種統一的方式,可以用在網路上查詢和訪問服務。透過指定一個資源名稱,該名稱對應於資料庫或命名服務中的一個紀錄,同時返回資料庫連線建立所必須的資訊。 程式碼示例:
try{ Context cntxt = new InitialContext(); DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt"); } catch(NamingException ne){ ... }
JNDI與JMS: 訊息通訊是軟體元件或應用程式用來通訊的一種方法。JMS就是一種允許應用程式建立、傳送、接收、和讀取訊息的JAVA技術。 程式碼示例:
try{ Properties env = new Properties(); InitialContext inictxt = new InitialContext(env); TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory"); ... } catch(NamingException ne){ ... }
訪問特定目錄:舉個例子,人是個物件,他有好幾個屬性,諸如這個人的姓名、電話號碼、電子郵件地址、郵政編碼等屬性。透過getAttributes()方法
Attribute attr = directory.getAttributes(personName).get("email"); String email = (String)attr.get();
透過使用JNDI讓客戶使用物件的名稱或屬性來查詢物件:
foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);
透過使用JNDI來查詢諸如印表機、資料庫這樣的物件,查詢印表機的例子:
Printer printer = (Printer)namespace.lookup(printerName); printer.print(document);
瀏覽名稱空間:
NamingEnumeration list = namespace.list("o=Widget, c=US"); while (list.hasMore()) { NameClassPair entry = (NameClassPair)list.next(); display(entry.getName(), entry.getClassName()); }
常用的JNDI操作:
void bind(String sName,Object object);――繫結:把名稱同物件關聯的過程 void rebind(String sName,Object object);――重新繫結:用來把物件同一個已經存在的名稱重新繫結 void unbind(String sName);――釋放:用來把物件從目錄中釋放出來 void lookup(String sName,Object object);――查詢:返回目錄中的一個物件 void rename(String sOldName,String sNewName);――重新命名:用來修改物件名稱繫結的名稱 NamingEnumeration listBinding(String sName);――清單:返回繫結在特定上下文中物件的清單列表 NamingEnumeration list(String sName);
程式碼示例:重新得到了名稱、類名和繫結物件。
NamingEnumeration namEnumList = ctxt.listBinding("cntxtName"); ... while ( namEnumList.hasMore() ) { Binding bnd = (Binding) namEnumList.next(); String sObjName = bnd.getName(); String sClassName = bnd.getClassName(); SomeObject bjLocal = (SomeObject) bnd.getObject(); }
JNDI連線資料庫模型
package DBUtil;
import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import javax.naming.Context; import javax.naming.InitialContext;
public class DBConnection { private Connection conn = null; private Statement stmt = null; private ResultSet rs = null; private int resultNum = 0;
/** * 建構函式 * 找到資料來源,並用這個資料來源建立連線 */ public DBConnection() { try { Context ctx = new InitialContext(); if (ctx == null) throw new Exception("No Context"); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracle"); if (ds == null) throw new Exception("jdbc/oracle is an unknown DataSource"); conn = ds.getConnection(); stmt = conn.createStatement(); } catch (Exception e) { System.out.println("naming:" + e.getMessage()); } }
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82392/viewspace-152687/,如需轉載,請註明出處,否則將追究法律責任。