Session Bean trong EJB 3 – Cài đặt ứng dụng Shopping Cart sử dụng Stateful
Mục đích: Nội dung của chủ đề này giới thiệu các khái niệm liên quan đến Session Bean và cách cài đặt session bean trong EJB 3. Chủ đề này sẽ áp dụng Stateful Session Bean để cài đặt ứng dụng Shopping Cart để người dùng có thể sử dụng các phương thức chức năng thông qua giao diện Web trên Browser
Session Bean trong EJB 3 – Cài đặt ứng dụng Shopping Cart sử dụng Stateful
Mục đích: Nội dung của chủ đề này giới thiệu các khái niệm liên quan đến Session Bean và cách cài đặt session bean trong EJB 3. Chủ đề này sẽ áp dụng Stateful Session Bean để cài đặt ứng dụng Shopping Cart để người dùng có thể sử dụng các phương thức chức năng thông qua giao diện Web trên Browser
Yêu cầu
- Nắm vững các khái niệm về EJB 2.1 và các nguyên lý cơ bản về cài đặt các đối tượng trong EJB 2.1
- Nắm vững kiến thức về OOP
Định nghĩa sơ lược về Enterprise Java Bean – EJB 3
- EJB 3 dùng annotation để mô tả các service trong EJB thay cho sử dụng xml như trong EJB 2
- Các annotation này sẽ được container thực hiện parsing và phát sinh code tương ứng
- Chính vì các điều nêu trên, EJB 3 đã chuyển tất cả mọi thành phần trở thành một java class bình thường, giúp đơn giản hóa và thuận lợi cho người lập trình java – simple POJO
- Bản chất java object là thành phần để mapping dữ liệu đối với CSDL – DB
- Hơn thế nữa, thành phần java object được phép cài đặt các phương thức xử lý hay hành vi của object trực tiếp (behaviors)
- Các thành phần còn lại của EJB được sử dụng áp dụng tương tự EJB 2
- Một số đổi mới trong EJB 3
- Các phương thức callback của EJB 2 được sử dụng lại trong EJB 3 với chỉ thị của annotation. Tuy nhiên, chúng không cần phải bắt buộc cài đặt theo nghĩa để tạo thuận lợi cho cả người quen lập trình EJB 2 và tiếp cận EJB 3 và cũng mong muốn cấu hình ứng dụng theo ý của người phát triển
- Các phương thức này khi cài đặt, được khuyến cáo cài trong một java class và được thực hiện trước khi phần instance của ứng dụng chạy, một khái niệm với tên gọi interceptor
- EJB loại bỏ home interface và home object. 02 thành phần này được thay thế như interface của các java class thông thường – Business interface. Điều này cho thấy sự đơn giản trong việc cài đặt EJB 3
- Ngoài ra, EJB 3 cũng loại bỏ luôn component interface và thay thế bằng java class thông thường, java class này sẽ implement Business interface
- Hơn thế nữa, container trong EJB 3 cho phép trực tiếp yêu cầu instance bean mà không cần tìm kiếm bean instance thông qua JNDI với khái niệm injection
- Tương tự như thế cho việc kết nối với các Datasource hay Resouce cần cung cấp cho ứng dụng
- Khái niệm về Session bean
- Tương tự như khái niệm session bean trong EJB 2
- Thành phần của Session bean của EJB3 là một java class thông thường bao gồm
- Có ít nhất một phương thức business
- Các phương thức được cài đặt như trong khai báo ở interface và tuyệt đối không ném RemoteException
- Có một constructor có tham số
- Không được implement abstract hay final
- Có thể là lớp con của một session bean khác
- Các thành phần còn lại giống EJB 2
- Các callback method của EJB 3 bao gồm
§ PostConstruct
- Kích hoạt sau khi bean khởi tạo và trước khi các phương thức business method được gọi
§ PreDestroy
- Kích hoạt trước khi container hủy một instance bean không được sử dụng trong pool
- Kích hoạt sau khi phương thức remove được gọi (@Remove)
- Không có tham số truyền và kiểu trả về là void
§ PrePassivate
- Kích hoạt trước khi bean bị passivate
§ PostActivate
- Kích hoạt sau khi bean được đưa vào pool
- Remove
- Kích hoạt để hủy và đưa bean ra khỏi pool
- Khái niệm về Stateful Session Bean trong EJB 3
- Tương tự như Stateful của EJB 2
- Chu kỳ sống của Stateful
- Chu kỳ sống của bean bắt đầu khi client thực hiện yêu cầu một chức năng có trong instance bean
- Stateful có 3 trạng thái tồn tại
- Does Not Exist
- Stateful chưa được khởi tạo
- Bean đã được Passivate và không sử dụng vượt quá thời gian qui định – timeout – bean sẽ chuyển sang trạng thái Does Not Exist
- Bean đã sử dụng nhưng sau một thời gian không sử dụng nữa thì container cũng chuyển trạng thái về Does Not Exist
- Trong quá trình xử lý nếu có lỗi phát sinh thì bean sẽ được đưa vào trạng thái Does Not Exist
- Method-Ready
- Trạng thái này xảy ra khi có yêu cầu bean, container khởi tạo bean, gọi injection nếu có, sau đó gọi PostConstruct và thực hiện chức năng yêu cầu
- Passive
- Sau khi thực hiện chức năng, nếu bean không được sử dụng trong một thời gian và khi cần tận dụng resource thì bean sẽ chuyển sang trạng thái passive và phương thức
- Khi bean được yêu cầu lại phương thức thì nó sẽ nạp lại để active lại trạng thái ban đầu
- Cơ chế thực hiện của container đối với stateful session bean
- Sử dụng default constructor để khởi tạo bean
- Thực hiện gọi injection nếu có
- Thực hiện phương thức business theo yêu cầu
- Chờ đợi để thực hiện thêm yêu cầu hỗ trợ trên bean hiện có
- Passivate khi cần – hay trong khoảng thời gian không sử dụng
- Activate lại khi bean chưa chuyển trạng thái Does Not Exist mà đang passivate
- Hủy bean ra khỏi pool khi bean không yêu cầu thời gian dài
- Các thành phần của stateful session bean
- Business interface: dùng @Local và @Remote để xác định interface này được dùng ngoài server hay trong server
- Business method: các phương thức thực thi của ứng dụng
- Class bean: java class bình thường nhưng có annotation @Stateful và cài đặt từ thành phần Business Interface hay các Session class khác
Xây dựng ứng dụng 3 tiers – với giao diện web cho chức năng mua hàng online – shopping cart
Yêu cầu
- Nắm vững các khái niệm về EJB 2.1 và các nguyên lý cơ bản về cài đặt các đối tượng trong EJB 2.1
- Nắm vững các khái niệm về EJB 3 và các nguyên lý cơ bản về cài đặt với một số đối tượng trong EJB 3
- Nắm vững cú pháp và kiến thức về OOP
- Tools sử dụng ở đây là Netbeans 6.9.1
- JDK 6 update 22
- Server: JBoss 5.1.0 GA
Mô tả chức năng
- Giao diện đầu tiên của ứng dụng cho phép người dùng chọn các loại sách thông qua combo box chứa thông tin mô tả các loại sách (các bạn có thể áp dụng lưới để trình bày dữ liệu)
- Người dùng chọn một mặt hàng bất kỳ và nhấn nút Add To Cart để đưa hàng vào giỏ hàng của họ
- Thông tin chọn lựa của người dùng được chuyển đến Controller, Controller sẽ xác định Middleware Object trên Application Server (ở đây sẽ áp dụng Enterprise Java Bean – Session Bean) cần xử lý và cập nhật Session Bean instance
- Trong quá trình cập nhật Session Bean, hệ thống có nhiệm vụ kiểm tra xem mặt hàng đã có trong giỏ hàng hay chưa. Nếu có thì tăng số lượng của mặt hàng đó lên, ngược lại đưa hàng vào giỏ với số lượng mặc định đầu tiên luôn là 1
- Sau khi cập nhật xong, thông tin cập nhật thành công chuyển lại controller để controller quay lại trang người dùng chọn lựa để họ có thể chọn tiếp (thành công). Nếu không thành công sẽ có báo lỗi tương ứng
- Khi user muốn xem giỏ hàng của mình, user click vào nút View Cart, thông tin một lần nữa chuyển đến Controller, Controller xác định Session Bean tương ứng, gọi phương thức lấy dữ liệu. Đồng thời tại lúc chọn Session Bean, Controller cũng xác định View tương ứng để chuẩn bị đón nhận kết quả từ Session Bean để trình bày dữ liệu
- Khi dữ liệu từ Session Bean được chuyển đến View, hệ thống sẽ render dữ liệu vào View. Khi thành công, Controller sẽ đưa View về phía người dùng hiển thị kết quả
- Trong trang view, người dùng có thể Add thêm hàng bằng cách click vào link Add more. Nội dung yêu cầu người dùng chuyển vào Controller, Controller sẽ đưa trang chọn hàng và trình bày về phía người dùng để người dùng có thể dùng chức năng thêm hàng vào giỏ như đã nêu ở trên
- Ngoài ra trong trang view, người dùng có thể chọn một số mặt hàng để loại bỏ bớt ra khỏi giỏ hàng bằng cách check vào các check box tương ứng của mặt hàng, sau đó, user click nút Remove. Thông tin được đưa về Controller, Controller chọn Session Bean tương ứng, cập nhật Model và lấy thông tin trở về, đồng thời xác định View tương ứng và thực hiện trình bày kết quả thông qua Controller để đưa cho người dùng thông qua chức năng View Cart
Mô hình tổng quát chức năng
- Trong phần tutorial này chúng tôi sẽ thực hiện một nhóm cách động tương tự các bước trong bài tutorial CMR 1:1 trong EJB 2.1
- Bước 1: Tạo Enterprise Application Project tương tự như bước 2 của tutorial trong CMR 1:1
- Tạo Project Enterprise Application có tên EJB3StatefulShoppingCart
- Chúng ta chọn Server là JBoss 5.1.0 GA và version của Java EE là JavaEE5 bởi vì chúng ta đang tạo trên nền EJB 3
- Bước 2: Tạo Session Bean tương tự như bài Transaction trong EJB2.1
- Chọn Session Bean
- Đặt tên bean (CartSessionBean), gõ tên package (sample.stateful), chọn Stateful vì chúng ta đang tạo bean có khả năng lưu trữ thông tin – conversation giữa client và server, chọn cả Remote và Local.
- Nhấn nút Finish, project được phát sinh như sau
- Tập tin Business Class được phát sinh như sau
- Bước 3: phát sinh một số business method cho EJB tương tự như bài Transaction trong EJB2.1
- Tạo cart kiểu HashMap với key là kiểu chuỗi và value là kiểu số Integer – đây là cách tận dụng để thể hiện chuỗi là tên sách và số là số lượng cần mua
- Phát sinh luôn biến customerID để đánh dấu giỏ hàng thuộc về khách hàng nào
- Tạo phương thức business method bằng cách nhấn chuột phải ngay trên code để phát sinh phương thức setCustomer. Chọn Add Business Method …. Gõ tên phương thức và tham số
- Hàm được phát sinh và chúng ta tự cài đặt phương thức này
- Tương tự phát sinh hàm construct và cài đặt như bên dưới
- Khai báo PostConstruct ở cả code trên bean và business interface tương ứng để hàm này có thể tự kích hoạt theo mô hình chu kỳ sống của session bean
- Tương tự phát sinh hàm addBook và removeBook để hủy sách theo hình mô tả bên dưới
- Phương thức checkout, chúng tôi bỏ trống để bạn tự cài đặt trong trường hợp bạn cần đồng bộ dữ liệu xuống DB thì chúng ta viết code ở đây và sử dụng chữ @Remove để khi thực hiện xong, container sẽ tự hủy bean như trong mô hình chu kỳ sống của stateful
- Bổ sung phương thức business method getCart để lấy Cart ra trình bày
- Để định nghĩa JNDI cho container hỗ trợ injection khi tìm kiếm resource của EJB của client mà không cần sử dụng JNDI, chúng ta add thư viện jboss-ejb3-ext-api.jar vào project
- Bước 4: Cấu hình thông tin để sử dụng và mapping bean
- Chúng ta bổ sung mapping bean vào trong Business class với 02 dòng @RemoteBinding và @LocalBinding
- Trong đó tên jndiBinding là tên chúng ta tự đặt để sau này lookup hay inject khi cần cần nối ở client tương tự như cách chúng ta cấu hình sử dụng xml với jboss.xml trong EJB 2.1
- Chúng ta hoàn tất xong việc mapping bean
- Chúng ta có tập tin Business Interface với Local và Remote như sau
- Kết thúc bước này chúng ta hoàn tất việc cấu hình cho bean và chúng ta tiến tới sử dụng bean trong ứng dụng web. Gói ejb được cập nhật như sau
- Bước 5: Tạo giao diện web để sử dụng các chức năng như sau
- Chúng ta cập nhật giao diện cho phép người dùng chọn hàng cho ứng dụng qua trang index.jsp
- Phát sinh Controller để sử dụng như sau
- Add hàng đến giỏ hàng
- Lấy session hiện hành, tìm giỏ hàng, kiểm tra giỏ hàng có chưa
- Nếu chưa có, tạo giỏ hàng – thực ra tạo session bean, kết nối đến bean
- Lấy tựa sách chọn lựa, tạo object hàng, add vào giỏ hàng
- Cập nhật session
- View Cart : chuyển sang trang show.jsp để lấy dữ liệu từ session và trình bày ra màn hình dưới dạng lưới
- Thực hiện chỉnh trình bày dữ liệu ra màn hình sử dụng JSTL (add thư viện JSTL 1.1 vào project web) và tạo trang show.jsp và viết code như sau
- Chúng ta hoàn tất việc bước đầu trong việc add cart và view cart vừa add
- Bước 6: Thực hiện Build Project, Start Server, Deploy để testing
- Lưu ý: Chúng ta cứ chờ cho việc deploy hoàn tất, không nên vội vã, bất cứ hành động nhanh nhẩu nào sẽ gây lỗi cho code phát sinh
- Thực hiện testing tương tự như tutorial CMR 1:1
- Click chuột phải trên thành phần gói war trong gói ứng dụng của Enterprise Application, chọn Open in Browser
- Chúng ta thấy chương trình chạy đầu tiên nó kích hoạt như sau
- Chọn các giá trị cần đưa vào giỏ
- Lưu ý: khi thực hiện, chúng ta thấy dưới server có các cảnh báo về injection tương tự như khái niệm đã nêu
- Nhấn View Cart chúng ta thấy kết quả
- Bước 5: Chúng ta tiếp tục cập nhật chức năng cho trang show.jsp với khả năng remove sách ra khỏi giỏ hàng và add thêm hàng vào giỏ hàng
- Cập nhật Controller để xử lý 02 chức năng AddMore và Remove Cart
- Add More: chuyển sang trang index để người dùng tiếp tục chọn hàng
- Remove Cart
- Lấy Session hiện hành, kiểm tra session khác null
- Lấy giỏ hàng, kiểm tra giỏ hàng
- Kiểm tra khách hàng có check không
- Nếu có, thực hiện gọi hàm từ Session Bean để xóa
- Cập nhật Session và trả kết quả về cho người dùng
- Clean and Build Project, Deploy và Testing
- Thực hiện chạy nhấn nút ViewCart
- Nhấn link AddMore, add hàng một lần nữa, rồi nhấn View Cart
- Check vào sách cần bỏ, nhấn nút Remove
- Cập nhật Controller để xử lý chức năng check out
- Thực hiện deploy lại và thực hiện mở ứng dụng đến chức năng View
- Nhấn Nút Checkout
- Click View Cart thì không có gì cả vì khi checkout phải hủy luôn giỏ hàng
- Khi thực hiện xong, chúng ta undeploy ứng dụng chúng ta sẽ thấy thông báo trên server như sau
Chúc mừng các bạn, chúng ta đã hoàn tất xong việc cài đặt stateful session bean sử dụng EJB 3 và Web. Ngoài ra, chúng ta tăng thêm kiến thức về session bean. Rất mong bài viết sẽ giúp ích cho bạn trong việc sử dụng và làm quen đến các khái niệm session bean của EJB 3
Rất mong sự góp ý chân thành của các bạn và hẹn các bạn trong bài tiếp theo
Không có nhận xét nào:
Đăng nhận xét