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

Entity Bean trong EJB 3.0

CMP – Container Managed Persistent Bean trong EJB 2

Entity Bean trong EJB 3.0

Yêu cầu

  • Nắm vững các khái niệm về Entity Bean và CMP và các nguyên lý cơ bản về cài đặt CMP trong EJB 2.1 (https://www.facebook.com/TrongKhanh.Kieu/posts/274033316302715)
  • Nắm vững cú pháp và kiến thức về OOP, đặc biệt EJB QL
  • Tools sử dụng ở đây là Netbeans 6.9.1
  • JDK 6 update 22
  • Server: JBoss 5.1.0 GA
  • DBMS: SQL Server 2005

Một số nguyên lý cơ bản khác nhau giữa Entity Bean trong EJB 2.1 và EJB 3.0

  • Entity Bean trong EJB 3.0 không được xem là thành phần của Server, Entity Bean có thể toàn tại cả Server lẫn Client
  • Entity Bean trong EJB 3.0 được xem như POJO – Plain Old Java Object hay là JavaBean, do vậy, entity bean được xem như Model trong mô hình MVC và không có tồn tại interface và có thể truy cập trực tiếp. Ở đây, Entity Bean có tên gọi mới là Entity Class
  • Các thành phần vận dụng mapping của Entity Bean trong EJB 3.0 dựa trên thành phần annotation mà không cần thiết phải thông qua tập tin cấu hình
  • Bản chất Entity Bean là thành phần xử lý và mapping dữ liệu  (Data Model), do vậy theo khái niệm của thiết kế chúng ta không nên truy cập trực tiếp Entity Bean mà phải truy cập thông qua session Bean (cái áp dụng xử lý qui trình – workflow) và xử dụng việc đồng bộ Java Persistence để đồng bộ
  • Việc xử lý đồng bộ không phải do container của server hỗ trợ dịch vụ như EJB 2.1 mà chúng được giao cho Hibernate để thực hiện xử lý. Hibernate có thể đồng bộ dữ liệu mà không cần lệ thuộc vào Server

Trong phần nội dung này chúng tôi sẽ làm ví dụ mô tả dữ liệu liên quan đến một account tương tự như bài CMP trong EJB 2.1 để giúp chúng ta có thể thấy được sự khác biệt trong cơ chế và cách cài đặt giữa Entity Bean trong EJB 2.1 và EJB 3.0. Dữ liệu mô tả như sau

Ở bài này, chúng tôi sẽ thực hiện hai chức năng chính đó là tạo mới một registration, search một user trong bảng registration khi biết một ký tự trong phần lastname của họ, update thông tin của một user, delete thông tin của một user.  Ngoài ra, sau khi user đăng ký thành công họ có thể thực hiện truy cập hệ thống thông qua chức năng login

Trong phần tutorial này chúng tôi sẽ thực hiện nhóm cách động tương tự các bước trong bài tutorial CMR 1:1

Bước 1: Đăng ký Datasource với Netbeans để Netbeans hỗ trợ chúng ta trong việc phát sinh datasource (bước này có thể bỏ qua nếu bạn đã có datasource rồi) (Vui lòng xem chi tiết Bước 1 trong tutorial CMR 1:1 ((https://www.facebook.com/TrongKhanh.Kieu/posts/273881852984528)))

  • Nếu Datasource với DB mà có chứa các bảng mà chúng ta thao tác đã được đăng ký rồi,
    • Vào trong tab Services, mở rộng phần Database
    • Click phải chuột trên connection mà chúng ta cần làm việc, chọn Connect …

    • Chúng ta nhập username và password để kết nối DB, click OK

  • Lưu ý: Một Database Connection chỉ dùng cho một DB cụ thể, không thể áp dụng cho tất cả các Database vì mỗi Database Connect có 1 chuỗi kết nối đến một DB cụ thể

Bước 2: 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  Day6CMRm_n
    • Chúng ta chọn Server là JBoss5.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.0
      • Lưu ý: Server JBoss 5.1.0 GA phải được add vào trong tab Services của Netbeans 6.9.1

    • Chúng ta sẽ có project trên NetBeans như sau

Bước 3: Tạo Entity Class như sau

  • Tạo Entity Class
    • Click phải chuột trên EJB Project (ở đây có tên là Day7EJB3EntityBean-ejb), chúng ta chọn New, chọn Other …

    • Chọn Persistence trong Categories, chọn Entity Classes from Database trong File Types
    • Click nút Next
    • Chúng ta tạo Datasource tương tự như CMR 1:1 và ở đây chúng ta đặt tên Datasource là CMPEJB3, tập tin jboss-ds.xml tại Server Resource sẽ được cập nhật như hình bên dưới

    • Sau khi các bảng được lấy về, chúng ta chọn bảng cần phát sinh Entity Class (ở đây là bảng Registration) và nhấn nút Add >

    • Chúng ta click nút Next

    • Thành phần Entity Classes sẽ khác hoàn toàn so với EJB 2.1, ở đây phát sinh class sẽ phải dùng toán tử new khi sử dụng như Java Object bình thường
    • Đặt tên package cho code của chúng ta trong ô Package (ở đây tôi nhập sample.ejb3)
    • Tại đây chúng ta chọn “Create Persistence Unit”. Nội dung này sẽ tạo cho chúng ta tập tin mapping là persistence (tạo ra tập tin persistence.xml). Chúng ta sẽ thấy tập tin và cấu trúc của hình bên dưới khi hoàn tất toàn bộ quá trình tạo Entity Class

    • Chúng ta nhấn Next

    • Ở đây chúng ta sẽ chọn Collection Type có thể là Collection hay Set hay List, nhưng ở đây chúng tôi chọn loại Collection để tương thích với cách phát sinh của EJB 2.1
    • Bên cạnh đó, chúng ta phải check vào “Fully Qualified Database Table Names” và “Attributes for Regenerating Tables” để tool Netbean hỗ trợ chúng ta phát sinh code (các thuộc tính của entity class và một số query object cơ bản)
    • Chúng ta nhấn nút Finish để hoàn tất quá trình tạo bean
    • Netbeans phát sinh và cập nhật project chúng ta với 01 java class được tạo ra như sau (không có bất kỳ interface nào cả)
      • Lưu ý: code phát sinh luôn luôn chứa đựng annotation thay cho việc mapping trực tiếp vào tập tin ejb-jar.xml như EJB 2.1 và container sẽ phát sinh code tương ứng khi chạy và deploy

    • Kết thúc bước này chúng ta đã tạo được bean và mapping nhưng chúng ta vẫn chưa sử dụng được chúng

Bước 4: Tạo Session Bean để đưa ra bên ngoài cho client sử dụng

  • Chúng ta click phải chuột trên bean project (ở đây sẽ là Day7EJB3EntityBean-ejb)
  • Chọn New, chọn Session Bean… hay chọn New, chọn Other, chọn JavaEE trong Categories, chọn Session Bean trong File Types

  • Đặt tên bean RegistrationSBean, chọn package y như entity class ở trên (sample.ejb3), ở EJB3 thì session bean được phát sinh giống như là EJB 2.1, ngoại trừ không tồn tại Home Interface

  • Chúng ta thực hiện tạo các phương thức hàm để sử dụng các thành phần Entity Classes và đưa một số chức năng cho người sử dụng qua Session Bean interface
    • Chúng ta thực hiện đưa Entity Manager vào để Session Bean có thể kết nối với Entity Class
    • Click phải chuột trên Session Bean class (RegistrationSBeanLocal.java), click chọn Persistence, chọn Use Entity Manager. Code sẽ phát sinh như sau trong Session Bean

  • Phát sinh hàm insert để thực hiện insert dữ liệu xuống DB, thực hiện Insert Code, chọn Add Business Method
  • Hàm insert trả về kiểu boolean, hàm truyền 4 tham số String username, String password, String lastname, boolean roles (tương ứng với các field tương ứng dưới DB)
  • Code của hàm insert được cập nhật như sau

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

  • Mapping bean để khi deploy server có thể quản lý và đưa ra tên để chúng ta kết nối tới khi sử dụng trong tập tin jboss.xml như hình vẽ bên dưới

  • Lưu ý
    • Tên tag ejb-name phải được mapping chính là tên tập tin Session Bean class (cụ thể RegistrationSBean – tên class RegistrationSBean.java)
    • 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 cmp được phát sinh chỉ có Local và Local Home Interface
  • Chúng ta hoàn tất xong việc mapping bean
  • Chúng ta không thực hiện mapping DB và đồng bộ giữa instance object và DB thông qua tập tin jbosscmp-jdbc.xml vì tất cả các khai báo trong Entity class đã được khai báo thông qua annotation trong Entity class (chúng ta đã thấy code và annotation phát sinh trong tập tin
  • Kết thúc bước này chúng ta hoàn tất việc cấu hình cho bean

Bước 6: Tạo giao diện web để sử dụng chức năng insert

  • Chúng ta chuyển sang gói Day7EJB3EntityBean-war, chỉnh sửa giao diện tập tin index.jsp như sau

  • Phát sinh Controller để sử dụng như sau

  • Thực hiện Build Project, Start Server, Deploy để testing thư
    • Deploy đến Server: deploy tập tin jboss-ds.xml tại thư mục
      <Thư mục lưu trữ project>\ Day7EJB3EntityBean\ Day7EJB3EntityBean-ejb\setup\đến JBOSS_HOME\server\default\deploy (Lưu ý: server của chúng ta bây giờ là JBoss 5.1.0 GA). Chúng ta thấy server có kết quả y như tên chúng ta thấy trong tập tin persistence.xml

    • Deploy tập tin ear vào trong thư mục deploy như trên, ta thấy trên server

      • Lưu ý:
        • Cách deploy của EJB 3.0 này nhiều hơn so với EJB 2.1 và Hibernate sẽ phải deploy tất các các thành phần liên quan đến query và các thành phần của Entity Class, do vậy, việc deploy hơn chậm một chút. Tới khi nào chúng ta thấy được hình như trên là việc deploy thành công
        • 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, chọn tab Services, chọn Servers, chọn Web Application, chọn tên Project có gói war
      • Trong EJB 3 và Server JBoss 5.1.0 GA, server đã tách biệt gói jar và gói war, và không thể hiện gói jar trong EJB Module lẫn Enterprise Application
    • Click chuột phải, chọn, Open in Browser
    • Kết quả testing demo như sau
      • DB trước khi Insert

      • Kết quả nhập liệu testing

  • Chúng ta đã hoàn tất được chức năng insert

Bước 7: Bổ sung chức năng Search để tìm kiếm tất cả các user khi biết một ký tự trong lastname được người dùng nhập vào trên form

  • Cập nhật hàm Search trong Session bean như sau (phát sinh theo cách phát sinh một phương thức cho người dùng – Business method)
    • Nhấn chuột phải trên bean, chọn Insert Code, chọn Add Business Method …
    • Gõ vào hàm Search searchLikeLastName, một tham số là name

      • Lưu ý:
        • Chúng ta sử dụng Entity Manager để hỗ trợ tìm kiếm qua việc gọi các thành phần phát sinh sẵn trong Entity Bean
        • Việc sử dụng những hàm có sẵn giúp đáp ứng như cầu đơn giản nhưng các query này không đáp ứng được các nhu cầu theo yêu cầu, do vậy, chúng ta có thể phát sinh thêm hàm trong Entity Class như sau

        • Để tránh sai sót, chúng ta copy toàn bộ nội dung query phát sinh sẵn, theo dấu phẩy “,”, dán toàn bộ nội dung copy vào vị trí đó, chỉnh sửa phần name và câu lệnh truy vấn (sử dụng EJB QL)
        • Không nên phát sinh quá nhiều các truy vấn trong Entity Class bởi vì khi deploy Hibernate và Server phải deploy, đôi lúc không dùng. Do vậy, trong các phần bên dưới chúng ta sẽ thực hiện các câu truy vấn trực tiếp trong phần xử lý để khi cần mới sử dụng và thao tác tương tự như cách chúng ta thực hiện truy vấn dữ liệu từ xa trên JSP hay trên bất kỳ ngôn ngữ nào khác
    • Đồng thời Netbeans cũng cập nhật Local và Remote Interface như sau

 

  • Chúng ta tạo giao diện để xử lý như sau
    • Tạo tập tin jsp có dạng như sau

    • Cập nhật Controller như sau

    • Tạo trang show.jsp để trình bày dữ liệu như sau
      • Lưu ý: import thư viện JSTL 1.1 vào Library của project

      • Lưu ý:
        • Giá trị điền trong EL language ${rows.<tên thuộc tính trong entity Class>} (ví dụ ${rows.username}) đây là field chúng ta lấy từ các thuộc tính có trong entity class và nó được tạo ra các get/set method trong tập tin entity class (ở đây là tập tin Registration.java)
    • Clean and Build, Deploy lại và Testting

    • Chúng ta đã hoàn tất xong chức năng Search

Bước 8: Bổ sung chức năng Update để cập nhật thông tin password và roles trên kết quả tìm được của Search nêu trên

  • Chúng ta cập nhật hàm update tương tự như hàm search ở trên (Lưu ý: tất cả các hàm đều phát sinh trong session bean và các phương thức đều là business method và đưa interface ra remote và local)

 

 

 

  • Chúng ta chỉnh sửa giao diện để xử lý như sau
    • Tạo tập tin show.jsp được chỉnh sửa mới có dạng như sau
      • Lưu ý: chúng ta cập nhật kích hoạt trên từng record một, do vậy, form ở đây phải tồn tại trên từng hàng, nghĩa là form phải được đặt trong vòng for
      • Bởi vì khi truyền dữ liệu đến server xử lý, mà khóa chính không được sửa, cho nên chúng ta áp dụng kỷ thuật hidden form field với khóa chính để xử lý
      • Để tạo cảm giác khi dữ liệu được cập nhật trên trực tiếp trên lưới, một lần nữa chúng ta phải dùng kỹ thuật hidden form field để lưu trữ lại giá trị search, bên cạnh đó controller chúng ta đang áp dụng RequestDispatcher, do vậy tham số sẽ được truyền và giữ trên request. Do vậy, chúng ta dùng EL ${param.<tên tham số>} (ở đây là ${param.txtLast} – giá trị được dùng để Search trong chức năng Search)
      • Các control được vẽ khung xanh thể hiện chúng ta muốn cập nhật các field tương ứng, nếu không chúng để in chữ như bình thường như lastname

    • Chúng ta cập nhật Controller như sau

    • Chúng ta thực hiện Clean and Build, Deploy lại Project, testing
      • DB trước khi update

      • Thực hiện testing (Lưu ý nhớ refresh service tại server để lấy bảng cập nhật trong lúc testing bằng cách Click phải chuột trên Enterprise Application trong Server, chọn Refresh)

      • Chỉnh sửa giá trị và nhấn Update (password là ejb_31, gỡ bỏ admin)

 

    • Chúng ta hoàn tất xong chức năng Update

Bước 9: Bổ sung chức năng Delete trực tiếp trên lưới sử dụng link trên một hàng cụ thể (lưới dữ liệu dựa trên kết quả tìm được của Search ở bước 7)

  • Bổ sung chức năng delete vào trong Session Bean với tham số duy nhất là khóa chính username, code sẽ được cập nhật trên Session Bean, Local và Remote

 

 

  • Chúng ta chỉnh sửa giao diện để xử lý như sau
    • Tạo tập tin show.jsp được chỉnh sửa mới có dạng như sau
      • Lưu ý: Bởi vì khi truyền dữ liệu đến server xử lý, mà áp dụng hyperlink, cho nên chúng ta áp dụng kỷ thuật URL Rewriting

    • Cập nhật Controller như sau

    • Chúng ta thực hiện Clean and Build, Deploy lại Project, testing
      • Thực hiện testing (Lưu ý nhớ refresh service tại server để lấy bảng cập nhật trong lúc testing bằng cách Click phải chuột trên Enterprise Application trong Server, chọn Refresh)

      • Click link Delete

    • Chúng ta đã hoàn tất xong chức năng Delete

Bước 10: Bổ sung chức năng checkLogin để cho bắt buộc user phải là người của hệ thống mới truy cập được dữ liệu

  • Cập nhật Session Bean
    • Ở đây chúng ta không cần cập nhập Entity class (ở đây là tập tin Registration.java) vì chúng ta không nên làm nặng thêm quá trình deploy bean như đã nêu ở trên
      • Trong EJB 3 không còn tồn tại khái niệm ejbSelect hay ejbHome, tất cả việc ở đây là chúng ta xử lý ở phần Session Bean
    • Cập nhật tên Hàm là checkLogin và 2 tham số vào Session Bean như hình bên dưới (vẫn áp dụng Add Business Method …), Netbeans sẽ phát sinh hàm trong session bean, trong local và remote Interface

 

    • Chúng ta đã hoàn thành xong phương thức checkLogin để người dùng có thể sử dụng thông qua giao diện
  • Chúng ta bổ sung giao diện để xử lý như sau
    • Bổ sung trang login.jsp như sau

    • Cập nhật lại web deployment descriptor (web.xml) để trang login chạy đầu tiên

    • Cập nhật Controller cho việc xử lý (lưu ý tạo session để xác nhận người dùng trên từng trang)

    • Cập nhật các trang trình bày để trình bày session, cụ thể trang index, trang search, trang show

 

 

    • Clean and Build Project, Deploy lại, và Test 1 lần nữa

    • Chúng ta đã hoàn thành chức năng checkLogin và lưu trữ session cho người sử dụng

 

Chúc mừng các bạn, chúng ta đã hoàn tất xong việc cài đặt Entity Bean trên EJB 3.0 (bạn phải nắm bắt được khái niệm trong bài khái niệm Entity Bean trong mô hình EJB 2.1). 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 của EJB 3.0, đặc biệt ở đây là Entity Class

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 đó là vận dụng CMR trên EJB 3.0 để chúng ta thấy được sự đơn giản và súc tích trong EJB 3.0 , đặc biệt một số khái niệm hiện đại làm tăng khả năng và hiệu suất cho người lập trình trong việc khắc phục một số thiếu sót của EJB 2.1 về cài đặt, vận dụng và ý tưởng

 

Không có nhận xét nào:

Đăng nhận xét