33
CHƯƠNG 4 THÀNH PHN EJB (ENTERPRISE JAVA BEAN) Tài liu dành cho môn Phân tích thiết kế, Lp D07CNTT, Hc vin CNBCVT Mc tiêu ca chương này: Gii thiu J2EE framework và kiến trúc EJB Gii thiu các khái nim vThành phn EJB và môi trường runtime ca nó Tho lun vcác kiu cThành phn EJB, kết ni và vic trin khai ca chúng Gii thiu các tính năng ca EJB 2.x và các tính năng mi ca EJB 3.0 Phân bit gia li gi hàm đồng bvà không đồng b. Cung cp hướng dn tng bước để xây dng, trin khai và sdng Thành phn EJB 4.1. KIN TRÚC EJB 4.1.1. Tng quan vến trúc EJB và J2EE platform Sun Microsystems Inc công bđặc tEnterprise Java Bean (EJB) ca hvào năm 1998. Đặc tmi ca EJB 2.1 được công bvào năm 2002. Kiến trúc EJB 2.x là kiến trúc thành phn dành cho vic phát trin và trin khai các ng dng phân tán hướng thành phn. Mt Thành phn EJB là thành phn có khnăng sdng li, WORA (viết mt ln chy mi nơi), khnăng di động, tính co dãn, và thành phn đã được biên dch có thđược trin khai trên bt kserver EJB nào như là Java 2 platform edition (J2EE), Jboss, và môi trường WebLogic Enterprise. Công nghEJB là mt phn ca J2EE, nó cung cp mt tp API và các dch vkhác. Vic cài đặt EJB tp trung vào logic nghip v. J2EE được thiết kế để htrcác ng dng doanh nghip cung cp các dch vthương mi. J2EE không chhtrEJB mà còn htrcác thành phn Web như là JSP và servlets. Kiến trúc EJB giúp cho vic phát trin các ng dng doanh nghip ddàng hơn vì chúng không cn quan tâm đến các dch vmc hthng như là qun lý giao dch, qun lý bo mt, qun lý đa lung, và các vn đề qun lý chung khác. Kiến trúc EJB htrWORA và các gii pháp di động. Mt EJB thành phn có thđược phát trin mt ln sau đó có thsdng li trong nhiu ng dng và trin khai trên nhiu nn tng khác nhau mà không phi biên dch và sa li mã ngun ca Thành phn EJB. Mt Thành phn EJB là mt thành phn phía server cung cp các dch vcho điu khin txa hoc client cc b, trong khi mt java bean là mt thành phn phía client được cài đặt và chy hu hết phía client. Chúng ta có thcó mt Java bean phía server nhưng khó có thcung cp các

Chuong 4 - EJB

Embed Size (px)

Citation preview

Page 1: Chuong 4 - EJB

CHƯƠNG 4 THÀNH PHẦN EJB (ENTERPRISE JAVA BEAN)

Tài liệu dành cho môn Phân tích thiết kế, Lớp D07CNTT, Học viện CNBCVT

Mục tiêu của chương này:

• Giới thiệu J2EE framework và kiến trúc EJB

• Giới thiệu các khái niệm về Thành phần EJB và môi trường runtime của nó

• Thảo luận về các kiểu cả Thành phần EJB, kết nối và việc triển khai của chúng

• Giới thiệu các tính năng của EJB 2.x và các tính năng mới của EJB 3.0

• Phân biệt giữa lời gọi hàm đồng bộ và không đồng bộ.

• Cung cấp hướng dẫn từng bước để xây dựng, triển khai và sử dụng Thành phần EJB

4.1. KIẾN TRÚC EJB 4.1.1. Tổng quan về kíến trúc EJB và J2EE platform Sun Microsystems Inc công bố đặc tả Enterprise Java Bean (EJB) của họ vào năm 1998. Đặc tả mới của EJB 2.1 được công bố vào năm 2002. Kiến trúc EJB 2.x là kiến trúc thành phần dành cho việc phát triển và triển khai các ứng dụng phân tán hướng thành phần. Một Thành phần EJB là thành phần có khả năng sử dụng lại, WORA (viết một lần chạy mọi nơi), khả năng di động, tính co dãn, và thành phần đã được biên dịch có thể được triển khai trên bất kỳ server EJB nào như là Java 2 platform edition (J2EE), Jboss, và môi trường WebLogic Enterprise. Công nghệ EJB là một phần của J2EE, nó cung cấp một tập API và các dịch vụ khác. Việc cài đặt EJB tập trung vào logic nghiệp vụ. J2EE được thiết kế để hỗ trợ các ứng dụng doanh nghiệp cung cấp các dịch vụ thương mại. J2EE không chỉ hỗ trợ EJB mà còn hỗ trợ các thành phần Web như là JSP và servlets.

Kiến trúc EJB giúp cho việc phát triển các ứng dụng doanh nghiệp dễ dàng hơn vì chúng không cần quan tâm đến các dịch vụ mức hệ thống như là quản lý giao dịch, quản lý bảo mật, quản lý đa luồng, và các vấn đề quản lý chung khác. Kiến trúc EJB hỗ trợ WORA và các giải pháp di động. Một EJB thành phần có thể được phát triển một lần sau đó có thể sử dụng lại trong nhiều ứng dụng và triển khai trên nhiều nền tảng khác nhau mà không phải biên dịch và sửa lại mã nguồn của Thành phần EJB. Một Thành phần EJB là một thành phần phía server cung cấp các dịch vụ cho điều khiển từ xa hoặc client cục bộ, trong khi một java bean là một thành phần phía client được cài đặt và chạy hầu hết ở phía client. Chúng ta có thể có một Java bean phía server nhưng khó có thể cung cấp các

Page 2: Chuong 4 - EJB

dịch vụ cho các client từ xa. Một Thành phần EJB được chứa bởi container của nó và container được hỗ trợ bởi J2EE hoặc bất kì công cụ tuân theo J2EE. 4.1.2. J2EE Server J2EE servier cung cấp một số dịch vụ sau:

• Java Naming and Directory Interface (JNDI) API cho phép các client tìm kiếm và xác định vị trí container, nơi các thành phần EJB được đăng kí và chứa.

• J2EE hỗ trợ xác thực và uỷ quyền cho các vấn đề bảo mật. • J2EE hỗ trợ dịch vụ HTTP và các dịch vụ liên quan đến EJB, các dịch vụ đa

luồng…

Hình 4.1. Kiến trúc J2EE

4.1.3. EJB Container Một thể hiện EJB được chạy trên một EJB container. Container là môi trường chạy (tập các file class được sinh ra trong quá trình phát triển) nó điều khiển một thể hiện Thành phần EJB và cung cấp tất cả các dịch vụ quản lý cần thiết cho toàn bộ vòng đời của nó. Phía dưới là một danh sách các dịch vụ như vậy:

• Quản lý giao tác: đảm bảo các đặc tính giao tác của việc các thực thi giao tác phân tán.

• Quản lý lưu trữ bền vững: đảm bảo trạng thái bền vững của một entity bean được sao lưu bởi cơ sở dữ liệu.

• Quản lý vòng đời : đảm bảo sự dịch chuyển trạng thái của Thành phần EJB trong vòng đời của nó .

Hình 4.2. EJB container

Page 3: Chuong 4 - EJB

EJB container cung cấp một giao diện cho Thành phần EJB để giao tiếp với thế giới bên ngoài. Tất cả các yêu cầu tới Thành phần EJB hay các đáp ứng từ Thành phần EJB đều phải thông qua EJB container. EJB container cô lập Thành phần EJB để nó không bị truy nhập trực tiếp từ các client của nó. Container sẽ chặn lời gọi từ client để đảm bảo tính bền vững, các đặc tính giao tác, và an ninh của các hoạt động của client trên EJB. Hình 4.2 chỉ ra rằng EJB hỗ trợ EJB componenet và một Thành phần EJB cần container để đi ra bên ngoài và để nhận các thông tin cần thiết từ giao diện ngữ cảnh của nó. EJB container có tránh nhiệm tạo ra các đối tượng EJB home., giúp cho việc xác định, tạo ra, và xóa bỏ các đối tượng Thành phần EJB. Giao diện ngữ cảnh EJB cung cấp bởi EJB container đóng gói các thông tin liên quan về môi trường của container như là dịnh danh của một Thành phần EJB, các trạng thái của giao tác, và tham chiếu từ xa tới EJB ...

4.1.4. Thành phần EJB Một enterprise bean là một thành phần phân tán sống trong một EJB container và được truy cập bởi client từ trên mạng thông qua giao diện từ xa của nó hoặc được truy nhập thông qua enterprise bean khác trên cùng server thông qua giao diện local của nó. Thành phần EJB là một thành phần có khả năng thực thi từ xa được triển khai trên server của nó và có khả năng tự mô tả được chỉ ra bởi Deployment Descriptor (DD) với định dạng XML.

4.2. MÔ HÌNH THÀNH PHầN CỦA EJB 4.2.1. Tổng quan và EJB 2.x Mỗi Thành phần EJB có một giao diện logic nghiệp vụ được tạo ra bởi thành phần đó nên các client có thể truy cập vào các thao tác logic nghiệp vụ thông qua giao diện này mà không cần phải biết cài đặt chi tiết đằng sau giao diện đó. Chúng ta gọi giao diện như vậy là một remote interface. Một thể hiện của Thành phần EJB được tạo ra và quản lý thông qua home interface của nó bởi EJB container. Mỗi enterprise bean phải có một home interface và một remote interface. Thành phần EJB có thể được cấu hình tại thời gian triển khai bằng đặc tả DD của nó. Hình 4.3 mô tả cấu trúc của một Thành phần EJB và biểu đồ quá trình của một tương tác giữa một client và một Thành phần EJB.

Page 4: Chuong 4 - EJB

Hình 4.3. Tương tác giữa client và Thành phần EJB

Lớp EJB đằng sau các giao diện home và remote được thiết kế để thực thi 2 giao diện. Một Thành phần EJB là một thành phần hộp đen (black – box thành phần). Client của một Thành phần EJB chỉ biết thành phần nào chứ không biết nó như thế nào. Client tạo một yêu cầu tới Thành phần EJB với tên được triển khai của nó bằng việc tìm kiếm trong JNDI để lấy tham chiếu tham chiếu đối tượng của Thành phần EJB. Client sau đó có thể tạo một thể hiện của Thành phần EJB này trên server theo tham chiếu đối tượng. Cuối cùng, client gọi các phương thức của thể hiện EJB này. Tất nhiên một EJB phải đăng kí với JNDI để các client có thể tìm kiếm nó.

Các Enterprise bean là các thành phần phần mềm có thể được nhúng trong nhiều ứng dụng khác nhau mà không cần phải dịch lại hoặc thay đổi mã nguồn của chúng. Chúng có thể được triển khai trong nhiều máy chủ tuân theo EJB. Mô hình Thành phần EJB hỗ trợ những loại enterprise bean sau:

• Stateless session bean thực thi nhiều logic nghiệp vụ khác nhau, như phiên dịch ngôn ngữ, quá trình đăng nhập, tính toán thuế và chuyển đổi tiền tệ.

• Stateless session bean được đóng gói trong một Web service. Bất kì một enterprise bean đang tồn tại nào cũng có thể đóng gói trong một Web service bên ngoài bằng một tài liệu WSDL mô tả điểm cuối Web service mà bean đó thực thi. Những bean đặc biệt như vậy dùng cho các Web service không cung cấp các giao diện mà một Thành phần EJB thường cung cấp.

• Stateful session bean cũng đảm trách cùng một vai trò như các stateless session bean ngoại trừ chúng theo vết các trạng thái của việc giao tiếp giữa từ các client tới các Thành phần EJB. Ví dụ, một shopping cart bean có thể là một session bean có trạng thái điển hình.

Bất cứ mộtt session bean cho dù là có trạng thái hay không trạng thái cũng không hỗ trợ các yêu cầu lâu bền cho một entity bean trong nền tảng kiến trúc Thành phần EJB:

Page 5: Chuong 4 - EJB

• Message – driven bean đã được giới thiệu ở trên, biểu diễn một loại Thành phần EJB mới làm việc trong chế độ giao tiếp bất đồng bộ giống như mô hình ủy quyền sự kiện hướng sự kiện (event – driven event delegation model) trong Java.

• Bean Managed Persistence (BMP) là các entity bean trong khi việc quản trị lưu trữ lâu dài của chúng được quan tâm bởi chính bản thân chúng.

• Container Managed Persistence là các entity bean trong đó việc quản trị lưu trữ lâu dài của chúng được đặc tả bởi công cụ triển khai và được quản lý bởi container. Tuy nhiên các entity bean CMP không cần xử lý bất kì việc truy xuất cơ sở dữ liệu SQL nào. Một entity bean được phục hồi lại bởi cơ sở dữ liệu quan hệ.

Remote interface của một Thành phần EJB thực thi giao diên javax.ejb.EJBObject sau đó thực thi giao diện java.rmi.Remote. Home interface của một Thành phần EJB thực thi giao diện javax.ejb.EJBHome, sau đó lại thực thi giao diện java.rmi.remote. Local interface thực thi giao diện javax.ejb.EJBLocalObject và một local home interface thực thi giao diện javax.ejb.EJBLocalHome. Local interface được sử dụng bởi Thành phần EJB khác chạy trên cùng một server để truy nhập nó nên nó có thể giảm chi phí gây ra bởi việc truy cập ở xa. Remote interface cung cấp sự độc lập vị trí nhưng đắt hơn. Các local interface tạo lời gọi có hiệu quả hơn. Điểm khác biệt quan trọng khác giữa các giao diện cục bộ và ở xa đó là việc gọi phương thức trong giao diện cục bộ sử dụng việc truyền bằng tham chiếu và việc gọi giao diện ở xa sử dụng việc truyền bằng giá rị, mà cần phải tuần tự hóa, đó là tổ chức và vô tổ chức.

4.2.2. EJB 3.0 Các đặc tính mới của EJB 3.0:

• Định nghĩa các Java language meta data annotation có thể được sử dụng để chú giải (annotate) các ứng dụng EJB. Các metadata annotation này làm đơn giản hoá công việc của những nhà phát triển, giảm số lớp và giao diện cần phải cài đặt và người phát triển không cần cung cấp một file mô tả triển khai (deployment descriptior).

• Đóng gói các phụ thuộc môi trường và truy cập JNDI thông qua việc sử dụng các annotaion, các cơ chế tiêm các phụ thuộc (dependency injection) và các cơ chế tìm kiếm đơn giản.

• Đơn giản hoá các kiểu enterprise bean.

• Không cần thiết các giao diện cho session bean. Giao diện nghiệp vụ cho một session bean có thể là một java interface đơn thuần không cần phải là một interface EJBObject, EJBLocalObject, hoặc java.rmi.Remote.

• Loại bỏ các yêu cầu cho home interface của session bean.

Page 6: Chuong 4 - EJB

• Đơn giản hoá các entity bean. Hỗ trợ mô hình hoá miền hạng nhẹ, cung cấp kế thừa và đa hình.

• Loại bỏ tất cả các giao diện cho persistent entity.

• Đặc tả các Java language metadata annotaion và XML deployment descriptor cho việc ánh xạ các quan hệ của persistent entity.

Các ví dụ dưới đây sẽ sử dụng cả EJB 3.0 và EJB 2.x. 4.2.3. Session bean Một sesion bean biểu diễn một client đơn bên trong Application Server. Để truy xuất một ứng dụng được triển khai trên server, client gọi các phương thức của session bean. Session bean thực hiện công việc cho các client của nó. Tránh cho client phải thực hiện các công việc phức tạp, thay vì đó nó sẽ được thực hiện trên server. Giống như tên của nó, session bean giống như một phiên tương tác (interactive session). Một session bean không thể chia sẻ, nó chỉ có thể có một client. Giống như một phiên tương tác, một session bean không persistent (dữ liệu của nó không được lưu vào cơ sở dữ liệu). Khi client gắt, session bean của nó cũng bị ngắt, nó không kết nối lâu dài với client. Có 2 kiểu session bean đó là stateful và stateless:

• Stateful session bean: Trạng thái của một đối tượng bao gồm giá trị của các biến. Trong một stateful session bean, các giá trị biểu diễn trạng thái của một session bean cho duy nhất một client. Vì client tương tác với bean của nó, trạng thái này thường được gọi là trạng thái đàm thoại. Trạng thái này được duy trì trong suốt phiên làm việc giữa client và bean. Nếu client loại bỏ bean hoặc ngắt, phiên kết thúc và các trạng thái sẽ mất.

• Stateless session bean: không duy trì trạng thái đàm thoại với client. Khi một client gọi các phương thức của một client không trạng thái, các biến của bean có thể chứa một trạng thái cụ thể cho một client, nhưng chỉ trong thời gian của lời gọi. Khi phương thực hoàn thành, trạng thái này sẽ bị mất. Tuy nhiên, các cleint có thể thay đổi trạng thái của các biện trong stateless bean được pool (pooled stateless bean), trạng thái này sẽ được giữ đến lời gọi tiếp theo của pooled stateless bean. Vì stateless session bean có thể hỗ trợ nhiều client, chúng có thể đưa ra tính khả chuyển hơn cho các ứng dụng đòi hỏi số client lớn. Đặc biệt, một ứng dụng yêu cầu ít stateless session bean hơn stateful session bean để hỗ trợ cùng số client.

Ví dụ về stateless session bean, bean này thực hiện việc chuyển đổi độ F sang độ C và ngược lại. //remote interface: Converter package converter.ejb; import javax.ejb.Remote; @Remote

Page 7: Chuong 4 - EJB

public interface Converter { public double cToF(double c); public double fToC(double f); } //stateless session bean: ConverterBean package converter.ejb; import javax.ejb.Stateless; @Stateless public class ConverterBean implements Converter { @Override public double cToF(double c) { return c * 9/5 + 32; } @Override public double fToC(double f) { return (f - 32) * 5/9; } }

4.2.4. EJB Web Service Thành phần Một web service client có thể truy xuất một ứng dụng Java EE theo 2 cách. Một là, client có thể truy xuất một web service được tạo với JAX-WS. Hai là, một web service client có thể gọi phương thức của một stateless session bean. Web service sử dụng các giao thức (SOAP, HTTP, WSDL), bất kì web service client nào cũng có thể truy cập một stateless session bean, client có thể được viết bằng ngôn ngữ Java hoặc một ngôn ngữ khác. Client không cần biết công nghệ cài đặt các service: stateless session bean, JAX – WS, hoặc các công nghệ khác. Thêm nữa, các enterprise bean và các thành phần web có thể là các client của web service. Tính linh hoạt này cho phép bạn tích hợp các ứng dụng Java EE với web service.

Một web service client có thể truy xuất một stateless session bean thông qua lớp cài đặt điểm cuối web service của bean. Tất cả các phương thức public trong bean có thể được truy cập bởi các web service client. Dưới đây là ví dụ HelloService, dịch vụ web HelloService là một stateless session bean.

Package ejb.service; import javax.ejb.Stateless; import javax.jws.WebMethod; import javax.jws.WebService; @Stateless @WebService public class HelloServiceBean { private String message = "Hello, ";

Page 8: Chuong 4 - EJB

public void HelloServiceBean() { } @WebMethod public String sayHello(String name) { return message + name + "."; } }

4.2.5. Entity Bean Một entity bean biểu diễn một dữ liệu bền được sao lưu bởi một cơ sở dữ liệu. Các sinh viên, các giáo viên, và các khóa học là những ví dụ của entity bean. Mỗi entity bean có một bảng trong cơ sở dữ liệu và mỗi thể hiện của bean được lưu giữ trong một hàng của bảng. Một entity không tương ứng với bất kỳ một khách hàng cụ thể nào. Nó cung cấp một truy cập được chia sẻ. Nó được hỗ trợ bởi dịch vụ giao tác EJB qua container của nó. Nó có một trạng thái bền với một định danh khóa chính duy nhất, có thể được sử dụng bởi một client để xác định vị trí một entity bean cụ thể.

Với EJB 2.x, có 2 loại entity bean :các entity bean Bean Managed Persistence (BMP) và các entity bean Container Managed Persistence (CMP). Đây là một ví dụ của entity bean BMP sinh viên. Một bảng cơ sở dữ liệu phải được tạo bằng SQL : CREATE TABLE student (id VARCHAR(3) CONSTRAINT pk_student PRIMARY KEY, gpa Number(2,1) ); //The following is the home interface for this student BMP entity //bean. import javax.ejb.*; import java.util.*; public interface StudentHome extends EJBHome { public Student create(String id, double gpa) throws RemoteException, CreateException; public Account findByPrimaryKey(String id) throws FinderException, RemoteException; } //The following code is the remote interface for this student BMP //entity bean. import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Student extends EJBObject { public double getGpa() throws RemoteException; } //The following is the BMP implementation entity bean where SQL //statements are explicitly included. import java.sql.*; import javax.sql.*; import java.util.*; import javax.ejb.*;

Page 9: Chuong 4 - EJB

import javax.naming.*; public class StudentEJB implements EntityBean { private String id; private double gpa; private EntityContext context; private Connection con; private String dbName = "java:comp/env/jdbc/StudentDB"; public double getGpa() { return gpa; } //The following ejb callback methods are executed by EJB //container. The Detailed references are in this chapter //reference.[1] //When a new bean instance is created the method ejbCreate() // is automatically called by the container to insert a row in a //corresponding table in the database. public String ejbCreate(String id, double gpa) throws CreateException { try { insertRow(id, gpa); } catch (Exception ex) { throw new EJBException("ejbCreate: "); } this.id = id; this.gpa = gpa; return id; } public String ejbFindByPrimaryKey(String primaryKey) throws FinderException { boolean result; try { result = selectByPrimaryKey(primaryKey); } catch (Exception ex) { throw new EJBException("ejbFindByPrimaryKey: "); } if (result) { return primaryKey; } else { throw new ObjectNotFoundException ("Row for id " + primaryKey + " not found."); } } public void ejbRemove() { try { deleteRow(id); } catch (Exception ex) {

Page 10: Chuong 4 - EJB

throw new EJBException("ejbRemove: "); } } public void setEntityContext(EntityContext context) { this.context = context; try { makeConnection(); } catch (Exception ex) { throw new EJBException("Failed to connect todatabase.”); } } public void ejbActivate() { id = (String)context.getPrimaryKey(); } public void ejbPassivate() { id = null; } public void ejbLoad() { try { loadRow(); } catch (Exception ex) { throw new EJBException("ejbLoad: "); } } public void ejbStore() { try { storeRow(); } catch (Exception ex) { throw new EJBException("ejbLoad: " ); } } public void ejbPostCreate(String id, double gpa) { } void makeConnection() throws NamingException, SQLException { InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup(dbName); con = ds.getConnection(); } //The following methods are callback methods to invoke SQL //statements to access database void insertRow (String id, double gpa) throws SQLException { String insertStatement = "insert into student values(?,? )"; PreparedStatement prepStmt = con.prepareStatement(insertStatement);

Page 11: Chuong 4 - EJB

prepStmt.setString(1, id); prepStmt.setDouble(2, gpa); prepStmt.executeUpdate(); prepStmt.close(); } void deleteRow(String id) throws SQLException { String deleteStatement = "delete from student where id = ?"; PreparedStatement prepStmt=con.prepareStatement(deleteStatement); prepStmt.setString(1, id); prepStmt.executeUpdate(); prepStmt.close(); } boolean selectByPrimaryKey(String primaryKey) throws SQLException { String selectStatement="select id "+"from student where id =? "; PreparedStatement prepStmt = con.prepareStatement(selectStatement); prepStmt.setString(1, primaryKey); ResultSet rs = prepStmt.executeQuery(); boolean result = rs.next(); prepStmt.close(); return result; } void loadRow() throws SQLException { String selectStatement = "select gpa " + "from student where id = ? "; PreparedStatement prepStmt = con.prepareStatement(selectStatement); prepStmt.setString(1, this.id); ResultSet rs = prepStmt.executeQuery(); if (rs.next()) { this.gpa = rs.getDouble(2); prepStmt.close(); } else { prepStmt.close(); throw new NoSuchEntityException(id + " not found."); } } void storeRow() throws SQLException { String updateStatement = "update student set gpa = ? " + "where id = ?"; PreparedStatement prepStmt = con.prepareStatement(updateStatement); prepStmt.setDouble(1, gpa);

Page 12: Chuong 4 - EJB

prepStmt.setString(2, id); int rowCount = prepStmt.executeUpdate(); prepStmt.close(); if (rowCount == 0) { throw new EJBException("Store id " + id + " failed."); } } }

Với JavaEE 5 có thể sử dụng JPA (Java Persistent API) để tạo ra các entity ánh xạ vào các bảng trong cở sở dữ liệu. Ví dụ dưới đây là một entity bean BookEntity và một stateless session bean BookBean có các phương thức tạo, xoá, sửa, tìm kiếm thông tin sách trong cơ sở dữ liệu. //EntityBean: BookEntity package ejb.book; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQuery; @Entity @NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b") public class BookEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable = false) private String title; private float price; @Column(length = 2000) private String description; private String isbn; private int nbOfPage; private boolean illustrations; public BookEntity() { } public BookEntity(Long id, String title, float price, String description, String isbn, int nbOfPage, boolean illustrations) { this.id = id; this.title = title; this.price = price;

Page 13: Chuong 4 - EJB

this.description = description; this.isbn = isbn; this.nbOfPage = nbOfPage; this.illustrations = illustrations; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public boolean isIllustrations() { return illustrations; } public void setIllustrations(boolean illustrations) { this.illustrations = illustrations; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public int getNbOfPage() { return nbOfPage; } public void setNbOfPage(int nbOfPage) { this.nbOfPage = nbOfPage; } public float getPrice() { return price; } public void setPrice(float price) {

Page 14: Chuong 4 - EJB

this.price = price; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof BookEntity)) { return false; } BookEntity other = (BookEntity) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "com.me.bookws.Book[id=" + id + "]"; } } //Remote Interface: BookRemote package ejb.book; import java.util.List; import javax.ejb.Remote; @Remote public interface BookRemote { void create(BookEntity book); void edit(BookEntity book);

Page 15: Chuong 4 - EJB

void remove(BookEntity book); BookEntity find(Object id); List<BookEntity> findAll(); List<BookEntity> findRange(int[] range); int count(); } //Stateless session bean: BookBean package ejb.book; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; @Stateless public class BookBean implements BookRemote { @PersistenceContext(unitName = "BookWSPU") private EntityManager em; public void create(BookEntity book) { em.persist(book); } public void edit(BookEntity book) { em.merge(book); } public void remove(BookEntity book) { em.remove(em.merge(book)); } public BookEntity find(Object id) { return em.find(BookEntity.class, id); } public List<BookEntity> findAll() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(BookEntity.class)); return em.createQuery(cq).getResultList(); }

Page 16: Chuong 4 - EJB

public List<BookEntity> findRange(int[] range) { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(BookEntity.class)); Query q = em.createQuery(cq); q.setMaxResults(range[1] - range[0]); q.setFirstResult(range[0]); return q.getResultList(); } public int count() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); Root<BookEntity> rt = cq.from(BookEntity.class); cq.select(em.getCriteriaBuilder().count(rt)); Query q = em.createQuery(cq); return ((Long) q.getSingleResult()).intValue(); } }

4.2.6. Message-Driven Beans (MDB) Một message – driven bean là một enterprise bean cho phép các ứng dụng Java EE xử lý các message theo cách không đồng bộ. Nó hoạt động như một bộ lắng nghe thông điệp JMS, nó giống như bộ như một bộ lắng nghe sự kiện trừ khi nó nhận các thông điệp JMS theo các sự kiện. Các thông điệp có thể được gửi bởi bất kì thành phần Java EE nào (các ứng dụng client, một enterprise bean khác, web thành phần) hoặc bởi một ứng dụng JMS hoặc hệ thống không sử dụng công nghệ Java. Message – drivent bean có thể xưửlý các thông điệp JMS hoặc các kiểu thông điệp khác.

Message – driven bean có thể làm việc theo cách khác nhau: PTP (point to point) và nhà xuất bản/ người đăng ký (publisher/subcriber). PTP làm việc trong chế độ một – một (one-to-one) và publisher/subscriber làm việc ở trong chế độ quảng bá (một - nhiều :one-to-many). Công nghệ MDB làm việc trong chế độ không đồng bộ trong đó một thông báo có thể được nhận bởi một MDB thành phần và các phản ứng của nó có thể ngay lập tức hoặc lâu. Một MDB thành phần làm việc theo cách sau :

• Container đăng ký MDB thành phần này với JMS

• JMS đăng kí tất cả các đích JMS với Java Naming và Directory Interface (JNDI).

• EJB container thể hiện MDB thành phần này

• Client tìm kiếm đích với MDB

• Client gửi thông điệp đến đích

• EJB container chọn MDB tương ứng để xử lý gói tin MDB thành phần làm việc trong chế độ publisher/subscriber không đồng bộ và loại thông điệp có thể là tin nhắn văn bản, các tin nhắn đối tượng, tin nhắn dòng, hoặc tin nhắn byte.

Page 17: Chuong 4 - EJB

Các gói tin được đẩy và xử lý trong một phương thức MessageListener được gọi là onMessage(). Ví dụ dưới đây xây dựng một Message – driven bean xử lý các thông điệp văn bản đến (TextMessage).

//MessageDrivenBean: SimpleMessageBean package ejb.mdb; import javax.ejb.MessageDriven; import javax.ejb.MessageDrivenContext; import javax.jms.MessageListener; import javax.jms.Message; import javax.jms.TextMessage; import javax.jms.JMSException; import javax.annotation.Resource; @MessageDriven(mappedName = "jms/Queue") public class SimpleMessageBean implements MessageListener { @Resource private MessageDrivenContext mdc; public SimpleMessageBean() { } @Override public void onMessage(Message inMessage) { TextMessage msg = null; try { if (inMessage instanceof TextMessage) { msg = (TextMessage) inMessage; System.out.println("MESSAGE BEAN: Message received: " + msg.getText()); } else { System.out.println( "Message of wrong type: " + inMessage.getClass().getName()); } } catch (JMSException e) { e.printStackTrace(); mdc.setRollbackOnly(); } catch (Throwable te) { te.printStackTrace(); } } }

4.3. MÔ HÌNH KẾT NỐI CỦA EJB Trong phần này, chúng ta sẽ thảo luận về các cơ chế kết nối giữa các thành phần EJB. Chúng ta sẽ tìm hiểu cách liên kết thành phần cơ bản thành các khối để tạo thành các thành phần mới hoặc các ứng dụng mới. Mô hình kết nối của EJB đưa ra các hướng dẫn

Page 18: Chuong 4 - EJB

trong thiết kế các Thành phần EJB, các kết nối, và các giao tiếp giữa các thành phần. [thành phần 2004].

Để cho một đối tượng client Thành phần EJB nói với các đối tượng Thành phần EJB khác, client phải lấy được một đối tượng tham chiếu tới thành phần đích và một thể hiện từ xa (RMI). Điều này có thể được thấy từ ví dụ chuyển đổi nhiệt độ.

Có thể có các kết nối đồng bộ hoặc không đồng bộ giữa 2 EJB thành phầns thông qua interface từ xa hoặc cục bộ của các Thành phần EJB. Một Thành phần EJB cũng có thể được truy cập bằng J2EE Web thành phần cũng như một JavaBean thành phần, một Servlet thành phần, hoặc một JSP thành phần. Một EJB thành phần cũng có thể truy cập các đối tượng dữ liệu khác của EIS bằng JDBC. Hình 4.4 biểu thị một session bean phía trước kết nối với 2 entity bean phía sau bằng một cơ sở dữ liệu.

Hình 4.4. Kết nối giữa session bean và entity bean

4.3.1. Các kết nối đồng bộ được kết hợp kín Một lời gọi đồng bộ theo mô hình tương tác yêu cầu - phản hồi. Một client gọi một phương thức từ xa trong interface của đối tượng Thành phần EJB đích. Interface che dấu tất cả việc cài đặt chi tiết các phương thức logic nghiệp vụ của các client. Sau khi đối tượng Thành phần EJB đích kết thúc công việc của nó, nó sẽ đáp trả các yêu cầu bằng việc gửi kết quả hoặc nó có thể yêu cầu các dịch vụ khác từ các thành phần khác và chờ phản hồi rồi chuyển tới client.

Một ví dụ điển hình cho kiểu truyền thông này, một giỏ mua hàng session bean sẽ gửi một yêu cầu tới một entity bean và chờ bean xử lý và xác nhận. Sự tương tác đồng bộ làm cho sự kết hợp các Thành phần EJB thêm chặt chẽ. Khi một đối tượng client thành phần khởi tạo 1 yêu cầu, luồng yêu cầu được khóa cho đến khi nó nhận được trả

Page 19: Chuong 4 - EJB

lời từ Thành phần EJB đích. Hầu hết các ví dụ chúng ta đã thấy cho đến nay đều hoạt động ở chế độ đồng bộ.

4.3.2. Truyền thông không đồng bộ được kết nối lỏng lẻo Một truyền thông không đồng bộ gồm truyền thông dựa trên thông điệp giữa một Thành phần EJB và client của nó. Một client tạo một request tới một Thành phần EJB nhưng client không tự nó block. Thay vào đó nó duy trì tiến trình của mình. Có 2 hình thức của truyền thông không đồng bộ : PTP dựa trên hàng đợi (queue – based PTP) và quảng bá thông điệp dựa trên publish/subscribe (publish/subscribe – based message broadcasting). Truyền thông không đồng bộ dựa trên hàng đợi yêu cầu một hàng đợi thông điệp được hỗ trợ bởi JMS giữa client (người cung cấp message hoặc người gửi ) và người nhận message hoặc người dùng message. Còn phương pháp publisher/subscriber , người dùng đăng kí chủ đề (topic) trong đó người cung cấp đặt các message vào và một hoặc nhiều người dùng có thể nhận thông điệp từ chủ đề này. Trong truyền thông không đồng bộ , các client và server đều kết nối lỏng lẻo. Nó dẫn đến thông lượng tốt hơn.

4.3.3 Truyền thông Remote và Local Một thành phần client và server của nó có thể trên một máy hoặc trên các JVM khác nhau. Nếu 2 Thành phần EJB chạy trên cùng một máy, sẽ có chi phí thấp nhiều bởi sử dụng local interface so với sử dụng remote interface. Đó là việc tại sao EJB 2.x thêm các interface localHome và localObject vào remote interface. Một vài thực thể bean có thể cung cấp cả 2 interface remote và local trong EJB 2.x . Một session bean có thể đóng vai trò của thực thể bean, và một thực thể bean có thể biểu diễn trực tiếp với client hoặc thông qua một session bean hoặc được kết nối tới thực thể bean khác. Một local interface cho phép tham chiếu tới một phương thức trong mô hình truyền tham chiếu, trong khi một remote interface thực hiện nó trong mô hình truyền tham trị.

4.3.4. Các tham chiếu đối tượng đến các entity bean Để nói tới một entity bean đích, một stateless session bean phải tìm các thành phần được triển khai theo tên của nó đăng kí tại JNDI để lấy một tham chiếu đối tượng tới nó và có thể qua đó tham chiếu tới các bean khác. Một stateful session bean có thể giữ tham chiếu tới một thực thể bean trong một trạng thái đàm thoại. Một session bean hoặc MDB thành phần có thể giữ việc tham chiếu tới Thành phần EJB khác trong một thể hiện của bean của nó. Một entity bean BMP có thể giữ một tham chiếu tới entity bean khác trong phạm vi không lâu dài.

4.3.5. Liên kết các quan hệ kết nối giữa các entity bean Với EJB 2.x, mỗi thực thể bean lưu trữ bởi 1 bảng quan hệ. Mỗi thể hiện của một thực thể bean được lưu là 1 hàng trong bảng bất kể BMP hay CMP. Các quan hệ giữa các thực thể bean có thể một - một, một - nhiều , nhiều - nhiều, giống như các mối quan hệ dữ liệu trong một cơ sở dữ liệu được phản ánh trong biểu đồ E - R.

Page 20: Chuong 4 - EJB

Ví dụ, quan hệ giữa entity bean sinh viên (student) và entity bean khoá học (course) là một quan hệ nhiều – nhiều. Một sinh viên có thể có nhiều khóa học và một khóa học có thể có nhiều sinh viên. Thực hiện các thực thể bean này bằng CMP trong kiến trúc EJB 2.x . Giả sử có 2 thực thể bean CMP được triển khai tại một container như vậy local interface được sử dụng. package student; import java.util.*; import javax.ejb.CreateException; import javax.ejb.EntityBean; import javax.ejb.EntityContext; import javax.naming.Context; import javax.naming.InitialContext; public abstract class StudentBean implements EntityBean { private EntityContext context; //StudentID and StudentName are CMP fields public abstract String getStudentID(); //primary key public abstract void setStudentID(String id); public abstract String getName(); public abstract void setName(String lastName); //CMR(container-managed relationship) fields to course bean public abstract Collection getCourses(); public abstract void setCourses (Collection courses); //StudentBean next defines its business logic such that //getCourseList() //returns all corresponding courses this student has taken and //addCourse() will add a new course for this student. public ArrayList getCourseList() { ArrayList list = new ArrayList(); Iterator c = getCourses().iterator(); while (c.hasNext()) { list.add( (LocalCourse)c.next()); } return list; } public void addCourse (LocalCourse course) { getCourses().add(course); } } //Student Local Home Interface Here’s the LocalStudentHome home interface for the StudentBean: import javax.ejb.CreateException; import javax.ejb.EJBLocalHome; import javax.ejb.FinderException;

Page 21: Chuong 4 - EJB

public interface LocalStudentHome extends EJBLocalHome { public LocalStudent create (String studentID, String Name) throws CreateException; public LocalStudent findByPrimaryKey ( String studentID)throws FinderException; } } //The Student bean also defines a local interface. The bean’s //LocalStudent interface extends the EJBLocalObject interface //not the EJBObject interface. import java.util.ArrayList; import javax.ejb.EJBLocalObject; public interface LocalStudent extends EJBLocalObject { public String getStudentID(); public String getName(); public ArrayList getCourseList(); }

Ở đây chúng ta chỉ có danh sách entity CMP sinh viên, và entity bean CMP khóa học có cấu trúc rất giống nhau trừ trường cmp và cmr. Bean khoá học bao gồm các phương thức tương đương get và set tất cả các sinh viên được liên kết tới khóa học cụ thể. public abstract Collection getStudents();

public abstract void setStudents(Collection students);

DD chỉ rõ mối quan hệ enterprise bean. Công cụ triển khai có thể được sử dụng trong cả 2 lĩnh vực CMP và CMR , quan hệ bean-to-bean và code EJB SQL cho các phương pháp cụ thể.

Hình 4.5. Quan hệ kết nối giữa các entity bean

Trong hình 4.5, có 3 thực thể bean CMP. Dept có quan hệ một - nhiều với entity bean student và entity bean student có quan hệ nhiều – nhiều với entity bean Course. Tất cả

Page 22: Chuong 4 - EJB

quan hệ bean -bean, cmp và cmr, và việc thực thi của các phương thức trong SQL được định nghĩa bởi người triển khai sử dụng các công cụ triển khai. Trong sự so sánh, BMP đòi hỏi nhiều việc phải làm bởi người triển khai, trong khi CMP không đòi hỏi người lập trình cung cấp bất cứ mã SQL nào.

4.4. MÔ HÌNH TRIỂN KHAI EJB Một EJB componenet được đóng gói vào một flie .jar, sau đó nó sẽ được tổ hợp với các gói Web thành phần (.war) và các gói ứng dụng client J2EE trong file ứng dụng J2EE (.ear).

Sau khi viết code cho enterprise bean và client của nó, chúng ta cần dịch chúng thành các class file. Tiếp đó, chúng ta cần gói các Thành phần EJB, Web thành phần, hoặc client vào file nén java (.jar) hoặc Web archive file (.war) với flie DD XML của chúng và sau đó lắp ráp tất cả các phần này và nén thành một file enterprise (.ear) để được triển khai trên một server.

Một DD làm một file định nghĩa triển khai ở định dạng XML. Nó nêu ra các loại EJB, tên các class cho giao diện từ xa, giao diện home, việc cài đặt bean, đặc tả quản lý giao dịch, an ninh truy nhập, và các đặc tính bền vững của entity bean. DD được tạo tự động bởi các công cụ triển khai sau khi khung triển khai được hòan thành. Dưói đây là một phần nội dung của một DD: <?xml version=“1.0”> <ejb-jar> <enterprise-beans> <entity> <ejb-name>studentBean</ejb-name> <home>studenthome</home> <remote>student</remote> <ejb-class>Student</ejb-class> <persistence-type>Container</persistence-type> <pri-key-class>Integer</pri-key-class> ... <cmp-field><field-name>id</field-name></cmp-field> ... <cmp-field><field-name>name</field-name></cmp-field> </enterprise-beans> <assembly-descriptor> <security-role> ... </security-role> ... </assembly-descriptor> </ejb-jar>

Page 23: Chuong 4 - EJB

Hình 4.6. J2EE assembly và deployment

4.5. VÍ DỤ Phần này được thiết kế để nâng cao sự hiểu biết về các khái niệm EJB qua một ví dụ cụ thể và các chỉ dẫn từng bước giải thích làm thế nào để xây dựng các thành phần EJB, làm thế nào để kết hợp lại và triển khai các thành phần EJB. 4.5.1. Ví dụ Shopping Cart Session bean cart biểu diễn một shopping cart trong bookstore trực tuyến. Client của bean có thể thêm, xoá sách ra khỏi giỏ, lấy lại nội dung của giỏ sách. Cần xây dựng 2 file sau:

• Session bean class (CartBean)

• Remote business interface (Cart) Bước 1: Xây dựng Business Interface Cart business interface là một giao diện Java định nghĩa tất cả các phương thức được cài đặt trong lớp bean. Nếu lớp bean cài đặt một interface, thì interface được gọi là business interface. Business interface là một giao diện local interface trừ khi nó được đánh dấu với annotation javax.ejb.Remote. package cart.ejb; import cart.util.BookException; import java.util.List; import javax.ejb.Remote; @Remote public interface Cart { public void initialize(String person) throws BookException; public void initialize( String person,

Page 24: Chuong 4 - EJB

String id) throws BookException; public void addBook(String title); public void removeBook(String title) throws BookException; public List<String> getContents(); public void remove(); }

Tạo lớp bắt ngoại lệ BookException package cart.util; public class BookException extends Exception { public BookException() { } public BookException(String msg) { super(msg); } }

Bước 2: Xây dựng lớp Bean Giống như bất kì stateful session bean, CartBean phải đạt các yêu cầu sau:

• Class phải được chú thích @Stateful

• Class cài đặt các phương thức định nghĩa trong business interface Stateful session bean cũng có thể có:

• Thực thi business interface

• Cài đặt các phương thức life cycle callback, chú thích @PostConstruct, @PreDestroy, @PostActivate, @PrePassivate

• Cài đặt các phương thức tuỳ chọn chú thích @Remote Package cart.ejb; import cart.util.BookException; import cart.util.IdVerifier; import java.util.ArrayList; import java.util.List; import javax.ejb.Remove; import javax.ejb.Stateful; @Stateful() public class CartBean implements Cart { List<String> contents; String customerId; String customerName; public void initialize(String person) throws BookException { if (person == null) { throw new BookException("Null person not allowed."); } else {

Page 25: Chuong 4 - EJB

customerName = person; } customerId = "0"; contents = new ArrayList<String>(); } public void initialize( String person, String id) throws BookException { if (person == null) { throw new BookException("Null person not allowed."); } else { customerName = person; } IdVerifier idChecker = new IdVerifier(); if (idChecker.validate(id)) { customerId = id; } else { throw new BookException("Invalid id: " + id); } contents = new ArrayList<String>(); } public void addBook(String title) { contents.add(title); } public void removeBook(String title) throws BookException { boolean result = contents.remove(title); if (result == false) { throw new BookException("\"" + title + "\" not in cart."); } } public List<String> getContents() { return contents; } @Remove() public void remove() { contents = null; } }

Page 26: Chuong 4 - EJB

Bước 3: Xây dựng client package cart.client; import java.util.Iterator; import java.util.List; import javax.ejb.EJB; import cart.ejb.Cart; import cart.util.BookException; /** * * The client class for the CartBean example. Client adds books to the cart, * prints the contents of the cart, and then removes a book which hasn't been * added yet, causing a BookException. * @author ian */ public class CartClient { @EJB private static Cart cart; public CartClient(String[] args) { } /** * @param args the command line arguments */ public static void main(String[] args) { CartClient client = new CartClient(args); client.doTest(); } public void doTest() { try { cart.initialize("Duke d'Url", "123"); cart.addBook("Infinite Jest"); cart.addBook("Bel Canto"); cart.addBook("Kafka on the Shore"); List<String> bookList = cart.getContents(); bookList = cart.getContents(); Iterator<String> iterator = bookList.iterator(); while (iterator.hasNext()) { String title = iterator.next(); System.out.println ("Retrieving book title from cart: " +

Page 27: Chuong 4 - EJB

title); } System.out.println ("Removing \"Gravity's Rainbow\" from cart."); cart.removeBook("Gravity's Rainbow"); cart.remove(); System.exit(0); } catch (BookException ex) { System.err.println ("Caught a BookException: " + ex.getMessage()); System.exit(1); } catch (Exception ex) { System.err.println("Caught an unexpected exception!"); ex.printStackTrace(); System.exit(1); } } }

Bước 4: Build và đóng gói ứng dụng

>ant Bước 5: Triển khai ứng dụng

> ant deploy cart.ear được triển khai trên server

Bước 6: Chạy Cart Client > ant run Kết quả: [echo] running application client container.

[exec] Retrieving book title from cart: Infinite Jest [exec] Retrieving book title from cart: Bel Canto [exec] Retrieving book title from cart: Kafka on the Shore [exec] Removing "Gravity’s Rainbow" from cart. [exec] Caught a BookException: "Gravity’s Rainbow" not in cart. [exec] Result: 1

Page 28: Chuong 4 - EJB

4.5.2. Xây dựng Converter sử dụng netbean Ví dụ Converter chuyển đổi từ độ F sang độ C và ngược lại. Sử dụng netbean để xây dựng ứng dụng. Bước 1: Tạo ejb module converter-ejb

Bước 2: Tạo một business interface Converter package converter.ejb; import javax.ejb.Remote; /** * * @author HP */ @Remote public interface Converter { public double cToF(double c); public double fToC(double f); }

Bước 3: Tạo bean ConverterBean:

ConverterBean là Stateless Session bean thực thi giao diện Converter package converter.ejb; import javax.ejb.Stateless;

Page 29: Chuong 4 - EJB

@Stateless public class ConverterBean implements Converter { @Override public double cToF(double c) { return c * 9/5 + 32; } @Override public double fToC(double f) { return (f - 32) * 5/9; } }

Bước 4: Build converter-ejb

Click chuột phải vào converter-ejb chọn build để build project

Bước 5: Tạo một ứng dụng web sử dụng converter-ejb: converter-war

Bước 5: Add converter-ejb vào library của converter-war

Page 30: Chuong 4 - EJB

Bước 5: Tạo file index.jsp trong converter-war <%@ page import="converter.ejb.Converter, javax.naming.*"%> <%@ page import="java.math.*"%> <%@ page import="javax.naming.*"%> <%@ page import="javax.ejb.*" %> <%@ page import="java.text.DecimalFormat" %> <%@ page import="java.rmi.RemoteException" %> <%! private Converter converter = null; public void jspInit() { try { InitialContext ic = new InitialContext(); converter = (Converter) ic.lookup(Converter.class.getName()); } catch (Exception ex) { System.out.println ("Couldn't create converter bean."+ ex.getMessage()); } } public void jspDestroy() { converter = null; } %> <html> <head> <title>Temperature Converter</title> </head> <body bgcolor="white"> <h1><b><center> Temperature Converter </center></b></h1> <hr>

Page 31: Chuong 4 - EJB

<p>Enter a degree to convert:</p> <form method="get"> <input type="text" name="degree" size="25"> <br> <p> <input type="submit" name="fToC" value="Fahrenheit to Centigrade"> <input type="submit" name="cToF" value="Centigrade to Fahrenheit"> </form> <% DecimalFormat twoDigits = new DecimalFormat ("0.00"); String degree = request.getParameter("degree"); if ( degree != null && degree.length() > 0 ) { double d = Double.parseDouble(degree); %> <% if (request.getParameter("fToC") != null ) { %> <p> <%= degree %> fahrenheit degrees are <%= twoDigits.format(converter.fToC(d)) %> centigrade degrees. <% } %> <% if (request.getParameter("cToF") != null ) { %> <p> <%= degree %> centigrade degrees are <%= twoDigits.format (converter.cToF(d)) %> fahrenheit degrees . <% } %> <% } %> </body> </html>

Bước 6: Built project converter-war

Click chuột phải vào converter chọn build

Bước 7: Chạy project converter-war

Kết quả:

Page 32: Chuong 4 - EJB

4.6. KẾT LUẬN EJB 2.x cung cấp một cơ sở hạ tầng thành phần tương tự như CORBA 3.0. Mô hình thành phần của công nghệ EJB đc sử dụng trong việc xây dựng ứng dụng Java enterprise trong môi trường phân tán. Bất cứ thánh phần EJB nào cũng có 2 interface và một lớp bean để thực thi interface. giao diện home EJB quản lý vòng đời của một đối tượng EJB như tạo, xoá một thể hiện,và tìm kiếm một thể hiện bean thực thể bằng khóa chính.interface EJB cung cấp và thể hiện tất cả phương thức logic business logic để được sử dụng bởi client của nó. Thực thi lớp bean mở rộng một lớp sesion bean hay lớp bean entity,triển khai dựa trên kiểu của thành phần EJB. Có hai kiểu của session bean, stateless và stateful,và cả hai đều hoạt động dựa trên các hành vi của client của nó. Thành phần Stateless EJB không lưu giữ các thông tin trạng thái trong suốt phiên của chúng như một máy tính điện tử online. Mặt khác stateful session bean cân lưu giữ vài thông tin về trạng

Page 33: Chuong 4 - EJB

thái trong suốt phiên của chúng. Chẳng hạn, một session bean shopping cart cần theo dõi việc thu thập của mục hàng của client. Có hai kiểu của entity bean - BMP và CMP - cả hai đều sử dụng tầng back - end để kết nối đến database và hỗ trợ việc lưu trữ. Mỗi entity bean có một bảng quan hệ sau nó. Mỗi thể hiện của thành phần entity EJB đc lưu trữ trong bảng như là một cột. CMP entity bean được tự do truy cập code trong SQLvà ánh xạ đến database được hoàn thành bởi developer trong thời gian triển khai. EJB 3.0 có một số đặc tính mới giúp cho người phát triển dễ dàng hơn trong việc cài đặt và triển khai các enterprise bean. Bất kỳ thành phần EJB nào được đánh giá qua các EJB container, nó cung cấp các dịch vụ cần thiết và tạo ra các EJB khả chuyển hơn. Một thành phần EJB được đóng gói, hợp, và triển khai trên server.