Chúng ta sẽ viết một trang JSP triệu gọi thành phần Bean Hello mà ta đã xây dựng ở trên . Mã chương trình như sau :
<%@page import="helloworld.*"%> <%@page import="javax.naming.*"%> <% System.setProperty("java.naming.factory.inital","org.jnp.interfaces.Namin gContextFactory"); System.setProperty("java.naming.provider.url","127.0.0.1:1099"); try {
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
InitialContext jndiContext=new InitialContext();
HelloHome home=(HelloHome)jndiContext.lookup("Hello"); Hello obj= home.create();
out.println(obj.echo("Hello"));
}catch (Exception e){e.printStackTrace();} %>
<html> <head> <title>
JSP Called Bean Hello </title> </head> <body bgcolor="#ffffff"> </body> </html> 2.5.2 Tạo thành phần Web
Để xây dựng thành phần Web cho thành phần Bean Hello, chúng ta dùng tiện ích Deploy tool của Sun Application Server 8.0. Các bước làm như sau :
• Sau khi khởi động tiện ích Deploy tool ta chọn File-> New -> Web Component.
• Nhấn Next.
• Trong WAR Location chọn “Create New Stand-Alone WAR Module”, trong ô WAR Display Name gõ vào : “helloweb”. Nhấn Vào Edit
• Contents, ta tiến hành đưa tất cả các class và trang JSP vào trong thư mục WEB-INF, nhấn OK. Nhấn Next.
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
• Tiến trình sẽ yêu cầu ta chọn loại thành phần (Component Type), chọn JSP Page, nhấn Next để đến bước kế tiếp.
• Ở bước này, trong JSP File name ta chon : “/Hello.jsp”, Nhấn Next. • Nhấn Finish.
2.5.3 Kiểm chứng và đóng gói ứng dụng J2EE
Để chứng ứng dụng J2EE, ta dùng tiện ích Verify J2EE của Deploy tool. Chọn tools-> Verify J2EE… Một hộp thoại xuất hiện, trong items to be verified, nhấn nút Add để đưa file “helloweb.war” mà ta vừa tạo vào, nhấn OK. Tiện ích sẽ tiến hành kiểm tra và thông báo kết quả cho ta biết…
2.5.4 Chạy ứng dụng J2EE
Sau khi khi tạo thành phần Web, ta khởi động trang Admin Console, chọn Web Aplication, nhấn vào “Launch” của helloweb để chạy ứng dụng.
2.6 PHÁT TRIỂN BEAN THAO TÁC (SESSION BEAN)
2.6.1 Giao tiếp Session Bean
Giao tiếp Session Bean định nghĩa các phương thức mà tất cả các Session Bean phải thực thi. Nó thừa kế giao tiếp Enterprise Bean.
package javax.ejb;
public interface SessionBean extends EnterpriseBean {
void setSessionContext(SessionContext sessionContext) throws EJBException, RemoteException;
void ejbRemove() throws EJBException, RemoteException; void ejbActivate() throws EJBException, RemoteException; void ejbPassivate() throws EJBException, RemoteException; }
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
2.6.2 Phát triển Bean thao tác phi trạng thái (Stateless Session Bean)
2.6.2.1 Xây dựng Bean thao tác phi trạng thái
Thành phần Bean Hello mà ta xây dựng trên đây là thành phần Bean phi trang thái. Do đó ở đây chúng ta sẽ không nói lại cách xây dựng thành phần Bean Hello mà chúng ta sẽ tìm hiểu về cách giao tiếp giữa trình khách và đối tượng EJB trong trình chứa.
Hình 2.2 Giao tiếp giữa trình khách và đối tượng EJB
1. Trình khách sử dụng dịch vụ JNDI yêu cầu lấy về tham chiếu đến lớp chủ HelloHome.
2. Trình khách gọi phương thức create() của lớp giao tiếp chủ HelloHome yêu cầu tạo ra tham chiếu đến lớp Hello.
3. Sau khi có tham chiếu đến lớp Hello, trình khách sẽ sử dụng lớp Hello triệu gọi phương thức của đối tượng Bean trong trình chứa container. 4. Trình chứa đón nhận lời triệu gọi từ Hello, thay mặt trình khách gọi đến
thành phần Bean thực tế bên trong do trình chứa quản lý. Trình Khách JN D I, J D B C , J T S … JN D I, J D B C , J T S … J2EE HelloHome Hello HelloBean 1 2 3 4 Trình chứa (container)
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
2.6.2.2 Chu trình hoạt động (Lyfe Cycle) của Bean thao tác phi trạng thái
Bởi vì Bean thao tác phi trạng thái không bao giờ thụ động (passivate), nên chu trình họat động của nó chỉ có 2 giai đọan : chưa tồn tại và sẵn sàng để gọi các phương thức của business. Sau đây là chu trình họat động của Bean thao tác phi trạng thái:
Hình 2.3 Chu trình hoạt đông của Stateless Bean
2.6.2.3 Sơ đồ trạng thái (State Diagram)
Hình 2.4 Sơ đồ trạng thái của Stateless Bean
Chưa tồn tại
Sẵn Sàng
2.ejbCreate
1.setSessionContex
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
2.6.2.4 Sơ đồ trình tự cho Bean thao tác phi trạng thái
Hình 2.5 Sơ đồ trình tự của Stateless Bean
2.6.3 Phát triển Bean thao tác lưu vết trạng thái (Stateful Session Bean)
2.6.3.1 Xây dựng Bean thao tác lưu vết trạng thái
Thành phần Hello Bean mà ta xây dựng trên đây là thành phần Bean EJB thao tác phi trang thái (stateless bean). Có những thành phần Bean đòi hỏi phải lưu giữ thông tin trong suốt quá trình giao dịch, nó được gọi là thành phần Bean lưu vết trạng thái.Sau đây chúng ta sẽ thiết kế thành phần Bean phục vụ thao tác mua bán sách có tên là CartBean. Việc thiết kế thành phần Bean thao tác lưu vết trạng thái, cũng giống như việc thiết kế thành phần Bean thao tác phi trang thái, chúng ta cũng xây dựng các lớp Remote, lớp Home và thành phần Bean. Sau đây là đặc tả các lớp:
• Lớp Cart: tương tự như lớp Hello nó cũng kế thừa lớp javax.ejb.EJBObject.:
import java.util.*
import javax.ejb.EJBObject; import java.rmi.RemoteException;
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
public interface Cart extends EJBObject {
public void addBook(String title) throws RemoteException;
public void removeBook(String title) throws BookException,RemoteException;
public Vector getContents() throws RemoteException; }
• Lớp CartHome: tương tự như lớp HelloHome, lớp CartHome cũng kế thừa lớp EJBHome.
import java.io.Serializable;
import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome;
public interface CartHome extends EJBHome {
Cart create(String person) throws RemoteException,CreateException;
Cart create(String person, String id) throws RemoteException,CreateException;
}
• Lớp CartBean: cũng giống như lớp HelloBean, CartBean là nơi đặc tả các phương thức để client triệu gọi thông qua lớp Cart trong trình chứa.
Import java. util.* import javax.ejb.*
public class CartBean implements SessionBean {
String customerName; String customerId; Vector contents;
// Tạo đối tượng EJB dựa vào tên khách hàng
public void ejbCreate(String person) throws CreateException {
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
throw new CreateException(“Null person not allowned”); } else {
customerName=person; }
// Tạo đối tượng kiểm tra định danh của khách hàng sử dụng Bean IdVerifier idChecker = new IdVerifier();
If(idChecker.validate(id)) {
CustomerId = id; }else {
throw new CreateException(“Invalid id:” +id); }
contents = new Vector(); }
// Thêm tựa sách bào danh mục
public void addBook(String title) {
contents.addElement(title); }
// Loại tựa sách ra khỏi danh mục
public void removeBook(String title) throws BookException
{
boolean result = contents.removeElement(title);
if(result = = false) { throw new BookException(title + “not in cart.”);
} }
// Trả về danh mục sách đã chọn public Vector getContents() {
return contents; }
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
public CartBean() {
}
// Các phương thức triệu gọi bởi trình chứa public void ejbRemove()
{
System.out.println(“Bean Remove”); }
public void ejbActivate() {
System.out.println(“Bean Active”); }
public void ejbRemove() {
System.out.println(“Bean Remove”); }
public void ejbPassivate() {
System.out.println(“Bean Passivate”); }
public void setSessionContext(SessionContext sc) {
} }
• CartBean xây dựng lớp IdVerifier để kiểm tra định danh của khách hàng mua sách như sau:
Public class IdVerifier {
Public IdVerifier() {
}
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
{
boolean result = = true;
for(int i = 0; i < id.length(); i++) { if(Character.isDigit(id.charAt(i)) = = false) result = false; } return result; } }
• Chúng ta xây dựng lớp ngoại lệ BookException phục vụ cho CartBean phát sinh lỗi khi xóa hết sách trong danh mục như sau:
public class BookException extends Exception {
public BookException() {
}
public BookException( String msg) {
super(msg); }
}
Để đưa CartBean vào trình chứa của J2EE, chúng ta biên dịch mã nguồn của Cart.java, CartHome.java, CartBean.java. Chúng ta dùng trình đóng gói deploytool để tạo ra gói .jar chứa thành phần Bean đồng thời chuyển giao Bean cho trình chứa J2EE tương tự như các bước chúng ta đã làm với Session Stateless Bean. Chỉ khác ở chổ ta chọn Bean Type là Stateful.
• Tiếp theo, chúng ta sẽ viết trình khách triệu gọi đối tượng CartBean, nó được viết như sau:
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
import java.util.*
import javax.naming.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; public class CartClient
{
public static void main(String [] args) {
try {
// Khởi tạo môi trường
Context initial = new initialContext(); // Lấy về tham chiếu của lớp chủ CartHome
Object objref = initial.lookup(“java:comp/env/ejb/CartBean”); // Chuyển kiểu tham chiếu
CartHome home=(CartHome)PortableRemoteObject.narrow (objref,CartHome.class);
Cart shoppingCart = home.create(“Mr.Duke”,”123”); // Triệu gọi phương thức Bean để thêm vào tựa sách shoppingCart.addBook(“Java Book”);
shoppingCart.addBook(“Programing Visual Basic”); shoppingCart.addBook(“Network programing”); // Lấy về danh mục các tựa sách đã chọn
Vector bookList = new Vector(); bookList = shoppingCart.getContents(); Enumeration enumer = bookList.elements(); // In các tựa sách trong danh mục
while(enumer.hasMoreElements()) {
String title = (String)enumer.nextElement(); System.out.println(title);
// Gọi phương thức loại bỏ sách ra khỏi danh mục shoppingCart.removeBook(“Programing Visual Basic”); shoppingCart.remove();
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
}catch (BookException ex) {
System.err.println(“Caught a Book Exception: ” + ex.getMessage());
} } }
2.6.3.2 Chu trình hoạt động của Bean thao tác lưu vết trạng thái
Sau đây là hình minh họa chu trình họat động của Bean thao tác lưu vết trạng thái:
Hình 2.6 Chu trình hoạt động của Stateful Bean
Client khởi tạo chu trình họat động bằng cách gọi phương thức create(). Trình chứa EJB thuyết minh Bean và gọi các phương thức setSessionContext và ejbCreate() trong Bean thao tác. Bây giờ thì Bean đã sẵn sàng để được gọi các phương thức business của nó. Do các thành phần Bean lưu giữ trạng thái thường không được huỷ đi trong quá trình giao dịch. Nếu trình chứa không đủ bộ nhớ (hoặc đối với những thành phần Bean chưa cần dùng đến), trình chứa sẽ tạm thời lưu Bean xuống bộ nhớ ngoài (đĩa cứng) bằng cách gọi phương thức ejbPassivate() để thông báo cho Bean biết rằng nó sắp được lưu xuống bộ nhớ ngoài (thông thường trình chứa EJB sử dụng thuật toán lần sử dụng gần đây ít nhất (last-recently-used)). Chưa tồn tại 1.create 2.setSessionContext 3.ejbCreate 1.remove 2.ejbRemove Sẵn Sàng Thụ động (Passive) ejbPassivate ejbActivate
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
Các Bean lưu vết trạng thái có thể dựa vào tình huống này để tạm cất những dữ liệu quan trọng vào nơi nào đó, sau đó Bean sẽ chuyển sang trạng thái ngủ (ngừng hoạt động). Khi có một lời triệu gọi Bean phát sinh mới từ trình khách, nếu trình chứa không tìm thấy Bean đang hoạt động nó sẽ khôi phục lại Bean từ vùng nhớ tạm. Lúc này trình chứa sẽ gọi phương thức ejbActivate() để thông báo cho Bean biết trạng thái kích hoạt trở lại. Bean có thể dựa vào tình huống này để khôi phục lại trạng thái đã lưu trữ trước đó. Ở cuối chu trình họat động, Client gọi phương thức remove() và trình chứa gọi phương thức ejbRemove() của Bean.
2.6.3.3 Sơ đồ trạng thái của Bean thao tác lưu vết trạng thái
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
2.6.3.4 Sơ đồ trình tự của Bean thao tác lưu vết trạng thái
Hình 2.8 Sơ đồ trình tự của Stateful Bean
2.7 GIỚI THIỆU TỔNG QUAN VỀ ENTITY BEAN
Lợi ích chính của EJB là nó cung cấp cho chúng ta khả năng tạo ra Bean thực thể. Bean thực thể là đối tượng Bean ánh xạ dữ liệu từ môi trường ngoài như các dòng dữ liệu trong bảng (table) dữ liệu chẳng hạn. Nếu Bean thao tác (session bean) chủ yếu thiên về xử lý tính toán và hoàn thành một tác vụ nào đó thì Bean thực thể thiên về thể hiện dữ liệu. Trong bean thực thể, chúng ta có thể có các phương thức tính toán kèm theo, chúng được gọi là các phương thức nghiệp vụ (business method) xử lý dữ liệu của Bean.
Tuy nhiên, chúng ta cũng có thể chỉ dùng Bean thực thể để trình bày dữ liệu. Điểm khác biệt lớn nhất giữa Bean thực thể và Bean thao tác đó là Bean thực thể có khả năng lưu trữ và tái tạo lại bản thân Bean từ cơ sở dữ liệu. Đặc tính này thường gọi là khả năng tồn tại và lưu trữ được (persistence). Có hai loại Bean thực thể: Bean thực thể quản lý (Bean-Managed Persistence) và Bean thực thể quản lý bởi trình chứa
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
(Container-Managed Persistence). Sau đây là những ưu và khuyết điểm của hai loại Bean thực thể:
• Container - Managed Persistence (Bean thực thể được quản lý bởi trình chứa):
Ngoài những lợi ích đã nói ở trên thì nó cũng có một số các khó khăn sau : - Cần phải thành thạo EJB Query Language (Ngôn ngữ truy vấn EJB). - Mỗi trình chứa EJB đều có cách riêng trong việc ánh xạ thực thể và table
trong cơ sở dữ liệu. Thành thạo với việc ánh xạ của trình chứa không phải là chuyện đơn giản.
- Tốc độ chạy sẽ chậm hơn so với việc sử dụng trực tiếp câu lệnh SQL. - Điểm cuối cùng nhưng cũng rất quan trọng đó là debug cũng gặp nhiều
khó khăn, nhất là khi persistence layer không cho phép in ra những câu lệnh SQL do nó tạo ra.
• Sử dụng trực tiếp SQL hay Bean-Managed Persistence (Bean thực thể quản lý) : đòi hỏi sự thành thạo với SQL và rất khó khăn trong việc thay đổi cơ sở dữ liệu. Bên cạnh những khó khăn này nó cũng có những thuận lợi sau:
- Sử dụng SQL tránh được việc phải thành thạo ngôn ngữ truy vấn EJB và cách ánh xạ cho một persistence layer.
- Chạy nhanh hơn và dễ debug hơn.
Một khó khăn thường gặp khi sử dụng trực tiếp SQL là việc cập nhật cơ sở dữ liệu. Làm thế nào chỉ để cập nhật những cột có giá trị thay đổi chứ không phải toàn bộ các cột của một row trong table. May mắn là cũng có giải pháp cho vấn đề này. Cũng giống như việc ngắt kết nối Recorset trong microsoft, JDBC 2.0 cũng có RowSet (cung cấp bởi Sun và có tên là CachedRowSet). CatchedRowSet tự động cập nhật những column thay đổi và người sử dụng không cần phải viết một dòng lệnh SQL nào.
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 2: TRIỂN KHAI ĐỐI TƯỢNG BEAN EJB
2.8 ENTERPRISE JAVA BEAN VÀ SỰ HỖ TRỢ CỦA CÁC TRÌNH CHỦ KHÁC
Các trình chủ hổ trợ kiến trúc Enterprise Java Bean hiện có : Weblogic, Inprise Application Server (IAS), Oracle Application Server (OAS), JRun, IPlanet, WebSphere, Jboss… J2EE chỉ là một phần cài đặt của đặc tả EJB. Mỗi trình chủ đều kèm theo trình đóng gói deploytool thích hợp để chúng ta biên dịch, đóng gói và đưa các lớp cần thiết của Bean vào trình chứa. Các công cụ của những trình chủ khác nhau có thể cung cấp cách xây dựng và đóng gói Bean (tập tin .jar) vào những thư mục qui định khác nhau trong trình chủ (chúng ta nên tìm hiểu tài liệu của chúng).
Một ứng dụng thương mại thật sự thường chúng ta không nên dùng J2EE (có sẵn trong bộ Java JDK Enterprise) mà nên tận dụng các tính năng cao cấp cũng như sự hổ trợ từ phía các trình chủ như IAS hay OAS. Chúng là các trình chủ thương mại nên đáp ứng được cụ thể mục đích sử dụng và cách thiết kế chương trình cho khách hàng hơn. Ví dụ IAS (của Inprise) cung cấp cho chúng ta dịch vụ Web kết hợp với xây dựng các ứng dụng phân tầng Java, đóng gói các thành phần Bean, thiết kế Bean thực thể dựa vào cơ sở dữ liệu InterBase, cài đặt đối tượng Corba dựa trên trình môi giới Visio- Broker. Hoặc OAS hoàn toàn dựa trên nền và phong cách xây dựng đối tượng của hệ cơ sở dữ liệu Oracle…
ĐỒ ÁN TỐT NGHIỆP CHƯƠNG 3: TỔNG KẾT
CHƯƠNG 3 TỔNG KẾT
Phần này đã giới thiệu với chúng ta về kiến trúc của Enterprise Java Bean (EJB) mà Sun đưa ra từ phiên bản Java 1.2. Đây là mô hình phân tầng và lập trình đối tượng rất hiệu quả cho các ứng dụng mạng Java. Chúng ta xây dựng đối tượng (được gọi là các thành phần Bean) hoạt động bên trong trình chứa (container). Trình chứa đóng vai trò điều khiển và làm trung gian trong giao tiếp giữa Bean và trình khách. Tóm tắt có hai loại Bean : Bean thao tác (Session Bean) và Bean thực thể (Entity Bean). Bean thao tác có thể phi trạng thái (Stateless) hoặc lưu vết trạng thái (Stateful).
Bean thực thể cũng được phân ra làm hai loại đó là Bean thực thể quản lý kết nối dữ liệu (Bean-managed) và Bean thực thể quản lý dữ liệu bởi trình chứa (container- managed Bean). Các bước xây dựng Bean cơ bản gồm có : Xây dựng lớp giao tiếp xa (remote interface) để trình triệu gọi đến Bean, xây dựng lớp giao tiếp chủ (home interface) để trình chứa có thể tham chiếu đến Bean và cuối cùng là xây dựng đối tượng Bean. Ngày nay công nghệ lập trình đã chuyển hướng rất nhanh sang mô hình lập trình mạng đa tầng (multi-tier). Hiểu về Enterprise Java Bean sẽ giúp chúng ta dễ