1. Mở đầu
J2EE là một platform để phát triển những ứng dụng distributed . J2EE bao gồm những phần sau (được xem như là J2EE Framwork):
- J2EE Platform – một platform chuẩn để hosting các ứng dụng J2EE.
- Reference Implemetation – một application server hỗ trợ chuẩn mới nhất của J2EE, ngoại trừ những tiêu điểm của nó là những đặc tính mới trong phiên bản chuẩn của J2EE, đây chưa phải là 1 sản phẩm hoàn chỉnh.
- Compatibility Test Suite – một công cụ để kiểm tra xem một application server có tương thích với chuẩn J2EE hay không. Thiếu cái này thì mỗi nhà cung cấp có thể hiểu và từ đó phát triển chuẩn J2EE theo những hướng khác nhau mà như thế thì làm giảm đi thế mạnh của J2EE platform là “write once, run anywhere”.
- Application Programming Model (APM) Blueprint – một mô hình ứng dụng tham khảo, được cung cấp để minh hoạ cách phát triển ứng dụng dùng J2EE
2. Phát triển chương trình dùng J2EE
J2EE Framework cho phép phát triển những ứng dụng distributed bằng cách cung cấp 1 tập các dịch vụ cơ bản như quản lý transaction, kiểm tra security, quản lý trạng thái, quản lý tài nguyên. Các application serve đều cung cấp những dịch vụ cơ bản này của J2EE Framework.
3. J2EE API
Những công nghệ được sự dùng trong J2EE bao gồm:
- Java 2 Standard Edition (J2SE) – trước kia còn gọi là JDK
- Java Database Connectivity (JDBC) – Một API chuẩn dùng để kết nối Java Platform với cơ sở dữ liệu.
- RMI-JRMP – Remote Method Invocation (RMI) , một chuẩn dùng để gọi hàm từ xa dựa trên Java Remote Message Protocol (JRMP)
- Java Interface Definition Language (Java IDL) – một dịch vụ kết hợp Common Object Request Broker Architecture (Corba) vào trong Java Platform để cung cấp tính interoperability thông qua chuẩn IDL .
- Remote Method Invocation – Internet Inter- ORB Protocol (RMI-IIOP) – Một giao thức cho phép lập trình viên RMI kết hợp những lợi ích của RMI API và giao thức CORBA IIOP để giao tiếp với CORBA-compliant client được phát triển bởi bất cứ ngôn ngữ nào tuân theo CORBA.
- Enterprise JavaBean (EJB) – một kiến trúc component để phát triển và triển khai các ứng dụng kiểu component-based distributed.
- Servlet – tương tác với Web client thông qua cơ chế request – response. Cơ chế này dựa trên giao thức HTTP.
- Java Server Page (JSP) – Dùng để xây dựng những ứng dụng có chứa nội dung web động như là HTML, DHTML, XML
- Java Message Service (JMS) – một API để giao tiếp với Message Oriented Middleware (MOM) cho phép truyền nhận message theo cơ chế point-to-point và publish/subcribre.
- Java Naming and Directory Interface (JNDI) – một interface duy nhất dùng để truy cập những kiểu dịch vụ khác nhau về naming và directory.
- Java Transaction API (JTA) – một tập API cho phép quản lý transaction. Ứng dụng có thể Sử dụng JTA để start, commint, abord transaction.
- JavaMail – một API cung cấp 1 framework platform-independent và protocol-independent (không phụ thuộc giao thức về platform) để xây dựng ứng dụng về mail và messaging
- JavaBean Activation Framework (JAF) – tập các API được sử dụng bởi các package khác như là JavaMail,…Bạn có thể dùng JAF để xác định kiểu dữ liệu, đóng gói truy cập đến dữ liệu đó, mở rộng những tác vụ dựa trên dữ liệu đó và khởi tạo một bean tương ứng để thực hiện những tác vụ đó. Ví dụ JavaMail dùng JAF để xác định object nào sẽ được khởi tạo dựa trên kiểu MIME của object.
4. Các thành phần của J2EE
J2EE được xây dụng trên một mô hình container component. Bốn container component cốt lõi cung cấp môi trường cho các component khác của J2EE thông qua các API. Những component cốt lõi này liên quan đến bốn kiểu container được hỗ trợ trong J2EE bao gồm, Application Client, Applet, Web và EJB:
- Java Application – component này là 1 chương trình standalone chạy bên trong Application Client container. Application Client container cung cấp những API hỗ trợ cho messaging, remote invocation, database connectivity và lookup service. Application Client container đòi hỏi những API sau: J2SE, JMS, JNDI, RIM-IIOP và JDBC. Container này được cung cấp bởi nhà cung cấp application server
- Applet – Applet component là java applet chạy bên trong Applet container, chính là web browser có hỗ trợ công nghệ Java. Applet phải hỗ trợ J2SE API.
- Servlet và JSP – đây là Web-based component chạy ở bên trong Web container, được hỗ trợ bởi Web Server. Web container là một môi trường run-time cho servlet và jsp. Web Container phải hỗ trợ những API sau: J2SE, JMS, JNDI, JTA, JavaMail, JAF, RIM-IIOP và JDBC. Serlet và JSP cung cấp một cơ chế cho việc chuẩn bị, xử lý, định dạng nội dung động
- Enterprise JavaBean (EJB) – EJB component là business component chạy bên trong EJB container. EJB component là phần nhân, cốt lõi của ứng dụng J2EE. EJB container cung cấp các dịch vự quản lý transaction, bảo mật, quản lý trạng thái, quay vòng tài nguyên (resource pooling). EJB container phải hỗ trợ những API sau: J2SE, JMS, JNDI, JTA, JavaMail, JAF, RIM-IIOP và JDBC.
5. Sử dụng EJB
EJB chứa những business logic của ứng dụng, cho nên có thể nói rằng EJB chính là phần lõi của phần lớn các ứng dụng distributed cho enterprise. Một enterprise bean có những đặc điểm sau:
- Chứa các business logic để thao tác với dữ liệu.
- Được tạo ra và được quản lý bởi một container.
- Xử lý các truy cập của client
- Chứa metadata, như là thuộc tính của transaction và security, riêng biệt với các bean.
- Cung cấp dịch vụ quản lý transation, quản lý trạng thái, quay vòng tài nguyên và bảo mật. Nếu bạn thiết kế 1 ứng dụng không cần có hỗ trợ transaction hoặc bảo mật, lúc đó nên trở lại câu hỏi có nên dùng đến EJB hay không.
Mỗi EJB bắt buộc phải có những interface và class sau:
- Home Interface – home interface extend javax.ejb.EJBHome. Nó đóng vai trò như một Factory pattern để khởi tạo các instance của EJB
- Remote Interface – remote interface extend javax.ejb.EJBObject. Remote interface chứa các business method , được gọi từ client. Nó đóng vai trò như 1 proxy của EJB.
- Bean Class – chứa phần cài đặt của các method khai báo trong remote interface. Bean class extend javax.ejb.SessionBean hoặc javax.ejb.EntityBean hoặc javax.ejb.MessageDrivenBean.
5.1 Sử dụng Session và Entity Bean
Các ứng dụng cho enterprise cần những component linh động trong business logic. Các component phải có khả đáp ứng stateless service, conversational state, và hỗ trợ việc chia xẻ dữ liệu. EJB có 2 loại bean chính ứng với các nhu cầu khác nhau của component trong ứng dụng: session và entity. Entity bean phục vụ cho việc persistence và sharing dữ liệu. Như thế không có nghĩa là session bean không thể persist object được, nhưng entity bean được thiết kế chuyện dụng cho mục đích này. Session bean thì phục vụ cho các bussiness logic và wworkflow liên quan đến ứng dụng J2EE, tương ứng với nhu cầu về stateless service và conversational state.
5.2 Stateless Bean và Stateful Bean
Có 2 loại session bean: stateless và stateful.
Stateless Beans
Stateless bean không giữ conversational state (tạm dịch là trạng thái giao tiếp) của client. Tuy nhiên không có nghĩa là stateless bean không thể giữ được trạng thái, nhưng trạng thái này không bảo đảm đủ để xác định client nào đã gọi đến bean này. Điều này có nghĩa là bạn có thể dùng stateless bean để thực hiện bất cứ hành động nào trong ứng dụng
Stateful Beans
Stateful bean có khả năng giữ conversational state (tạm dịch là trạng thái giao tiếp) của client. Tất nhiên là có nhiều cách để giử consersational state trong ứng dụng, nhưng nếu state đó cần phải gắn với business logic thì nó nên được lưu giữ trong stateful bean. Ví dụ điển hình nhất của session stateful bean là component shopping cart trong các ứng dụng mua hàng trực tuyến.
5.3 Sử dụng MessageDrivenBean
MessageDrivenBean là một điểm mới trong chuẩn EJB 2.0 (EJB 1.1 chỉ định nghĩa 2 loại bean là session và entity). Mục đích của MesssageDrivenBean là phục vụ cho nhu cầu về các asynchronous service của các component. Bởi vì session và entity bean chỉ phục vụ các dịch vụ loại synchronous. Do đó cách sử dụng MessageDrivenBean có phần giống với session stateless bean, chỉ khác ở cách gọi bean, với MDB thì client phải gửi message đến MDB đó để thực hiện các hàm trong MDB.
5.4 Sử dụng Container-Managed Persistence
Có 2 cách để 1 entity bean persist object: container-managed persistence (CMP) và bean-managed persistence (BMP). Trong CMP, container điều khiển việc cài đặt cần thiết cho các tác vụ chèn, đọc, ghi, cập nhật object trong một data source. Còn trong BMP, thì LTV phải tự cài đặt các code cho các tác vụ trên. CMP lý tưởng cho việc phát triển ứng dụng vì nó không đòi hỏi LTV phải thay đổi code mỗi khi data model thay đổi. Tuy nhiên để có được tính linh hoạt, CMP không cho phép sinh ra những câu lệnh SQL hiệu quả.
Hiện nay các công cụ phục vụ việc mapping object với cơ sở dữ liệu vẫn còn đang trogn quá trình phát triển và chưa đủ chin muồi. Trong khi chờ đợi CMP phát triển hoàn thiện thì BMP cộng với pattern DAO có lẽ là 1 giải pháp khá tốt.
5.5 Sử dụng Data Access Object
Khi bạn quyết định dùng BMP, có nghĩa là bạn sẽ phải tự coding các câu lệnh SQL trong entity bean của bạn. Để giảm sự nối kết của entity bean với các câu lệnh SQL cần thiết cho các việc đọc, ghi, xoá , cập nhật object, bạn có thể tạo ra một DAO pattern đóng gói các câu lệnh SQL đó. Bằng cách này bạn đã làm giảm sự phụ thuộc của bạn vào code và sư thay đổi của data model. Nói cách khác nếu có sự thay đổi thì BMP entity bean của bạn vẫn có thể giữ nguyên và bạn chỉ phải sửa lại phần DAO thôi.
DAO chứa code phục vụ việc đọc , ghi, cập nhật xoá object trên 1 data source. Nó cho phép 1 entity bean có thể định nghĩa như 1 BMP, nhưng sau này khi các công cụ hỗ trợ cho CMP trở nên hoàn thiện hơn thi entity bean này có thể chuyển sang thành CMP, và DAO sẽ được thay thế bởi sự hỗ trợ CMP của container.
Nếu bạn muốn tìm hiểu thêm về DAO pattern, bạn có thể xem ở địa chỉ sau: http://java.sun.com/blueprints/patterns/DAO.html
st