Một số ví dụ

Một phần của tài liệu Nghiên cứu, ứng dụng và phát triển hệ thống hỗ trợ làm việc nhóm zimbra, tính bản địa hóa, tối ưu mã nguồn và khả năng tích hợp, mở rộng các ứng dụng trong môi trường zimbra cơ sở dữ liệu, LDAP và các giao thức bảo mật qua SSL (Trang 104 - 109)

H. Giới thiệu LDAP và JNDI

3. Một số ví dụ

Phần này đưa ra 2 ví dụ. Ví dụ đầu tiên chỉ cho chúng ta cách để tra cứu một đối tượng từ một dịch vụ đặt tên, trong trường hợp này là hệ thống tập tin. Ví dụ thứ hai chỉ cho chúng ta cách để đọc được một thuộc tính từ một dịch vụ thư mục, trong trường hợp này là một thư mục LDAP.

Nếu có vấn đề gì về việc biên dịch hoặc chạy thử những ví dụ này, hãy xem phần Các

và chạy các ví dụ hoặc khi sử dụng JNDI nói chung và đưa ra các hướng giải quyết mà chúng ta có thể thử.

3.1 Ví dụ về Naming

Ví dụ này hướng dẫn chúng ta làm thế nào để viết một chương trình để tìm kiếm một đối tượng mà tên của nó được xem như là một tham số được nhập vào từ dòng lệnh. Chương trình này sử dụng một bộ cung cấp dịch vụ cho hệ thống tập tin. Do đó cái tên mà chúng ta cung cấp cho chương trình phải là một tên tập tin.

3.1.1 Nạp vào các lớp JNDI

Sử dụng một trình soạn thảo tùy ý thích, tạo một tập tin có tên là Lookup.java. Chúng ta có thể nạp vào toàn bộ gói hoặc chỉ các lớp hoặc giao diện cần thiết. Đoạn code dưới đây nạp vào mỗi lớp được sử dụng từ gói javax.naming.

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

3.1.2 Tạo một Initial Context

Trong hàm main() của chương trình, tạo một initial context. Chỉ định rằng chúng ta đang sử dụng bộ cung cấp dịch vụ hệ thống tập tin bằng việc thiết lập các tham số environment properties (thể hiện bởi một lớp Hashtable) để xây dựng InitialContext, như bên dưới:

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

Context ctx = new InitialContext(env);

Cách để thiết lập các thông số cho hàm dựng này được giải thích chi tiết hơn trong phần Căn bản về JNDI.

3.1.3 Tra cứu một đối tượng

Tiếp theo, sử dụng Context.lookup() để tra cứu một đối tượng. Đoạn code duwois đây tra cứu đối tượng được kết nối với cái tên được nhập vào bởi dòng lệnh.

Object obj = ctx.lookup(name);

3.1.4 Bắt lấy NamingException

Tạo một initial context và phương thức lookup() có thể ném một biệt lệ NamingException.

Vì lý do này, chúng ta cần đóng những lời gọi bên trong mệnh đề try/catch. Đoạn code bên dưới được lặp lại với mệnh đề try/catch.

try {

// Tạo initial context

Giới Thiệu LDAP

Context ctx = new InitialContext(env);

// Tra cuu một đối tượng

Object obj = ctx.lookup(name);

// In nó ra

System.out.println(name + " is bound to: " + bj);

} catch (NamingException e) {

System.err.println("Tra cứu gặp sự cố " +name+ ": "+ e);

}

3.1.5 Biên dịch chương trình

Tiếp theo, chúng ta sử dụng trình biên dịch Java để biên dịch tập tin mã nguồn. Để biên dịch chương trình, chúng ta phải có quyền truy xuất vào các lớp JNDI. Nếu chúng ta sử dụng Java 2 SDK, v1.3, thì các lớp JNDI đã sẵn sàng nạp vào. Ngược lại, chúng ta có thể nạp vào các lớp bởi việc thiết lập biến CLASSPATH để nạp vào jndi.jar mà chúng ta đã tải về từ Website JNDI cũng như việc cài đặt jndi.jar như một phần cài đặt mở rộng. Xem phần Những điều cần chuẩn bị để biết thêm chi tiết về cách để cài đặt các lớp JNDI và các bộ cung cấp dịch vụ.

Nếu việc biên dịch thành công, kế đến trình biên dịch sẽ tạo một tập tin có tên là Lookup.class trong cùng nơi chứa (thư mục) với tập tin mã nguồn Java (Lookup.java). Nếu việc biên dịch gặp lỗi, hãy chắc chắn rằng chúng ta những gì chúng ta gõ vào và tên nạp cho chương trình phải thật chính xác như đã chỉ dẫn ở đây, việc sử dụng hiển thị chữ in hoa. Nếu vẫn còn gặp rắc rối, xin xem phần Các vấn đề chung để được giúp đỡ.

3.1.6 Chạy chương trình

Để chạy chương trình, chúng ta cần truy xuất cho được các lớp JNDI, nhà cung cấp dịch vụ hệ thống tập tin, và lớp ví dụ của chúng ta (Lookup.class). Xem bước biên dịch về những sự chỉ dẫn bao gồm việc truy xuất đến các lớp JNDI. Để nạp các lớp bộ cung cấp dịch vụ hệ thống tập tin (fscontext.jar và providerutil.jar), việc nạp chúng vào trong biến CLASSPATH cũng như cài đặt chúng như những thành phần mở rộng. Lưu ý là các tập tin lưu trữ không được nạp vào với Java 2 SDK, v1.3. Xem Những điều cần chuẩn bị để biết thêm về cách cài đặt các lớp JNDI và các bộ cung cấp dịch vụ. Cuối cùng, nạp thư mục chứa tập tin Lookup.class của chúng ta vào trong biến CLASSPATH của chúng ta.

Để chạy chương trình, cung cấp một cái tên của một tập tin trong hệ thống tập tin của chúng ta, như dưới đây:

# java Lookup /tmp

Nếu chúng ta cung cấp một tập tin thư mục, chúng ta sẽ thấy một thể hiện giống như bên dưới.

# java Lookup /tmp

/tmp is bound to: com.sun.jndi.fscontext.RefFSContext@1dae083f

Nếu tên mà chúng ta cung cấp là một tập tin, chúng ta sẽ thấy một thể hiện giống như dưới đây.

/tmp/f is bound to: //tmp/f

Nếu chúng ta có bất kỳ khó khăn gì trong ví dụ này, xin xem phần Các vấn đề chung.

3.2 Ví dụ về Directory

Ví dụ này chỉ cho chúng ta cách để viết một chương trình để lấy về các thuộc tính từ một đối tượng thư mục. Nó sử dụng bộ cung cấp dịch vụ LDAP để truy xuất dịch vụ LDAP.

3.2.1 Nạp vào các lớp Thư mục JNDI

Sử dụng một trình soạn thảo tùy thích, tạo một tập tin tên là Getattr.java. Chúng ta có thể nạp vào toàn bộ gói cũng như chỉ các lớp và giao diện cần thiết. Đoạn code bên dưới nạp vào mỗi lớp được sử dụng từ các gói javax.naming và javax.naming.directory.

import javax.naming.Context;

import javax.naming.directory.InitialDirContext;

import javax.naming.directory.DirContext;

import javax.naming.directory.Attributes;

import javax.naming.NamingException;

3.2.2 Tạo một Initial Directory Context

Trong hàm main() của chương trình, tạo một initial directory context. Điều này giống như việc tạo một initial context trong ví dụ về Naming trước, ngoại trừ việc chúng ta sử dụng hàm dựng InitialDirContext.

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

env.put(Context.PROVIDER_URL,

"ldap://localhost:389/o=JNDITutorial");

DirContext ctx = new InitialDirContext(env);

Giống như ví dụ về naming, chúng ta chỉ định rằng chúng ta đang sử dụng bộ cung cấp dịch vụ LDAP bằng việc thiết lập tham số Hashtable cho hàm dựng InitialDirContext thích hợp. Chi tiết về cách thiết lập các tham số cho hàm dựng này được đề cập trong phần Căn bản về JNDI. Còn bây giờ, chỉ điều để hiểu là chương trình đó định danh một máy chủ LDAP trên máy cục bộ. Nếu máy chủ LDAP của chúng ta được đặt trên một máy khác hoặc đang sử dụng một cổng (port) khác thì chúng ta cần phải thay đổi LDAP URL ("ldap://localhost:389/o=JNDITutorial) cho phù hợp. Những chỉ dẫn để thiết lập một máy chủ LDAP cho ví dụ này được đề cập trong phần Những điều cần chuẩn bị.

3.2.3 Lấy danh sách các thuộc tính của đối tượng Thư mục

Tiếp theo, sử dụng getAttributes() để lấy về các thuộc tính của một đối tượng. Đoạn code dưới đây lấy về tất cả các thuộc tính ứng với đối tượng được kết nối với cái tên ―cn=Tân PM,ou=people‖:

Giới Thiệu LDAP

Attributes attrs = ctx.getAttributes("cn=Tân PM,ou=People");

3.2.4 Bung nén các thuộc tính mong muốn

Từ một tập hợp các thuộc tính, Attributes, chúng ta có thể yêu cầu một phần đặc biệt thuộc tính bằng việc sử dụng Attributes.get() và từ đó lấy giá trị của thuộc tính đó. Dòng dưới đây lấy về thuộc tính surname (họ) ―sn‖ và kế đó triệu gọi Attribute.get() trên nó để lấy về giá trị của nó:

attrs.get("sn").get();

3.2.5 Bắt biệt lệ NamingException

Phương thức gọi hiển thị nhiều quá có thể ném ra một biệt lệ NamingException. Vì thế, chúng ta cần gói gọn những lời gọi này trong một mệnh đề try/catch. Đoạn code bên dưới được lặp lại với mệnh đề try/catch.

try {

// Tạo initial directory context

DirContext ctx = new InitialDirContext(env);

// Yêu cầu tất cả các thuộc tính của đối tượng

Attributes attrs = ctx.getAttributes("cn=Tân PM, ou=people");

// Tìm thuộc tính surname ("sn") và hiển thị nó System.out.println("sn: " + attrs.get("sn").get());

} catch (NamingException e) {

System.err.println("Việc lấy thuộc tính gặp lỗi:" + e);

}

3.2.6 Biên dịch chương trình

Tiếp theo, sử dụng trình biên dịch Java để biên dịch tập tin nguồn. Giống với ví dụ về naming, để làm điều này chúng ta cần phải truy xuất vào các lớp JNDI.

Nếu biên dịch thành công, trình biên dịch tạo một tập tin tên là Getattr.class trong cùng nơi chứa (thư mục) với tập tin mã nguồn Java (Getattr.java). Nếu biên dịch gặp lỗi, hãy chắc chắn rằng chúng ta những gì chúng ta gõ vào và tên nạp cho chương trình phải thật chính xác như đã chỉ dẫn ở đây, việc sử dụng hiển thị chữ in hoa. Nếu chúng ta vẫn còn gặp rắc rối, xin xem phần Các vấn đề chung để được giúp đỡ.

3.2.7 Chạy chương trình

Giống như ví dụ về naming, chúng ta cần truy xuất vào cả các lớp JNDI lẫn lớp ví dụ của chúng ta, Getattr.class. Chúng ta cung cần truy xuất vào các lớp cung cấp dịch vụ LDAP (ldap.jar và providerutil.jar). Nếu chúng ta đang sử dụng Java 2 SDK, v1.3, thì những lớp

Ví dụ dưới đây từ dòng lệnh đang chạy chương trình Getattr và được kết xuất như sau:

# java Getattr sn: PM

Gọi lại chương trình đó được cấu hình với các thuộc tính dưới đây:

env.put(Context.PROVIDER_URL,

"ldap://localhost:389/o=JNDITutorial");

Với cấu hình này, những dòng lệnh này truy vấn máy chủ LDAP trên máy localhost lắng nghe cổng 389, quan sát namespace ―o=JNDITutorial‖. (Xem Những điều cần chuẩn bị để xem chi tiết các bước cấu hình.) Nó yêu cầu các thuộc tính của phần tử (entry) ―cn=Tân PM,ou=people‖. Một lần nó có các thuộc tính, nó bung nén thuộc tính surname (―sn‖). Nếu chúng ta gặp bất kỳ khó khăn nào đối với việc chạy ví dụ này, xin xem phần Các vấn đề chung.

Một phần của tài liệu Nghiên cứu, ứng dụng và phát triển hệ thống hỗ trợ làm việc nhóm zimbra, tính bản địa hóa, tối ưu mã nguồn và khả năng tích hợp, mở rộng các ứng dụng trong môi trường zimbra cơ sở dữ liệu, LDAP và các giao thức bảo mật qua SSL (Trang 104 - 109)

Tải bản đầy đủ (PDF)

(256 trang)