以前經常在諸如 weblogic, jboss, tomcat 服務器上配置 JNDI 服務,代碼也很簡單。但還沒有用過 LDAP 服務器. LDAP 用層次(樹) 結構存儲數據。 要引用樹中的項目,就需要列出樹中的節點名稱。從所要項目開始,一直向樹頂跟蹤。樹中每個節點都有 nodetype=value 形式的唯一 COM 域。 域組件的節點類型為 DC ,葉子節點類型為 O, LDAP 有屬性的概念,同時也有類的概念。因此,可以依據屬性或類檢索。
Java 很是方便只要通過 JNDI 透過 LDAP 就可操作 LDAP, NIS, NDS, NT 等目錄服務器.
例子1.
通過屬性檢索
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchResult;
/**
* @author Jack.Wang
*
*/
public class NameSearch {
public static void main(String args[]) {
try {
InitialDirContext ctx = new InitialDirContext();
BasicAttributes searchAttrs = new BasicAttributes();
searchAttrs.put("sn", "Tippin");
NamingEnumeration objs = ctx.search(
"ldap://ldap.jack.com/o=test search, dc=test,dc=com",
searchAttrs);
while (objs.hasMoreElements()) {
SearchResult match = (SearchResult) objs.nextElement();
System.out.println(match.getName());
Attributes attrs = match.getAttributes();
NamingEnumeration e = attrs.getAll();
while (e.hasMoreElements()) {
Attribute attr = (Attribute) e.nextElement();
System.out.println(attr.getID());
for (int i = 0; i < attr.size(); i++) {
if (i > 0) {
System.out.println(",");
} else {
System.out.println(attr.get(i));
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
例子2.
通過類名字檢索
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
/**
* @author Jack.Wang
*
*/
public class AllSearch {
public static void main(String[] args) {
try {
InitialDirContext ctx = new InitialDirContext();
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration objs = ctx
.search(
"ldap://ldap.jack.com/o=test search, dc=test,dc=com",
"(objectClass=*)", searchControls);
while (objs.hasMoreElements()) {
SearchResult match = (SearchResult) objs.nextElement();
System.out.println(match.getName());
Attributes attrs = match.getAttributes();
NamingEnumeration e = attrs.getAll();
while (e.hasMoreElements()) {
Attribute attr = (Attribute) e.nextElement();
System.out.println(attr.getID());
for (int i = 0; i < attr.size(); i++) {
if (i > 0) {
System.out.println(",");
} else {
System.out.println(attr.get(i));
}
}
}
}
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BasicAttributes searchAttrs = new BasicAttributes();
}
}
例子3.
基于文件系統的 binding
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
public class TestBinding {
private String serverName = "jackhost";
private int portNumber = 1433;
private String login = "jack";
private String password = "19810622";
private String databaseName = "jack";
private String filePath = "jdbc/jack";
public TestBinding() {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(javax.naming.Context.PROVIDER_URL, "file:d:\\");
try {
Context ctx = new InitialContext(env);
AnalogyDB ds = new AnalogyDB();
ds.setServerName(serverName);
ds.setPortNumber(portNumber);
ds.setUser(login);
ds.setPassword(password);
ds.setDatabaseName(databaseName);
ds.setDescription("JDBC Datasource connection.");
ctx.bind(filePath, ds);
ctx.close();
} catch (Exception e) {
System.err.println("ERROR " + e.getMessage());
}
}
public static void main(String[] args) {
TestBinding test = new TestBinding();
}
}
例子3.
基于文件系統的 lookup
import java.sql.Connection;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
/**
*
* @author Jack.Wang
*
*/
public class TestLookup {
public TestLookup() {
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
env.put(javax.naming.Context.PROVIDER_URL, "file:d:\\");
Context ctx = new InitialContext(env);
AnalogyDB ds = (AnalogyDB) ctx
.lookup("jdbc/jack");
Connection connection = ds.getConnection();
System.out.println("Connection Established.");
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestLookup test = new TestLookup();
}
}
本博客為學習交流用,凡未注明引用的均為本人作品,轉載請注明出處,如有版權問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學習進步。