Thứ Bảy, 28 tháng 1, 2012

JSF - Bài 4 (tiếp theo): Thức ăn cho vật nuôi (Pet Food)



Center of Excellence


Bài 4 (tiếp theo)
Thức ăn cho vật nuôi (Pet Food)


Đây là bài đầu tiên phát triển một application có truy xuất đến cơ sở dữ liệu quan hệ (relational database, viết tắt là DB). Sẽ có thêm khá nhiều chi tiết mới. Bạn cần đọc và thực hành nhiều lần cho đến khi tự mình phát triển giải pháp mà không cần nhìn vào bài.

I. Bài toán

Một cửa hàng bày bán các loại thức ăn cho vật nuôi như sau:

Loại (grade)
Giá (cents/lb.)
A
30
B
20
C
10

Giả sử rằng thông tin ở bảng trên được lưu vào một DB, hãy phát triển một web application để xác định giá của một loại thức ăn cho trước, dựa trên thông tin đã được lưu vào DB. Dưới đây là một UI mẫu.

Hình 1

II. Giải pháp

Project: PetFoodJSF_DB

Đầu tiên ta thiết kế một DB và lưu thông tin vào đó, kế đến sẽ tạo một class gọi là entity, sau đó là stateless session bean, và từ đó về sau, mọi thao tác liên quan đến data trong DB đều được thực hiện qua stateless session bean này. Kiến trúc tổng thể của hệ thống sẽ như sau

Hình 2

1. Thiết kế DB

1.1. Tạo mới một DB

Click Services tab ở bên trái để truy xuất dịch vụ DB. (Nếu không thấy tab này thì click Window menu, rồi chọn Services.)

Hình 3

Mở rộng Databases node, ta thấy có sẵn một hệ quản trị cơ sở dữ liệu (database management system, viết tắt là DBMS) tên là Java DB, và trong Java DB đã có sẵn một DB là sample.

Hình 4

Ta tạo mới một DB lấy tên là petfood bằng cách right-click Java DB, rồi chọn Create Database... để chuyển sang Create Java DB Database window.

Hình 5

Nhập petfood vào ô Database Name:, và cho dễ nhớ, ta đều nhập petfood vào các ô còn lại. (Dĩ nhiên trong thực tế, ta cần chọn lựa cẩn thận nội dung của các ô User Name:Password:).

Hình 6

Sau khi click OK, Services window sẽ xuất hiện petfood DB. Để kết nối với DB này, right-click vào đó, rồi chọn Connect...

Hình 7


1.2. Tạo bảng (table) và lưu giá trị vào table

Ta tạo table bằng cách right-click PETFOOD rồi chọn Execute Command...

Hình 8

Dựa vào thông tin do bài toán cung cấp, ta dùng câu lệnh create table trong ngôn ngữ SQL (Structured Query Language) để tạo petfood table. Table này có hai cột (columns).
  • Column thứ nhất là grade với data type là một ký tự, character(1), không được chứa giá trị null (not null), đồng thời column này được dùng làm khóa chính (primary key). Một đặc trưng của primary key là tính duy nhất (không được phép trùng lặp).
  • Column thứ hai là price với data type là integer, và không chứa giá trị null.
    Sau khi tạo xong table, ta tiến hành nhập ba cặp giá trị (grade, price) vào table bằng câu lệnh insert. Mỗi cặp giá trị được gọi là một dòng (row) trong table. Để thực thi các câu lệnh SQL, click Run SQL icon.

Hình 9

Để kiểm tra data lưu trong table, ta right-click PETFOOD table rồi chọn View Data...

Hình 10


2. Tạo entity class

Khi làm việc với DB, ta phải dùng các khái niệm như table, row, và column. Chúng hoàn toàn xa lạ với phong cách OOP, ở đó ta dùng các khái niệm như class, object, và field. Để có thể nhìn DB theo quan điểm OO, ta cần ánh xạ (map) table vào một class chuyên biệt gọi là entity (thực thể). Entity chẳng qua là một class thông thường với vài annotations và getter/setter cho fields.

Sau đây ta tạo PetFood entity đối ứng với PETFOOD table trong DB.

Hình 11

Right-click Source Packages, chọn New, rồi chọn Entity Classes From Database... để chuyển sang New Entity Classes From Database window.

Hình 12

Đến đây ta cần cung cấp thông tin về DB mà application sẽ làm việc với. Chọn New Data Source... trong mục Data Source: để chuyển sang Create Data Source window.

Hình 13

Nhập jdbc/petfood vào ô JNDI Name: (ta thường đặt tên theo qui ước, bắt đầu bằng jdbc/, tiếp sau là tên DB), chọn petfood trong mục Database Connection:, rồi click OK để trở về New Entity Classes From Database window.

Hình 14

Chọn PETFOOD ở mục Available Tables: bên trái, click Add button để chuyển table đó sang mục Selected Tables: bên phải, rồi click Next để chuyển sang mục Entity Classes.

Hình 15

Nhập data.entity vào ô Package: rồi click Next để chuyển sang mục Mapping Options.

Hình 16

Click Finish để hoàn tất.

Hình 17

Hình 18

Để ý rằng Petfood entity đã có sẵn một số câu truy vấn (query) DB thông dụng. Sau này ta sẽ dùng câu query “Petfood.findAllGrades” để cung cấp cho UI screen (thông qua managed bean) danh mục tất cả các grades có trong DB.


3. Tạo stateless session bean class

Đến đây ta đã hoàn tất việc ánh xạ (mapping) một DB Table vào một entity để có thể làm việc với table theo phong cách OO. Với một entity/table, ta có tối thiểu bốn thao tác cơ bản, gọi tắt là CRUD: Create (lưu objects/rows vào entity/table), Read (truy xuất objects/rows trong entity/table), Update (thay đổi nội dung của objects/rows), và Delete (xóa objects/rows ra khỏi entity/table). Ngoài CRUD, application còn cần quan tâm đến vấn đề quản lý giao tác (transaction), an ninh (security), đồng hành (concurrency), và nhiều chi tiết phức tạp khác. May thay, ta có thể khai báo một class chuyên biệt, gọi là session bean, nhằm giúp xử lý tất cả các chi tiết trên. Ở bài này, ta sẽ dùng một stateless session bean (session bean phi trạng thái) đặt tên là PetFoodFacade.

Hình 19

Right-click Source Packages, chọn New, rồi chọn tiếp Other... để chuyển sang New File window.

Hình 20

Chọn Enterprise JavaBeans ở mục Categories: bên trái, chọn tiếp Session Beans For Entity Classes ở mục File Types: bên phải, rồi click Next để chuyển sang New Session Beans For Entity Classes window.

Hình 21

Chọn data.entity.PetFood ở mục Available Entity Classes: bên trái, click Add button để chuyển entity đó sang mục Selected Entity Classes: bên phải, rồi click Next để chuyển sang màn hình Generated Session Beans.

Hình 22

Nhập data.facade vào ô Package: rồi click Finish. Khi đó NetBeans sẽ tạo hai classes: AbstractFacadePetFoodFacade. Từ nay về sau, khi thao tác trên PETFOOD table, ta sẽ dùng PetFoodFacade.

Hình 23

4. Truy xuất data qua session bean

4.1. Truy xuất grades qua session bean

Đến đây, ta đã thiết kế DB, tạo entity, và tạo session bean. Để managed bean có thể cung cấp danh mục tất cả các grades trong DB, ta cần nhờ đến session bean thông qua việc tạo thêm findAllGrades() trong đó.

Hình 24

Hình 25

Bây giờ, từ managed bean, ta có thể sử dụng session bean như sau: Right-click bên trong managed bean, chọn Insert Code...

Hình 26

Chọn tiếp Call Enterprise Bean... để chuyển sang Call Enterprise Bean window.

Hình 27

Chọn PetFoodFacade rồi click OK. Khi đó NetBeans sẽ chèn PetFoodFacade vào trong managed bean.

Hình 28

Hình 29

Lúc này ta có thể dùng PetFoodFacade để xác định grades.

Hình 30


4.2. Truy xuất price qua session bean

Để xác định price ứng với một grade đã cho, từ managed bean, ta làm như sau.

Hình 31

Trước khi thi hành application để kiểm tra kết quả, ta bổ sung thêm clear() method.

Hình 32


III. Tổng kết

Bài viết đã trình bày cách vận dụng các khái niệm về DB, entity, stateless session bean, và một số khái niệm khác để phát triển giải pháp nhằm giải quyết bài toán xác định giá của các loại thức ăn cho vật nuôi, trong đó thông tin về loại thức ăn và giá tương ứng đã được lưu vào một DB.


IV. Tài liệu tham khảo

  1. Gaddis T. (2010) Starting Out with Java: From Control Structures Through Objects, 4th edition, Pearson Education, Boston. Chương 3.
  2. Antonio Goncalves (2010) Beginning Java EE 6 Platform with GlassFish 3, 2nd edition, Apress.

2 nhận xét:

  1. Thanks bạn,
    Bài viết rất hay và bổ ích. Bạn có thể chia sẻ cho mình là bạn đã dùng tool gì để vẽ cái Kiến trúc tổng thể của hệ thống trên vậy ?

    Trả lờiXóa
  2. Nhận xét này đã bị quản trị viên blog xóa.

    Trả lờiXóa