Đe phát triển lớp Entity Bean, phải thực hiện cài đặt giao diện javax.ejb.EntityBean. Giao diện này định nghĩa một số phương thức bắt buộc phải cài đặt. Hầu hết các phương thức này do bộ chứa EJB quản lý. Định nghĩa giao diện javax. ejb. EntityBean như sau:
public interface javax. ejb. EntityBean implements javax. ejb. EnterpriseBean { public abtract void setEntityContext (javax. ejb. EntityContext);
public abtract void unsetEntityContect(); public abtract void ejbRemove();
public abtract void ejbPassivate(); public abtract void ejbActivateQ; public abtract void eb|Load(); public abtract void ejbStore();
}
Ngoài các phương thức trên, có thể cài đặt một sổ phương thức ejbCreate() để
tạo các Entity Bean mới hoặc ejbFind() để tìm kiếm các Entity Bean hiện có. [2]
2.5.5. ỉ Tạo một Entity Bean: ejbCreate()
Có thể xây dựng phương thức ejbCreate() để khởi tạo Entity Bean mới và tạo dữ
liệu mới trong CSDL. Một số điều cần chú ý khi xây dựng ejbCreate() là:
• Không bat buộc phải xây dựng phương thức ejbCreate('): Đối với Session
Bean phương thức ejbCreate() là bat buộc, còn đối với Entity Bean thì đây là
tùy chọn, bởi có thể tạo ra entity mới bằng cách thêm đữ liệu trực tiếp vào
CSDL. Chỉ cần xây dựng ejbCreate() khi muốn tạo dữ liệu mới thông qua
EJB.
• Có thể có nhiều phương thức ejbCreate() với nhiều bộ tham số khác nhau
- 4 4 -
• Cân phải lặp lại ejbCreate() trong giao diện tại chồ bởi các ứng dụng khách
không gọi các phương thức này trực tiếp mà thông qua phương thức create()
trong giao diện tại chỗ.
Ví dụ, có lớp Entity Bean là AccountBean, giao diện từ xa là Account, giao diện tại chỗ là AccountHome và lớp khóa chính là AccountPK. Khi đó
phương thức ejbCreateQ trong AccountBean và create() trong
AccountHome định nghĩa như sau:
public AccountPK ejbCreate (String accountlD, String o w n e r,...); public Account create (String accountID, String owner, ...);
Ở đây, phương thức ejbCreate() trả lại lớp khóa chính cho bộ chứa EJB để
bộ chứa EJB có thể định vị được Entity Bean. Khi có khóa chính, giao diện tại chỗ có thể tạo ra giao diện từ xa và chuyển cho ứng dụng khách. [2]
2.5.5.2 Tun kiếm Entity Bean: ejbFindQ
Các phương thức tim kiếm của lớp Entity Bean được sử dụng để tìm kiếm một Entity Bean hiện có trong hệ thống lưu trừ. Các phương thức tìm kiếm không tạo ra dữ liệu mới trong cơ sở dữ liệu - các phương thức này chỉ thuần tủy thực hiện việc tải dữ liệu của các Entity Bean vào bộ nhớ. Trong mỗi lớp Entity Bean, có thể có nhiều phương thức tìm kiếm khác nhau để tạo ra nhiều cách tìm kiểm khác nhau:
/* Tìm kiêm một tài khoàn duy nhãt theo khóa chính cúa nó */ public AccountPK ejbFindByPrimaryKey (AccountPK key)
/* Tìm tất cá các Entity Bean cho tất cả các sán phẩm và trá lại một tập hợp các khóa chính */
public Enumeration ejbFindAIIProducts()
/*Tìm tãt các tài khoản có sô dư tối thiếu được cho trdớc và trá lại tập hợp các khóa chính
*/
public Enumeration ejbFindBigAccount (int minimum) /* Tìm đơn đặt hàng mới nhất */
public OrderPK ejbFindMostRecentOrder()
Phải có ít nhất một phương thức tìm kiếm có tên là ejbFindByPrimaryKey().
Đây là phương thức tìm kiếm một biến thể Entity Bean duy nhất trong cơ sở dữ liệu theo khóa chính của nó. Lý do là tất cả các Entity Bean đều có thuộc tính khóa chính. Vì vậy, điều hoàn toàn hợp lý là phải có phương thức tìm kiếm theo khóa chính này.
Mồi lớp Entity Bean có thể có nhiều phương thức tìm kiếm khác nhau. Các phương thức tim kiếm này phải có tên và các tham số khác nhau.
Mồi phương thức tìm kiếm phải trả lại hoặc là khóa chính của biến thể Entity Bean mà nó tìm thấy, hoặc là một tập hợp các khóa chính của các biến thể Entity Bean mà nó tìm thấy.
Trong phương thức ejbCreate(), không được thực hiện lời gọi tới phương
thức tìm kiếm trên chính biến thể Entity Bean này. Các phương thức tìm kiếm cũng giống như các phương thức khác. Các ứng dụng khách không thực hiện việc gọi trực tiếp các phương thức mà thực hiện thông qua các phương thức tương ứng trong giao diện tại chỗ, sau đó được các bộ chứa EJB chuyển thành các lời gọi tới các phương thức tim kiểm này. Chính vì vậy, mỗi phương thức tìm kiếm trong lớp entiy bean phải có một phương thức tìm kiếm tương ứng trong giao diện tại chỗ. Các ứng dụng khách sẽ thực hiện lời gọi thông qua các phương thức tìm kiếm của giao diện tại chỗ. Ví dụ:
public Enumeration ejbFindAIIProducts()...
trong giao diện tại chồ phải có định nghĩa:
public Enumeration findAIIProducts()...
cũng tương tự như với phương thức ejbCreate(), nếu phương thức tìm kiếm
trả lại khóa chính của Entity Bean thì trong giao diện tại chỗ sẽ trả lại giao diện từ xa của Entity Bean. [2]
- 4 6 -
public AccountPK ejbFindBigAccounts (int minimum) throws ...
thi trong giao diện tại chỗ có định nghĩa:
public Account íindBigAccounts (int minimum) throws ...
2.5.5.3 Hủy bỏ Entity Bean
Đê hủy bỏ dừ liệu của Entity Bean trong cơ sở dừ liệu, ứn2 dụng khách phải
thực hiện lời gọi tới phương thức removeị) trong đối tượng EJB hoặc trong giao
diện tại chồ. Phương thức này sẽ yêu cầu bộ chứa EJB thực hiện phương thức
ejbRemove() trong Entity Bean.
Việc thực hiện phương thức ejbRemove() không có nghĩa là biến the EJB trong
bộ nhớ bị hủy bỏ, mà chỉ có dừ liệu trong cơ sở dữ liệu bị xóa bỏ. Bản thân biến thê Entity Bean có thể được tái sử dụns cho dữ liệu khác của cơ sở dữ liệu. Ví dụ, Entity Bear) cho một tài khoản ngân hàng khi đó có thể biểu diễn một tài khoản ngân hàng khác. Chính vì vậy, đối với các Entity Bean thì ứng dụne khác không
còn truy nhập tới thực thể này trong một thời gian dài thì phương thức ejbRemoveQ
cũng sẽ không được tự động gọi, bởi nếu tự động gọi thì dừ liệu trong cơ sở dữ liệu sẽ bị hủy bỏ một cách bất hợp lý. [2]
2.5.6 Ngữ cảnh của Entity Bean
Các phần trước đã đề cập đến các đối tượng ngữ cảnh. Các đối tượng ngữ cảnh xác định các tham số môi trường của các EJB. Các EJB có thể truy nhập tới các đối tượng môi trường này để lấy các tham số về môi trường như các thông tin về các giao dịch và các thông tin về bảo mật. [2]
Đối với các Session Bean, giao diện của đối tượng ngữ cảnh là
javax.ejb.SessionContext. Đổi với Entity Bean thì giao diện này là
javax.ejb.EntityContext. Cả hai giao diện này đều được mở rộng từ giao diện javax.ejb.EJBContext.
Giao diện chung này được định nghĩa như sau:
public interface javax. ejb. EJBContext {
public abstract java. util. Properties getEnvironment(); public abstract java. security. Identity getCallerldentityO; public abstract boolean isCallerlnRole (java. security. Identity); public abstract javax. jts. UserTransaction getUserTransaction(); public abstract void setRollbackOnlyO;
public abstract boolean getRollbackOnlyO;
}
Ngừ cảnh của Entity Bean thực hiện mở rộng thêm với 2 phương thức sau:
2.5.6. ỉ g e tE J B Object()
Phương thức này trả lại đối tượng EJB của ứng dụng khách được gán với Entity Bean này. Các ứng dụng khách khôna thực hiện việc gọi trực tiểp các phương thức của Entity Bean, mà gọi thông qua đối tượng EJB. Chính vì vậy, việc sử dụne phương thức này sẽ cho đối tượng EJB là một cách thức đế lấy tham chiểu tới chính đôi tượng này, giúp mô phỏng tham chiếu this của các đối tượng trong Java.
Phương thức getEJBObject() hoạt động giống như vậy đối với Session Bean. [2]
2.5.6.2 getPrimaryKeyO
Phương thức getPrimaryKeyO là một phương thức riêng của Entity Bean.
Phương thức này trả lại khóa chính gán với biến thể Entity Bean. Các khóa chính xác định duy nhất biến the Entity Bean. Khi Entity Bean được lưu trữ trên các thiết bị lưu trữ thì khóa chính là cơ chế cho phép lấy được một biến thể Entity Bean duy nhất tương ứng với nó, bởi không thể có dữ liệu của 2 biến thể Entity Bean có cùng khóa chính.
Như đã đề cập ở trên, các Entity Bean có thể được sử dụng lại cho các dừ liệu khác, tức là cùng một biến thể Entity Bean tại các thời điểm khác nhau, có thể biển diễn các đổi tượng dừ liệu khác nhau. Vì vậy, phương thức này được dùng để xác định xem biển thể Entity Bean này đang thực sự biểu diễn dữ liệu nào. Phương thức này đặc biệt hữu dụng đối với các Entity Bean tự quản lý lưu trữ. [2]
- 4 8 -
2 . 5 . 7 V ò n g đ ờ i c ủ a m ộ t E n t i t y B e a n
các phương thức nghiệp vụ
Hình 2-1: Vòng đòi của Entity Bean
Phần này sẽ xem xét vòng đời của một Entity Bean: khi nó được tạo ra, hủy bỏ và được sử dụng như thế nào. Toàn bộ vòng đời của một Entity Bean được thể hiện trong hình vẽ trên và chu trình này được thực hiện như sau:
Đe tạo một biến thể mới, bộ chứa thực hiện lời gọi tới phương thức
ne\vlnstance() của lớp Entity Bean. Phương thức này gọi tới constructor mặc định của lóp Entity Bean và tạo ra một biến thể Entity Bean trong bộ nhớ. Tiếp theo đó, bộ chứa sẽ thực hiện việc gắn cho biến thể này các đối tượng môi trường. Việc này
dược thực hiện thông qua phươns thức setEntityBeanContext (EntityContext ctx).
Chú ý rằng, bước này chỉ được thực hiện khi bộ chứa muốn tăng số lượng Entity Bean trong bộ nhớ lên mà thôi. Bước này buộc phải thực hiện mỗi khi có một ứng dụng khách kết nổi tới hệ thống.
Sau bước 2, biến thể Entity Bean ở trạng thái bị động và được tập trung thành một vùng cùng với các Entity Bean khác. Tại thời điểm này, chưa có dừ liệu trong cơ sở dữ liệu được tải vào biến thể này. Và biến thể này cũng không chiếm bất cứ một tài nguyên riêng biệt nào của hệ thong nào cả (ví dụ như kết nối mạng). Biến thể ở trạng thái này có thể thực hiện việc tìm kiếm các dừ liệu trong cơ sở dữ liệu thông qua các phương thức tim kiểm thay cho các ứne dụng khách. Neu bộ chứa muốn giảm số lượng biến thể Entity Bean trong bộ nhớ, thì nó có thế thực hiện việc hủy bỏ các biến thể này. Bộ chứa sẽ thực hiện việc cảnh báo cho biển the Entity
Bean về việc hủy bỏ này bằng cách gọi phương thức unsetEntityContext(). Sau khi
phương thức này được thực hiện, bộ chứa sẽ hủy bỏ các tham chiếu tới các biến thể này. Bộ gom rác của Java sẽ thực hiện việc dọn sạch bộ nhớ do biến thể này sử
dụng. Chính vì vậy, phương thức unsetEntityContext() phải thực hiện các công việc
dọn dẹp. Ví dụ như giải phóng các tài nguyên chung của hệ thống mà các biến thể này sử dụng.
Khi ứng dụng khách muốn tạo một dừ liệu mới trong cơ sở dữ liệu (ví dụ như một đơn đặt hàng thông qua Internet chẳng hạn) thi ứng dụng này sẽ thực hiện gọi
phương thức create() trong giao diện tại chỗ. Bộ chứa EJB sẽ thực hiện việc lấy một
biến thể Entity Bean nào đó trong vùng các biến thể bị động và phương thức
ejbCreate() của biến thể này được gọi. Phương thức ejbCreate() thực hiện việc khởi tạo các dừ liệu riêng biệt cho biến thể này. Sau đó, các Entity Bean này được chuyến sang trạng thái sẵn sàng.
- 5 0 -
Khi biến thể ở trạng thái sẵn sàng, nó được gắn với một dừ liệu cụ thể và kể từ ció được gán với một đối tượng Entity Bean. Nếu có một biến thể Entity Bean khác cũng biểu diễn cùng một dữ liệu trong cơ sở dữ liệu, thì bộ chứa sẽ phải thường xuyên thực hiện việc đồng bộ dữ liệu của các Entity Bean này với cơ sở dữ liệu để cho phép ứng dụng khách luôn làm việc trên dừ liệu mới nhất. Việc đồng bộ dữ liệu
được thực hiện thông qua phương thức ejhLoad() và ejbStore(), bộ chứa sẽ thực
hiện việc gọi các phương thức này một cách thức hợp dựa trên việc xác định các giao dịch được thực hiện.
Có hai cơ chế khác nhau cho phép chuyển một biến the Entity Bean về trạng thái
bị động. Neu ứna dụng khác gọi phương thức remove() trong giao diện tại chồ thì
bộ chửa sẽ gọi ejbRemove() của biển thể này. Khi đó, dữ liệu trong cơ sở dừ liệu bị
hủy bỏ. Vì vậy, biến thể này sẽ không được kết gắn với dữ liệu nào cả và nó được chuyến sang trạng thái bị động.
Cách thức khác để chuyển một biến thể Entity Bean về trạng thái bị động khi bộ chứa xác định rằng ứng dụng khách đã không thực hiện trong một thời gian dài hơn mức qui định. Khi đó, bộ chứa sẽ sử dụng biến thể này cho một ứng dụng khách khác hay chỉ đơn giản là bộ chứa không có đủ tài nguyên để thực hiện. Tại thời điểm đó, biển thể này sẽ bị chuyển sang trạng thái bị động. Bộ chứa thực hiện gọi
phương thức ejbStore() để đảm bảo cơ sở dừ liệu chứa dừ liệu được cập nhập mới
nhất, và gọi phương thức ejbPassivatef) để cho phép biến thể này thực hiện việc
giải phóng các tài nguyên mà nó chiếm giữ. Sau đó, biến thể này được chuyển thành trạng thái bị động.
Khi bộ chứa muốn kết gắn một biến thể với một đối tượng dừ liệu nào đó, thì biến thê này sẽ được kích hoạt. Đe kích hoạt, bộ chứa sẽ thực hiện gọi phương thức
ejbActivate() cho phép biến thể này lấy các tài nguyên mà nó cần sử dụng. Tiếp
theo, bộ chứa sẽ thực hiện gọi phương thức ejbLoad() để tải dừ liệu từ cơ sở dừ liệu
Ngoài các bước cơ bản này, các Entity Bean còn phải trải qua một số những bước phụ khác như việc đồng bộ hóa trong các giao dịch. Nhưng đây là các bước cơ bản nhất mà mồi biến thể Entity Bean phải trải qua. [2]
- 52 -
C h ư ơ n g 3 : B ộ c h ứ a W e b : S e r v l e t v à J S P
3.1 Servlets
Phần này sẽ đề cập đến các công nghệ liên quan đến một thành phần trong bộ chứa Web là Java Servlets. Một thành phần khác cũng nằm trong bộ chứa Web là JSP sẽ được để cập trong phần sau.
v ề cơ bản, Servlet là thành phần được sử dụng để tải các nội dung động cho các Web site. Chuẩn Java Servlet API 2. 2 là một chuẩn mở rộng của công nghệ Java mà tất cả các sản phẩm J2EE phải hỗ trợ chuẩn này. Mỗi sản phẩm J2EE phải cài
đặt tất cả các tính năn g được xác định trong chuẩn và phải cung cấp bộ chứa có khả
nă n g cung cấp tất cả các dịch vụ cần thiết iheo yêu cầu của chuẩn. Phần này sẽ xem xét các vấn đề sau:
• Các khái niệm cơ bản của Java servlet.
• Cách thức phát triển các thành phần Servlet và tích hợp các thành phần này trong các ứng dụng mức xí nghiệp.[5]
3.1.1 Tổng quan về Servlet
3 .1 .1 . ì Đ ị n h n g h ĩ a
Servlet là một lớp của Java và được định nghĩa là một thành phần của bộ chứa Web. Thành phần này được gọi từ URL và nó tạo ra các dữ liệu động dạng HTML, XML hoặc TEXT.
Servlet là thành phân Java chạy trên máy chủ có nghĩa là Servlet là một thành phần Java được triển khai, quản lý và thực hiện trên các phần mềm máy chủ tuân theo chuân J2EE. Cũng giống như các thành phần Java khác, Servlet không phụ thuộc vào nền tảng phần mềm và phần cứng của thiết bị mà nó chạy trên đó, nó có
thế chạy trên mọi loại máy chủ cũng như mọi loại hệ điều hành trên các máy chủ này.
Servlet cũng không phụ thuộc vào giao thức truyền thông. Hầu hết các Servlet dược sử dụne với giao thức HTTP, nhưng các chức năng của nó có thê mở rộng đê hỗ trợ các giao thức khác. Một Servlet cũng có thể tạo ra các dừ liệu dạng XML cũng như các dạng khác. [5]
3. ỉ. 1.2 Cách thức hoạt động của Servlet
Cơ chế hoạt động của Servlet dựa trên mô hình yêu cầu/trả lời như hình vẽ sau:
ứng dụng khách yeu cau trả lời Web Server Servlet
Hình 3-1: Mô hình hoạt động của Servlet
ứ n g dụng khách thực hiện gửi một yêu cầu bằng giao thức HTTP tới máy chủ Web. Máy chủ Web thực hiện việc quản lý các yêu cầu này và gửi yêu câu này tới cho bộ chứa Web. Căn cứ vào cấu hình của mình, bộ chứa Web sẽ thực hiện gọi Servlet với các tham số là yêu cầu và trả lời.
Servlet sử dụng đổi tượng yêu cầu để lấy các thông tin được cung cấp bởi người sử dụng đưa ra yêu cầu và thực hiện xử lý của nó. Sau quá trình xử lý của mình, Servlet sẽ sinh ra các dừ liệu và gửi trả lại cho người sử dụng.
Thông thường, tại mồi thời điểm chỉ có một biến thể của một Servlet được tải