Chủ Nhật, 7 tháng 8, 2016

Session Bean trong EJB 2.1 – Cài đặt ứng dụng Shopping Cart sử dụng Stateful

CMP – Container Managed Persistent Bean trong EJB 2

Session Bean trong EJB 2.1 – 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 2.1. 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 2.1 – 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 2.1. 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

Định nghĩa sơ lược về mô hình Enterprise Java Bean – EJB

  • Mô hình EJB đưa ra cách thức xây dựng ứng dụng phân tán – distributed application sử dụng mô hình kiến trúc component dựa các tiêu chí
    • Tập trung xử lý cho việc xây dựng chức năng và qui trình xử lý công việc – business logic: người lập trình tập trung xử lý các nghiệp vụ - business hay workflow của yêu cầu thực cho thật tốt mà không cần quan tâm đến các thành phần công việc khác như bảo mật, dịch vụ kết nối … vì các thành phần này đã được hỗ trợ
    • Chắc chắn – robust: đảm bảo cho việc xây dựng ứng dụng tốt, tiếp cực thực tế của nội dung yêu cầu xây dựng ứng dụng, có khả năng dễ dàng bảo trì
    • Bảo mật – security : hỗ trợ bảo mật cho từng thành phần của ứng dụng thông qua việc khai báo và cấu hình khi lập trình ứng dụng.
  • EJB là thành phần middleware được deploy trên Application Server (lớp thứ 2 làm trung gian giữa giao diện tương tác của người dùng và các thành phần lưu trữ, xử lý dữ liệu) ứng dụng trong mô hình xây dựng ứng dụng phân tán triển khai trên 3 lớp (3 tiers)
    • Lớp xử lý giao diện – presentation layer
    • Lớp xử lý nghiệp vụ – business layer. Lớp này bao gồm xử lý công việc hay chức năng – workflow hay business logic và các thao tác xử lý, truy cập dữ liệu – business data layer thông qua việc kết nối CSDL – DBMS
    • Lớp hỗ trợ kết nối và lưu trữ dữ liệu (data storage, DB, …)
  • Kiến trúc của EJB

      • Trong kiến trúc tổng quát, chúng ta thấy chiều hoạt động của ứng dụng theo thứ tự số đánh và mô hình đưa ra một thành phần mới đó là EJB Container, nơi đón nhận xử lý, chọn lựa enterprise bean instance tương ứng và chuyển xử lý đến bean được chọn lựa, hỗ trợ kết nối DB để truy vấn dữ liệu xử lý và trả kết quả về cho nguời dùng
    • Các thành phần trên mô hình tổng quát muốn trao đổi thông tin và tương tác với nhau phải thông qua một số service như hình vẽ chi tiết bên dưới

    • Kiến trúc theo mô hình mô tả là 3 lớp nhưng J2EE và JavaEE chia mô hình chi tiết thành từng lớp riêng biệt – layer dựa vào các thành phần cho dễ dàng thao tác và xử lý

      • Chúng ta thấy từng layer từ trái sang phải, đó là lớp giao diện người dùng, lớp xử lý đón nhận yêu cầu trên Web Server, lớp xử lý chức năng – Services, lớp xử lý dữ liệu Business Data – Domain, lớp hỗ trợ kết nối với các thành phần lưu trữ dữ liệu Connect Bridge or Driver, và lớp cuối cùng là DBMS hay hệ thống thông tin EIS
    • Kiến trúc luận lý và cơ chế hoạt động của EJB

      • Bước 1, 2 client thực hiện xác định cơ chế tương tác với hệ điều hành như là cách truy xuất tên tập tin thư mục, cách thức truy cập các tên thư mục và tập tin trên hệ điều hành thông qua JNDI – Java Naming and Directory Interface (Đây là cơ chế tổng quát sử dụng API để truy cập các dịch vụ hỗ trợ truy cập tập tin và thư mục không quan tâm đến hệ điều hành)
      • Bước 3, 4 xảy ra sau khi xác định được context cụ thể của hệ điều hành, Client thực hiện tìm kiếm với chức năng lookup để tìm kiếm tên truy cập của Home Object của ứng dụng được deploy trên Application Server. Đây là thành phần tương tác với Enterprise Bean vì Enterprise Bean không được tương tác trực tiếp mà phải thông qua EJB Container. Và đồi tượng Home Object được phát sinh và Administrators Object của EJB Container – Server quản lý khi ứng dụng được deploy vào trong Server
      • Bước 5, 6, 7 , 8, 9: khi home object tồn tại, client phát sinh lệnh create để tạo ra đối tượng tương tác với EJB instances – đối tượng tên là EJB Object. Qui trình tạo ra đối tượng này, tuần tự là tạo ra môi trường hoạt động cho EJB (6), đồng thời tạo Enterprise Bean instance (7) nhưng bản chất ở đây là lựa chọn bean trong pool – nơi các instance bean đã được tạo sẵn khi ứng dụng deploy. Khi instance được chọn lựa xong thì EJB Object mới được tạo ra để liên kết instance bean đươc chọn lựa và thông qua object này clien mới tương tác được với bean. Object instance reference được return lại cho Home Object để trả về cho người dùng (10)
      • Bước 11 đến 15: người dùng tiếp nhận Object và sau đó trên Object đó phát sinh các phương thức tương ứng đê EJB gọi Bean tương ứng với Object để xử lý, kết nối DB, trả kết quả trở về cho người dùng
    • Qua mô hình và cơ chế thực hiện chúng ta nhận thấy EJB Object hoạt động như một proxy và thành phần trung gian giữa người dùng – client và instance bean trong server
    • Trong kiến trúc luận lý này, EJB Server và EJB Container sẽ hỗ trợ tất các các dịch vụ từ transaction, security, quản lý kết nối giữa các instance bean hay các kết nối đến DB, tìm kiếm và deliver các dịch vụ yêu cầu trong EJB Container …
    • EJB hỗ trợ 3 component chính đó là Session Bean, Entity Bean và Message Driven Bean. Trong chủ đề này, chúng tôi đề cập đến Session Bean

Khái niệm về Session Bean trong EJB

  • Tồn tại cùng với thời gian của clients.
  • Được tạo để đáp ứng (response) yêu cầu (request) của client. Bean sẽ bị hủy khi client nhận và xử lý xong response.
  • Đối tượng xử lý nghiệp vụ (business logic, business rule và workflow)
    • Ví dụ: kiểm tra login, xử lý phép tính, quá trình xử lý văn bản, mượn sách thư viện (Qui trình thực hiện)
  • Tại một thời điểm thì một client chỉ dùng 1 instance session bean (do container tạo) mà không chia sẻ cho client khác (một client sử dụng một bean tương ứng với yêu cầu xử lý).
  • Có 02 loại session bean đó là stateless session bean và stateful session bean
  • Stateless Session bean
    • Simple Request: Dùng cho các nghiệp vụ - chức năng với yêu cầu xử lý đơn giản, không cần lưu trữ thông tin sau mỗi lần xử lý hay là kết quả tính toán thông thường không cần cập nhật.
    • Stateless: không cần lưu trữ trạng thái trong quá trình hoạt động (non-converstation). Không duy trì cùng trạng thái khi thực hiện request lần thứ 2.
    • Khi có sự cố, request sẽ được chuyển đến component khác hay instance bean khác tương ứng (do cơ chế 1 đáp ứng 1)
    • Ví dụ: thực hiện thao tác cộng trừ nhân chia, thao tác truy vấn thống kê dữ liệu
  • Stateful Session bean
    • Multiple Request: các nghiệp vụ khi có nhiều yêu cầu tại một thời điểm nhằm đảm bảo hoạt động phức tạp của client.
    • Keep track: lưu trữ trạng thái của việc xử lý request trong quá trình hoạt động và hỗ trợ việc phục vụ nhiều clients
    • Thời gian tồn tại của stateful rất phức tạp vì cơ chế persistent – lưu trữ trạng thái được áp dụng cho bean để có thể chuyển đổi bean giữa các client để đảm bảo khả năng phục vụ của container đối với tất cả yêu cầu của client
    • Ví dụ: shopping carts
  • Người lập trình phải xác định nghiệp vụ - workflow hay chức năng của ứng dụng phát triển – business để chọn lựa hay stateful hay stateless. Tuy nhiên, khi chọn lựa cần cân nhắc
    • Stateful có khả năng mất dữ liệu nhiều hơn stateless vì cơ chế persistence có khả năng gây mất dữ liệu vì cache của server có giới hạn, ngoài ra khi xảy ra sự cố (như crash server) có thể gây mất dữ liệu không thể thực hiện phục hồi.
    • Sử dụng stateless có thể làm giảm hiệu xuất xử lý vì mỗi request sử dụng 1 instance bean (gây nghẽn mạch, thắt nút cổ chai nếu yêu cầu diễn ra quá nhiều)
  • Các thành phần của EJB Session Beans

    • EJB Object – cài đặt tương ứng là Component Interface (Remote và Local Interface)
      • Là một proxy được container tự động phát sinh khi có yêu cầu phương thức từ client có nhiệm vụ kết nối giữa client và instance bean.
      • Chuyển yêu cầu xử lý đến instance bean
      • Có thể truy cập các dịch vụ của container như JNDI registry, security, quản lý transaction, thread pools, quản lý session ….
      • Thiết lập thông tin cấu hình cho việc sử dụng bean.
      • Interface được hỗ trợ bởi gói javax.ejb.EJBObject với các phương thức

Phương thức

Mô tả

getEJBHome()

Tham chiếu hay lấy ra Home Object – thành phần tạo ra EJB Object

getPrimaryKey()

Lấy về đối tượng PrimaryKey của Entity Bean – chỉ áp dụng với Entity Bean

remove()

Hủy EJB Object đối với Session bean. Đối với Entity Bean thực hiện hủy EJB Object và một record tương ứng trên DB (CSDL, file …)

getHandle()

Lấy về thành phần reference nhằm thực hiện đồng bộ cho EJB Object

isIdentical()

Kiểm tra sự tương đương của 02 đối tượng EJB Object tương tự như khái niệm phương thức equals của Object

      • EJB Object được kế thứa từ RMI, do vậy, các thành phần chức năng và cơ chế của RMI sẽ được áp dụng cho EJB Object
  • Remote Interface
    • Định nghĩa các định dạng phương thức (interface) business (tên phương thức, tham số truyền, kết quả trả về), không được phép định nghĩa các phương thức liên quan đến transaction, security
    • Client dựa trên các object này để thực hiện việc gọi các phương thức được cài đặt xử lý của instance bean từ bên ngoài container (không cùng JVM). Do vậy, các phương thức này được bẫy lỗi qua java.rmi.RemoteException vì việc truyền và kết nối của các đối tượng thông qua RMI.
    • Các phương thức trong instance bean được gọi thực thi thông qua EJB Object. Do vậy, Remote Interface được dẫn xuất từ javax.ejb.EJBObject.

  • Local Interface
    • Được thiết kế cho việc định nghĩa và thực thi các phương thức business của instance Bean ngay trong cùng JVM hay Server
    • Tăng tốc độ xử lý ứng dụng (so với Remote Interface) vì việc tham chiếu thực hiện ngay trong cùng JVM. Do vậy các phương thức cái đặt không cần hỗ trợ của RMI với việc bẫy lỗi java.rmi.Exception.
    • Các định nghĩa phương thức của Local Interface có thể tương tự hay khác Remote Interface tùy theo nghiệp vụ yêu cầu của ứng dụng ngoại trừ lớp dẫn xuất là javax.ejb.EJBLocalObject

  • Home Object – cài đặt tương ứng là Home Interface
    • Hỗ trợ client tạo ra EJB Object để thông qua đó client có thể gọi thực thi các phương thức trên Bean thông qua các Component Interface (Remote và Local)
    • Nhiệm vụ của Home Object
      • Tạo EJB Object để client có thể yêu cầu.
      • Khởi tạo thông tin ban đầu cho EJB Object.
      • Tìm kiếm EJB Object tồn tại (nếu đã được tạo – Entity Bean).
      • Remove EJB Object (khi có yêu cầu hay timeout).
      • Chọn các EJB Object phù hợp theo yêu cầu (Entity Bean).
    • Home Object hỗ trợ bởi gói javax.ejb.EJBHome với các phương thức

Methods

Mô tả

getEJBMetaData()

Lấy về các thông tin của EJB đang hoạt động. Thông tin được lấy về được chứa vào đối tượng EJBMetaData

remove()

Hủy EJB Object hay thực hiện hủy đối tượng trên CSDL vật lý (áp dụng đối với Entity Bean)

  • Home Interface
    • Cung cấp thông tin cho container về việc khởi tạo EJB Object và các dịch vụ có liên quan.
    • Vận dụng các phương thức liên quan đến nhiệm vụ của Home Object. Do vậy, Home interface là dẫn xuất từ javax.ejb.EJBHome.
    • Các thành phần được sử dụng cho client ở ngoài JVM gọi đến container trong JVM khác, hỗ trợ cho đối tượng Remote Interface. Do vậy, các phương thức phải vận dụng bẫy lỗi java.rmi.RemoteException.

    • Lưu ý: kiểu trả về của các phương thức trong EJB Home phải là EJB Object vì EJB Home tạo ra EJB Object để liên kết với Bean
  • Local Home Interface
    • Local Home Interface được thiết kế cho việc định nghĩa và thực thi các phương thức đối tượng EJB Object ngay trong JVM hay Server
    • Tăng tốc độ xử lý ứng dụng (so với Home Interface) vì việc tham chiếu thực hiện ngay trong cùng JVM. Do vậy các phương thức cái đặt không cần hỗ trợ của RMI với việc bẫy lỗi java.rmi.Exception.
    • Các định nghĩa phương thức của Local Home Interface giống y hệt  Home Interface ngoại trừ lớp dẫn xuất là javax.ejb.EJBLocalHome

    • Lưu ý: kiểu trả về của các phương thức trong EJB Local Home phải là EJB Object vì EJB Home tạo ra EJB Object để liên kết với Bean
  • Bean class
    • Bean phải cài đặt tất cả các phương thức được khai báo trong tất cả các interface nêu trên để thực hiện xử lý theo yêu cầu của client khi client yêu cầu với container.
    • Ngoài ra, bean các định nghĩa các phương thức để container quản lý bean và bean có thể yêu cầu các dịch vụ từ bean gọi là callback method
    • Bean class sẽ ghi đè lên tập phương thức sẵn có của bean.
    • Bean class được xác định khi các phương thức được định nghĩa

  • EJB Deployment Descriptor
    • Là một tập tin cấu trúc xml đưa ra các tag – element tương ứng với từng đối tượng và thành phần của EJB.
    • Thông báo cho EJB Server/ Container class nào là bean class, class nào là home interface, remote interface, local interface hay local home interface.
    • Mô tả sự tác tương giữa các bean trong ứng dụng (có nhiều bean)
    • Thông báo cho EJB Container các dịch vụ của middle ware (implicit) (như quản lý thời gian tồn tại, persistence, transaction, security) cần hỗ trợ nhằm giảm bớt việc coding.

  • Các thành phần nên trên của ứng dụng sẽ được đóng lại thành gói ứng dụng của EJB có tên mở rộng của file là *.jar

  • Các trạng thái duy trì trạng thái giữa client và server
    • Conversation state: thông tin, trạng thái trao đổi giữa bean và client được lưu trữ trong bean cho các yêu cầu ở lần tiếp theo
      • Stateful sử dụng loại này để duy trì trạng thái giữa client và server tương tự như các cơ chế tracking mechanism của web server
    • Non-Conversation: thông tin trạng thái không được lưu trữ, mỗi instance bean phải đón nhận dữ liệu thông tin khi xử lý
      • Stateless sử dụng loại này, do vậy, các phương thức hàm được client yêu cầu trong bean phải được truyền tham số hỗ trợ xử lý trong hàm
  • Các phương thức callback method phải cài đặt trong EJB bean class
    • setSessionContext
      • Gateway để tương tác giữa bean và container
      • Hỗ trợ kết nối giữa instance bean với session context.
      • Bean sử dụng session context để truy vấn transaction hiện hành trong container, security, những thông tin liên quan đến home object.

    • ejbCreate:
      • Khởi tạo bean. Hàm này được bean kích hoạt khi người dùng phát sinh lệnh create tương ứng được định nghĩa trong Home Interface
      • Truyền tham số cho bean để khởi tạo giá trị ban đầu. Đối với Stateless Session Bean hàm ejbCreate và create tương ứng là duy nhất và không truyền tham số, trong khi đối với Stateful Session Bean hàm này có thể khai báo nhiều lần với nhiều tham số khác nhau tương ứng với các hàm create trong Home Interface – overloading
      • Phương thức này được gọi sau khi setSessionContext thực thi.

      • Hàm ejbCreate luôn trả về kiểu void nhưng create lại trả về kiểu component interface
    • ejbPassivate:
      • Tạo sự cân bằng (tận dụng tài nguyên), khi yêu cầu tạo thêm các instance, bằng cách lưu trữ tạm thời đến file hay CSDL.
      • Container sẽ giải phóng (release) các bean cùng với tài nguyên.
      • Phương thức này được thực hiện trước khi bean được passivated
      • Phương thức này chỉ được kích hoạt đối với Stateful Session Bean vì stateful duy trì các trạng thái dữ liệu và thực hiện swap bean để chuyển đổi bean cho các thành phần khác còn đối với Stateless thì phương thức này vô nghĩa nhưng vẫn phải bắt buộc định nghĩa trong bean class
      • Cơ chế swap trong stateful session bean

        • Passivate: chuyển đổi bean cho đối tượng đang yêu cầu và thực hiện lưu trữ trạng thái conversation đến bộ lưu trữ. Release resource của bean để trả bean lại cho container
        • LRU – Last Recently Used: lựa chọn bean passivate theo cơ chế bean được ít sử dụng nhất và thứ tự ưu tiên gần bean mới được gán (hiểu theo cơ chế là đáy stack).

    • ejbActivate:
      • Sử dụng các bean được passivated.
      • Container kích hoạt biến cố ejbActivate để phục hồi bean và reinstall lại tất cả resource đã giải phóng khi passivated.
      • Phương thức này chỉ được kích hoạt đối với Stateful Session Bean vì stateful duy trì các trạng thái dữ liệu và thực hiện swap bean để phục hồi trạng thái bean để sử dụng tiếp tục trong khi với Stateless thì phương thức này vô nghĩa vì Stateless bắt buộc đón nhận thông tin mới xử lý được nhưng vẫn phải bắt buộc định nghĩa trong bean class
      • Cơ chế swap trong stateful session bean
        • Activate: Khi client yêu cầu thì các trạng thái converstion được phục hồi cho bean thông qua việc lấy thông tin lưu trữ ở storage. Nếu tại thời điểm đó hệ thống ở trạng thái bận – busy thì ở chế Passivate sẽ phải được thực hiện và lấy bean để container có thể activate
        • JIT – Just In Time:  đáp ứng yêu cầu khi client gửi yêu cầu.

    • ejbRemove
      • Hủy 01 EJB Object tương ứng khi người dùng gọi hàm remove. Container sẽ kích hoạt hàm này để hủy mối liên kết giữa người dùng và instance bean
  • Chu kỳ sống và tồn tại của Session Bean

Cách thức cài đặt Session Bean

  • Step 1: Tạo Remote Interface
    • extends javax.ejb.EJBObject
    • Định nghĩa các phương thức xử lý mà ứng dụng phải thực hiện
    • Interface và phương thức phải khai báo là public.
    • Các phương thức phải được bẫy lỗi qua java.rmi.RemoteException
  • Step 2: Tạo Home Interface
    • extends javax.ejb.EJBHome
    • Định nghĩa phương thức create() không tham số bẫy lỗi   java.rmi.RemoteException và javax.ejb.CreateException
    • Kiểu dữ liệu trả về của create() là kiểu Remote Interface
    • Interface và phương thức phải khai báo là public.
  • Step 3: Tạo Local Interface (Không bắt buộc)
    • extends javax.ejb.EJBLocalObject
    • Định nghĩa các phương thức giống y hệt Remote Interface và bỏ đi bẫy lỗi java.rmi.RemoteException trên từng phương thức
  • Step 4: Tạo Home Interface (Không bắt buộc)
    • extends javax.ejb.EJBLocalHome
    • Định nghĩa phương thức create() không tham số bẫy lỗi  javax.ejb.CreateException
    • Kiểu dữ liệu trả về của create() là kiểu Local Interface
    • Interface và phương thức phải khai báo là public.
  • Step 5: Tạo Bean Class
    • implements javax.ejb.SessionBean
    • implements 05 phương thức callbacks
    • implements các phương thức đã được định nghĩa trong Remote/ Local Interface
    • Interface và phương thức phải khai báo là public.
    • Các Exception và tham số truyền của bean class và Interface phải giống nhau ngoài trừ RemoteException
  • Step 6: Tạo Deployment Descriptor cho ejb-jar.xml và jboss.xml (vì deploy tên JBoss – Application Server hỗ trợ EJB) đặt trong thư mục META-INF
    • Cấu trúc ejb-jar.xml

<?xml version="1.0"?>

<ejb-jar version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">

 

<ejb-jar>

       <enterprise-beans>

                   <session>

                               <ejb-name>Tên đại diện</ejb-name>

                               <home>tên interface home</home>

                               <remote>tên interface remote</remote>

                               <local-home>tên interface local home</local-home>

                               <local>tên interface local</local>

                               <session-type>Stateless/Stateful</session-type>

                               <transaction-type>Bean</transaction-type>

                   <session>

       </enterprise-beans>

</ejb-jar>

    • Cấu trúc jboss.xml

<?xml version="1.0"?>

<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN"

 "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">

<jboss>

       <enterprise-beans>

         <session>

                   <ejb-name>Tên đại diện</ejb-name>

                   <jndi-name>Tên để tham chiếu cho remote</jndi-name>

              <local-jndi-name>Tên để tham chiếu cho local</local-jndi-name>

          <session>

       </enterprise-beans>

</jboss>

  • Step 7: Tạo jar file
    • Biên dịch các class Java
    • Sử dụng lệnh đóng gói: jar –cvf tênfile.jar classjava META-INF/*
  • Step 8: Deploy
    • Run Application Server
    • Deploy EJB-JAR file lên Application Server (xác định tên deploy)
  • Step 9: Tạo Client program
    • Dùng JNDI tìm kiếm ứng dụng trên Application Server
    • Thực hiện tạo EJB Object
    • Thực hiện các phương thức theo yêu cầu
  • Step 10: Chạy Client để kiểm tra ứng dụng

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ú 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 4.2.3 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  EJB2StatefulShoppingCart
    • Chúng ta chọn Server là JBoss 4.2.3 GA và version của Java EE là J2EE 1.4 bởi vì chúng ta đang tạo trên nền EJB 2.1
    • Chúng ta sẽ có project trên NetBeans như sau

  • 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 ejb-jar.xml được Netbeans cập nhật tự động 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
    • Để có thể ứng dụng giỏ hàng và chứa từng mặt hàng trong giỏ hàng ở Session Bean, chúng ta cần tạo từng đối tượng – item của giỏ hàng, sau đó cần tạo một giỏ chứa item đó là tập collection để chứa dữ liệu, sau đó dùng loại dữ liệu này trong Session Bean để xây dựng các phương thức chức năng thao tác trên giỏ
      • Tạo đối tượng để quản lý từng item hay một món hàng có tên là BookDTO với 02 thuộc tính là title – tựa sách và số lượng sách – quantity. Tạo Java Class tên BookDTO, package sample.stateful, định nghĩa thuộc tính và get/set cho chúng

      • Tiếp theo phát sinh đối tượng giỏ hàng có chứa nhiều mặt hàng, với các phương thức hay chức năng tương ứng là addBook – add một quyển sách vào giỏ hàng, removeBook – hủy bỏ sách khi biết tựa sách

    • Quay trở lại Session Bean để khai báo giỏ hàng trong session nhằm sử dụng và cung cấp chức năng của người dùng. Biến khai báo tên cartObj, kiểu dữ liệu giỏ hàng CartBean. Ở đây chúng ta có thể khai báo vì đây là Stateful, thông tin được lưu trữ lại trong session, còn stateless thì việc khai báo biến là vô nghĩa

    • Phát sinh hàm business method có tên
      • getCartObj: lấy về giỏ hàng hiện hành đang được lưu trữ trong session bean
      • addBook: nhận tham sô là sách thực hiên add sách vào giỏ hàng
      • removeBook: nhận tham số là tựa sách để xóa sách ra khỏi giỏ hàng
      • Lưu ý: bất kỳ object nào muốn sử dụng phải khởi tạo do vậy, chúng ta phải tạo mới object giỏ hàng tại phương thức ejbCreate để khi người dùng tạo Session bean thì giỏ hàng được tạo mới cho nguời dùng. Nếu chúng ta làm thiếu thì khi thực hiện chức năng thao tác giỏ hàng trên session thì chương trình sẽ phát sinh lỗi NullPointerException

      • Các thành phần Remote và Local Interface được cập nhật như sau

  • Bước 4:  Cấu hình thông tin để sử dụng và mapping bean, áp dụng tương tự như tutorial CMR 1:1

    • Lưu ý
      • Tên tag ejb-name phải được mapping chính là tag ejb-name trong tập tin ejb-jar.xml (cụ thể CartSessionBean)
      • Tên jndi là do chúng ta đặt, tên này chúng ta sẽ dùng truy cập bean
      • Ở đây chúng ta dùng tag local-jndi-name vì các session bean được phát sinh chỉ có Local và Local Home Interface
    • Chúng ta hoàn tất xong việc mapping bean
    • 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
    • Cấu trúc ứng dụng web và project được cập nhật như sau

  • Bước 6: Thực hiện Build Project, Start Server, Deploy để testing thư
    • Deploy tập tin ear vào trong thư mục đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 4.2.3 GA)

    • 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 Enterprise Java Beans và nhấn 3 lần, chọn Servlet 1 lần, chọn JBoss Server 2 lần – không nhất thiết chọn tuần tự, mỗi lần nhấn chọn, trang sẽ được quay lại trang chính.
      • 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
    • Chúng ta bổ sung giao diện vào trang show.jsp như sau

    • 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 và add mỗi món hàng 1 lần, nhấn nút ViewCart

      • Nhấn link AddMore, add hàng một lần nữa Servlet 2, Jboss 2, nhấn View Cart

      • Check vào Servlet và Jboss, nhấn nút Remove

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 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 2.x

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