1. Trang chủ
  2. » Luận Văn - Báo Cáo

LVTN công cụ thiết kế CSDL online- tập trung nghiêu cứu xây dựng một công cụ hỗ trợ thiết kế cơ sở dữ liệu trên nền tảng web

87 920 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 87
Dung lượng 1,93 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

CHƯƠNG 2: CƠ SỞ LÝ THUYẾTChương này sẽ giới thiệu về các cơ sở lý thuyết được sử dụng trong đề tài.Phần đầu tiên được nói đến là các mô hình cơ sở dữ liệu, các lệnh sql cơ bản trong hệ q

Trang 1

M c l c ục lục ục lục

CHƯƠNG 1: TỔNG QUAN 4

1.1 ĐẶT VẤN ĐỀ 4

1.2 LỊCH SỬ GIẢI QUYẾT VẤN ĐỀ 4

1.3 PHẠM VI CỦA ĐỀ TÀI 5

1.4 PHƯƠNG PHÁP NGHIÊN CỨU VÀ GIẢI QUYẾT VẤN ĐỀ 6

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 9

2.1 MÔ HÌNH DỮ LIỆU QUAN NIỆM (cdm)[1] 9

2.1.1 Các đối tượng của mô hình dữ liệu quan niệm 10

2.1.2 Các bước xây dựng mô hình dữ liệu quan niệm 13

2.1.3 Chuyển từ mô hình dữ liệu quan niệm sang mô hình vật lý (PDM) 14

2.1.4 Mysql 16

2.2 FRAMEWORK GWT 20

2.2.1 Tổng quan về tập hợp các công cụ cao cấp của GWT [2] 20

2.2.2 Các chức năng cơ bản trong GWT 22

2.3 GOOGLE APP ENGINE VÀ DATASTORE[4] 34

2.3.1 Google App Engine 34

2.3.2 Datastore 35

2.4 SỬ DỤNG OAUTH 2.0 ĐỂ TRUY CẬP CÁC GOOGLE API 37

CHƯƠNG 3: NỘI DUNG NGHIÊN CỨU VÀ KẾT QUẢ 47

3.1 PHÂN TÍCH YÊU CẦU 47

3.2 THIẾT KẾ TỔNG QUAN 49

3.2.2 Mô hình triển khai ứng dụng 50

3.2.3 Giải quyết vấn đề đồ họa 51

3.3 LƯU TRỮ SƠ ĐỒ 63

Trang 2

3.3.1 Cấu trúc file xml 63

3.3.2 Sử dụng datastore trong lưu trữ 65

3.4 CÁC GIẢI THUẬT CHUYỂN ĐỔI GIỮA CÁC LƯU ĐỒ 68

3.4.1 Giải thuật chuyển từ CDM sang PDM 68

3.4.2 Giải thuật chuyển từ PDM sang Mysql 76

3.5 XÁC THỰC VÀ CHỨNG THỰC KHI TRUY CẬP GOOGLE API 82

3.6 KẾT QUẢ 83

CHƯƠNG 4: TỔNG KẾT 85

4.3 KẾT QUẢ ĐẠT ĐƯỢC 85

4.4 HẠN CHẾ 85

4.5 HƯỚNG PHÁT TRIỂN 86

TÀI LIỆU THAM KHẢO 87

Trang 4

CHƯƠNG 1: TỔNG QUAN 1.1 ĐẶT VẤN ĐỀ

Điện toán đám mây là công nghệ được nói đến nhiều nhất trong năm Trướcđây, sự phát triển của web 2.0 làm tăng khả năng tương tác với người dùng và làmphát sinh ra ý tưởng phần mềm như một dịch vụ Môt phần mềm chạy trên nềntảng web, người dùng có thể truy cập và sử dụng mọi lúc mọi nơi mà không quantâm tới vấn đề cài đặt, bảo trì, nâng cấp Một phần mềm độc lập với nền tảng thậmchí là thiết bị Một điều thú vị ở đây là cách chúng ta thanh toán khi sử dụng sảnphẩm, không giống như ngành kinh doanh phần mềm truyền thống, thay vì phảimua trọn gói thì người dùng chỉ chi trả chi phí cho những gì mình sử dụng, có thểtính theo tháng, theo giờ hay theo dịch vụ tùy nhà cung cấp Đến thời đại của điệntoán đám mây, thì nó không còn là ý tưởng mà trở thành xu hướng Một xu hướngmới, một xu hướng tác động mạnh đến nền công nghệ phần mềm, làm thay đổicách mà người ta phát triển ứng dụng, cách mà người ta kinh doanh phần mềm Xuhướng đã xuất phát từ những ứng dụng doanh nghiệp như CRM củasalesforce.com hay ERP… Ngày nay các nhà cung cấp dịch vụ đám mây côngcộng cũng đã và đang xây dựng cho các nhà phát triển của họ một môi trường pháttriển trực tuyến (online) như công cụ Visualforce của Salesforce hay theoinfoworld, môi trường phát triển ứng dụng dựa trên nền tảng web Orion của tổchức Eclipse được hy vọng tương lai không xa sẽ thay thế những công cụ pháttriển truyền thống Theo xu hướng đó, nhóm thực hiện đề tài đề xuất ý tưởngnghiên cứu, thiết kế, cài đặt một công cụ hỗ trợ việc mô hình hóa trong giai đoạnphân tích và thiết kế phần mềm dựa trên nền tảng web với công nghệ điện toànđám mây

1.2 LỊCH SỬ GIẢI QUYẾT VẤN ĐỀ

Trước đây, những công cụ mô hình hóa mạnh chủ yếu trên nền tảngWindow như Powerdesigner của Sybase hay Rational Rose của IBM Đây điều làcác công cụ phổ biến, mạnh mẽ nhưng đa số là ứng dụng desktop và phụ thuộcvào nền tảng, giá thành tương đối cao Và khi chúng ta đã quen sử dụng chúngnhưng chúng ta lại phải thay đổi nền tảng sử dụng ví dụ như từ window sangUbuntu hay một thiết bị di động như máy tính bảng thì rất khó để có một ứng dụngtương tự Chúng ta phải tích lũy kinh nghiệm từ đầu khi sử dụng công cụ mới hoàntoàn với chúng ta và chưa chắc chúng hỗ trợ tốt hơn công cụ trước đây Và mộtđiều nữa là đôi khi dự án của chúng ta kéo dài 1 năm và việc sử dụng công cụ chỉ

ở tháng đầu tiên nhưng các công cụ trên buộc chúng ta phải mua bản quyền cho

cả năm thì thật lãng phí Đối với việc cộng tác cũng có một số khó khăn, khi

Trang 5

chúng ta cần chia sẻ mô hình với ai đó và vấn đề là việc chia sẻ, cập nhật trao đổi

mô hình cần thường xuyên, liên tục thì thường theo truyền thống chúng ta phảigặp nhau nhưng các công cụ online thường hỗ trợ chúng ta làm việc đó tốt hơn.Các mô hình sẽ được lưu trữ online và đồng bộ hóa với các client khi cần thiết.Hiện nay, theo nhóm nghiên cứu khảo sát, có một số công cụ cho phép vẽ onlinenhư: Paint của Google, lucidchart.com … nhưng các công cụ chủ yếu chuyên về

vẽ sơ đồ chưa có các chức năng hỗ trợ cho phép chuyển đổi giữa sơ đồ hay tựđộng sinh mã nguồn từ sơ đồ Chưa phải là một công cụ chuyên biệt hỗ trợ cholĩnh vực thiết kế phần mềm

Trong đề tài này, sẽ tập trung nghiêu cứu xây dựng một công cụ hỗ trợ thiết

kế cơ sở dữ liệu trên nền tảng web Cụ thể nhóm nghiên cứu sẽ phải:

 Nghiên cứu các thao tác thiết kế cơ sở dữ liệu, bao gồm mô hình CDM, PDM

và quy tắc chuyển đổi từ CDM sang PDM

 Nghiên cứu khả năng đồ họa trên nền tảng web của những trình duyệt, thiết kếgiải thuật đồ họa để xây dựng các công cụ cho phép người dùng vẽ các môhình

 Dựa trên các nguyên tắc chuyển đổi đã nghiên cứu, thiết kế và cài đặt giải thuậtchuyển đổi từ mô hình CDM sang PDM, PDM sang mã nguồn Sql trong Mysql5.0

 Nghiên cứu tìm giải pháp lưu trữ mô hình, cho phép người dùng lưu trữ môhình và mở ra để chỉnh sửa khi cần

 Nghiên cứu triển khai ứng dụng trên nền tảng điện toán đám mây Google AppEngine của Google

1.3 PHẠM VI CỦA ĐỀ TÀI

Trong đề tài này sẽ trình bày quá trình xây dựng ứng dụng thiết kế mô hình

cơ sở dữ liệu trực tuyến Chương trình hỗ trợ người dùng vẽ mô hình dữ liệu ngữcảnh và mô hình dữ liệu vật lý, cho phép chuyển từ mô hình dữ liệu ngữ cảnh sang

mô hình dữ liệu vật lý, chuyển từ mô hình dữ liệu vật lý sang mã nguồn SQLtương thích với Mysql5.0 Các vấn đề đặt ra là đồ họa trên web, khả năng tươngtác linh hoạt với người dùng, lưu trữ sơ đồ, cài đặt giải thuật đồ họa, khả năng lưutrữ mô hình, cài đặt giải thuật chuyển đổi giữa các mô hình, khả năng tương thíchvới nhiều trình duyệt và tốc độ xử lý

Về vấn đề đồ họa và khả năng tương tác linh hoạt, vì chương trình cho phép

Trang 6

thước của thực thể Đây đều là các nhược điểm lớn của ứng dụng web trước đây

mà phải nhờ sự hỗ trợ của flash hay applet Nhưng trong ứng dụng không sử dụngflash và applet chúng ta sẽ tìm giải pháp khác cho vấn đề này

Vấn đề tính tương thích cũng là một trong những vấn đề mấu chốt trongviệc xây dựng ứng dụng web Đặc biệt đối với ứng dụng này, để đồ họa được trên

IE chúng ta dùng ngôn ngữ Vector Graphiscs Markup nhưng các trình duyệt khácnhư Chrome, Firefox sử dụng ngôn ngữ Scalable Vector Graphics

Giải pháp cho các vấn đề trên sẽ lần lượt được đề xuất và chi tiết hơntrong các phần sau Sản phẩm cuối cùng của đề tài là một chương trình demo cócác chức năng trên

1.4 PHƯƠNG PHÁP NGHIÊN CỨU VÀ GIẢI QUYẾT VẤN ĐỀ

Trong quá trình nghiên cứu, tìm kiếm các giải pháp đồ họa trên web, nhómquyết định chọn GWT Framework và gói thư viện SmartGwt Đây là framework

mã nguồn mở ngôn ngữ java hỗ trợ lập trình phía client Framework hỗ trợ mạnhcho việc tương thích với nhiều trình duyệt và khả năng tương tác Chúng ta sẽ thảoluận nhiều hơn framework trong chương cơ sở lý thuyết Ngôn ngữ xml là ngônngữ thích hợp để lưu trữ mô hình Nhóm chọn xml vì trong framework có phần hỗtrợ đọc và viết tài liệu xml, sẽ giúp cho việc lập trình tiện lợi hơn

Ngoài ra các công nghệ được lựa chọn cũng tương thích với đám mâyGoogle App Engine của Google Đám mây này hỗ trợ công nghệ java, nên dự ánchuyển khai lên đám mây cũng có thể dễ dàng chỉnh sửa lại để chạy trên đám mâykhác

Kế hoạch làm việc của nhóm như sau:

Trang 7

Thời gian Công việc

3/1/2012 đến 3/2/2012 Tìm kiếm nghiên cứu thử nghiệm các giải pháp cho đồ

họa trên web như: thư viện JavaScript Closure library, framework Railto, SVG Editor, framework GWT, thư viện Smartgwt

3/2/2012 đến 10/2/2012 Thiết kế cấu trúc file xml cho sơ đồ CDM, và PDM

10/2/2012 đến 20/2/2010 Xây dựng khung chương trình

20/2/2012 đến 2/4/2012 Nghiên cứu thiết kế giải thuật đồ họa cho các thực thể,

các mối quan hệ, xử lý các sự kiện bao gồm:

 Giải các phương trình toán học tìm ra công thức tổng quát hỗ trợ đồ họa các mô hình

 Cài đặt các giải thuật đồ họa

 Xây dựng các gói đồ họa CDM

2/4/2012 đến 9/4/2012 Xây dựng các gói PDM

9/4/2012 đến 20/4/2012 Hoàn thành gói chuyển từ CDM sang PDM bao gồm:

 Xuất từ mô hình đồ họa CDM, PDM sang file xml

 Nhập file xml thành mô hình đồ họa CDM, PDM

 Cài đặt giải thuật chuyển tài liệu xml của CDM thành tài liệu xml PDM

20/4/2012 đến 25/4/2012 Hoàn thành gói chuyển từ PDM sang mã nguồn sql

Mysql 5.0

25/4/2012 đến 30/4/2012 Cài đặt các gói lưu trữ sơ đồ trên hệ cơ sở dữ liệu

Datastore của Google App Engine

Cài đặt cho phép người dùng đăng nhập bằng tài khoản Gmail của Google

30/4/2012 đến 5/4/2012 Hoàn thiện chương trình, tài liệu

Trang 8

Phân công công việc:

Lê Trần Phúc:

 Nghiên cứu cấu trúc câu lệnh sql Mysql 5.0

 Nghiên cứu kỹ thuật phân tích tập tin xml

 Xây dựng giải thuật chuyển đổi tập tin xml PDM sang mã nguồn sql

 Cài đặt gói chuyển từ PDM sang mã nguồn sql tương thích với Mysql 5.0

 Thiết kế các hình ảnh, tập tin css tăng tính thân thiện người dùng của ứngdụng

Đinh Hoàng Lương:

 Xây dựng khung chương trình

 Thiết kế và cài đặt các giải thuật đồ họa cho các gói CDM và PDM

 Cài đặt các chức năng xuất mô hình CDM, PDM ra tài liệu xml, nhập từ tàiliệu xml sang mô hình đồ họa

 Cài đặt giải thuật chuyển đổi từ mô hình CDM sang mô hình PDM

 Cài đặt các lớp Jdo cho phép lưu tài khoản người dùng và mô hình vàodatastore của Google App Engine

 Cài đặt chức năng cho phép người dùng đăng nhập bằng tài khoản Gmail

Trang 9

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

Chương này sẽ giới thiệu về các cơ sở lý thuyết được sử dụng trong đề tài.Phần đầu tiên được nói đến là các mô hình cơ sở dữ liệu, các lệnh sql cơ bản trong

hệ quản trị cơ sở dữ liệu Mysql 5.0, framework GWT, Google App Engine,datastore một cách lưu trữ cơ sở dữ liệu trên đám mây google và cách xác thực vàchứng thực người dùng sử dụng giao thức Oauth 2.0 để truy cập các API củagoogle Trong chương này chỉ giới thiệu tổng quan không đi sâu vào chi tiếtnhững ứng dụng vào đề tài, vấn đề này sẽ được đề cập trong chương sau

Trước hết, chúng ta sẽ nghiên cứu mô hình dữ liệu quan hệ, để thấy đượccác yêu cầu, các chức năng chính mà chương trình hỗ trợ mô hình hóa phải đạtđược Tiếp theo là phần giới thiệu tổng quan về framework GWT, Google AppEngine, đây là 2 công nghệ kết hợp với nhau khá tốt vì chúng đều là sản phẩm củaGoogle, nó cũng là công nghệ chính được ứng dụng trong chương trình Kế tiếp làphần giới thiệu về datastore, cổ máy lưu trữ của đám mây google, nó được sử dụngcho các sản phẩm, dịch vụ của google hiện nay Cuối cùng là phần cơ sở lý thuyếtcủa cách thức mà giao thức OAUTH 2.0 làm việc, để giúp ta xây dựng chức năngđăng nhập bằng tài khoản Gmail

Giờ chúng ta sẽ bắt đầu phần đầu tiên

2.1 MÔ HÌNH DỮ LIỆU QUAN NIỆM (CDM)[1]

Việc thiết kế cơ sở dữ liệu (CSDL) thường bắt đầu từ mức quan niệm Vớimức quan niệm này chúng ta không cần xem xét đến chi tiết của việc thực hiện ởmức luận lý Mô hình dữ liệu quan niệm mô tả cấu trúc luận lý của một CSDL, nóđộc lập với bất cứ phần mềm hay cấu trúc dữ liệu nào Mô hình quan niệm thườngchứa các đối tượng dữ liệu chưa được thực hiện trong CSDL ở mức luận lý Môhình này cho ta một mô tả hình thức của dữ liệu cần thiết cho việc thực thi của cáchoạt động kinh doanh, xí nghiệp hay công ty

Mô hình CDM cho phép:

 Mô tả tổ chức dữ liệu dưới dạng sơ đồ quan hệ thực thể Entity Relationship Diagram)

(ERD- Kiểm tra sự hợp lệ của việc thiết kế dữ liệu

 Sinh mô hình dữ liệu vật lý (PDM – Physical Data Model)

 Sinh mô hình hướng đối tượng (OOM – Oriented Model)

Trang 10

2.1.1 Các đối tượng của mô hình dữ liệu quan niệm

Các đối tượng cơ bản của CDM bao gồm các kiểu thực thể (entity), quan hệ(relationship), thuộc tính (attribute), miền trị (domain), sự nhận dạng (indentifier ),

2.1.1.1 Kiểu thực thể (Entity types)

Kiểu thực thể là một đối tượng hay một khái niệm trong thế giới thực được

xác định bởi tố chức và nó tồn tại độc lập Ví dụ các đối tượng như Nhan_Vien,Khach_Hang, Hang_hoa,… hay các khái niệm trừu tượng như Mon_hoc,Loai_hang, Giao_dich,…

Thực thể là một thể hiện của một kiểu thực thể mà nó có thể xác định một

cách duy nhất Ví dụ, một nhân viên cụ thể là một thực thể của kiểu thực thểNhan_vien, nhân viên này có thể xác định duy nhất thông qua mã số nhân viên củaanh ta

Chúng ta có thể phân loại các kiểu thực thể thành hai loại: kiểu thực thể yếu

và kiểu thực thể mạnh

Kiểu thực thể yếu (weak entity types): là kiểu thực thể tồn tại phụ thuộc

vào một kiểu thực thể khác (Kiểu thực thể yếu có thể chứa thuộc tính hay khôngchứa thuộc tính, cũng như có thể có khóa chính hay không có khóa chính)

Kiểu thực thể mạnh (strong entity types): là kiểu thực thể mà sự tồn tại

của nó không phụ thuộc vào kiểu thực thể nào khác

2.1.1.2 Các kiểu quan hệ (Relationship Types)

Một kiểu quan hệ xác định mối quan hệ giữa hai kiểu thực thể Các kiểuquan hệ có thể có:

 One

to one:

 One

to many:

Trang 11

Mỗi thực thể Entity_1 được kết hợp với một hay nhiều thực thể Entity_2và mỗi thực thể Entity_2 được kết hợp một hay

Trang 12

nhiều thực thể Entity_1.

Đôi khi một kiểu thực thể lại quan hệ với chính nó với ý nghĩa kết hợp giữa hai kiểu thực thể khác nhau…

Mỗi thực thể Entity_2 được kết hợp một hay nhiều thực thể Entity_1 Mỗi thực thể Entity_1 chỉ kết hợp với một thực thể Entity_2 Đặc biệt, khi chuyển sang cơ sở

dữ liệu thì khóa của thực thể Entity_2 sẽ tham gia vừa là khóa ngoại vừa là thành phần khóa chỉnh của bảng Entity_1

2.1.1.3 Thuộc tính (Attributes)

Mỗi thuộc tính sẽ mô tả một tính chất của một kiểu thực thể

Ví dụ: Kiểu thực thể Nhân viên được mô tả bởi các thuộc tính như mã nhânviên, họ tên, ngày sinh và giới tính

Miền giá trị của thuộc tính (Attribute domain) là một tập hợp các giá trị

có thể gán được cho một thuộc tính

Các thuộc tính có thể được chia thành các loại: Thuộc tính đơn hay phúchợp, đơn trị hay đa trị, và cũng có thể là thuộc tính dẫn xuất

Thuộc tính đơn (Simple attribute): là một thuộc tính tạo thành bởi nhiều

thành phần tồn tại độc lập Ví dụ các thuộc tính đơn: mã nhân viên, giới tính

Thuộc tính phức hợp (Composite attribute): là một thuộc itnhs tạo thành

bởi nhiều thành phần tồn tại độc lập

Ví dụ: thuộc tính “địa chỉ” của thực thể Nhân viên có thể có 3 giá trị (MỹTrung, Cái Bè, Tiền Giang) có thể được chia nhỏ thành Xã (Mỹ Trung), Huyện(Cái Bè), Tỉnh (Tiền Giang)

Thuộc tính đơn trị (Single-valued attribute): là một thuộc tính chỉ chứa

một giá trị cho mỗi thực thể Ví dụ như thuộc tính Mã nhân viên của thực thểNhân viên là đơn trị vì mỗi nhân viên chỉ có một mã nhân viên

Trang 13

Thuộc tính dẫn xuất (Derived attribute): là thuộc tính có giá trị dẫn xuất

từ giá trị của một thuộc tính hoặc một tập thuộc tính có liên quan, không cần thiếtphải nằm trong cùng thực thể Ví dụ: thuộc tính Age (tuổi) là thuộc tính dẫn xuất

ra từ thuộc tính ngày sinh

Thuộc tính khóa

Khóa ứng viên (candidate key): là một thuộc tính hay một tập hợp các

thuộc tính có thể xác định duy nhất một thực thể của một kiểu thực thể

Khóa chính (primary key): là một khóa ứng viên được chợn làm khóa

chính

2.1.1.4 Tổng quát hóa/Chuyên biệt hóa:

Lớp cha (supperclass): là một kiểu thực thể bao gồm các lớp con phân biệt

cần phải thể hiện trong mô hình

Lớp con (subclass): là một kiểu thực thể có vai trò phân biệt và cũng là

một thành viên của lớp cha

Ví dụ: Nhân viên/ Giám đốc có mối quan hệ lớp cha/lớp con

Tất cả các thuộc tính của lớp cha sẽ được thừa kế cho lớp con

Chuyên biệt hóa (specialization): là quá trình cực đại hóa sự khác biệt

giữa các thành viên của một kiểu thực thể bằng cách xác định các tính chất khácbiệt giữa chúng

Tổng quát hóa (generalization): là quá trình cực tiểu hóa sự khác biệt

giữa kiểu thực thể bằng cách xác định các đặc điểm chung

2.1.2 Các bước xây dựng mô hình dữ liệu quan niệm

Bước 1 Xác định các kiểu thực thể

Bước 2 Xác định các kiểu quan hệ và biển số

Bước 3 Xác định các thuộc tính và miền trị (domain) của nó

Bước 4 Xác định các khóa ứng viên và khóa chính

Bước 5 Tổng quát hóa/Chuyên biệt hóa các kiểu thực thể (bước tùy chọn)Bước 6 Vẽ sơ đồ Quan hệ-Thực thể tổng quát (ERD)

Bước 7 Cùng với người dùng kiểm tra lại ERD

Trang 14

2.1.3 Chuyển từ mô hình dữ liệu quan niệm sang mô hình vật

Qui tắc 2: Quan hệ Many – to – Many sẽ sinh ra bảng mới

Các quan hệ Many – to – Many sẽ sinh ra một bảng tương ứng với tên bảng

là tên của quan hệ tương ứng

Khóa chính của bảng mới sinh ra gồm các thuộc tính khóa chính của 2 thựcthể tương ứng với quan hệ đó

Các tham chiếu cũng được sinh ra tương ứng:

Qui tắc 3: Quan hệ One – to – Many sẽ trở thành một tham chiếu

Một quan hệ One - to – Many sẽ trở thành một tham chiếu “bảng con đếnbảng cha” Đây là một tham chiếu từ bảng con (bảng ứng với thực thể bên nhiều)đến bảng cha (bảng ứng với thực thể bên 1) và các thuộc tính khóa chính của thựcthể cha sẽ trở thành khóa ngoại của bảng con

Ví dụ:

Ch

uyển

Trang 15

Diễn giải: Bảng BANG2 ứng với thực thể BANG2 (bên 1)có khóa chính làthuộc tính B2_ID Bảng BANG1 ứng với thực thể BANG1 (bên nhiều) có khóachính là thuộc tính B1_ID và khóa ngoại là thuộc tính B2_ID.

Nếu một quan hệ One – to – Many dạng phụ thuộc hàm thì các thuộc tínhkhóa chính của thực thể bên 1 không những trở thành khóa ngoại của bảng con màcon tham gia vào thành phần khóa chính của bảng con

Ví dụ:

Diễn giải: ứng với một quan hệ One – to – Many dạng phụ thuộc hàm, bảngBANG2 ứng với thực thể BANG2 (bên 1) có khóa chính là thuộc tính B2_ID.Bảng BANG1 ứng với thực thể BANG1 (bên nhiều) có khóa chính sẽ là 2 thuộctính B1_ID và B2_ID, đồng thời thuộc tính B2_ID cũng là khóa ngoại của bảngBANG1

Qui tắc 4: Đưa các quan hệ One – to – One về dạng One – to – Many và ápdụng qui tắc 3

Đối với các quan hệ nhị phân 1 – to – 1 giữa thực thể A và thực thể B, taphải xác định thực thể nào là thực thể cha (có thể xem như thực thể bên 1) và thựcthể nào là thực thể con (có thể xem như thực thể bên nhiều), sau đó ta áp dụng quitắc 3 Việc chọn thực thể nào là thực thể cha và thực thể con sẽ tùy thuộc vào cácràng buộc cụ thể trong mối quan hệ giữa chúng Thực thể mà chỉ có một thànhphần các thể hiện của nó tham gia vào quan hệ được gọi là thực thể cha Thực thể

mà toàn bộ các thể hiện của nó có tham gia vào quan hệ được gọi là thực thể con

Qui tắc 5: Chuyển các quan hệ chuyên biệt hóa/Tổng quát hóa sang PDMCh

uyển

Trang 16

Có 2 cách cơ bản để chuyển một quan hệ dạng chuyên biệt hóa/Tổng quáthóa sang PDM như sau:

Cách 1: Gom tất cả thuộc tính ở tất cả thực thể con (hay thực thể chuyên

biệt hóa) tương ứng về làm thuộc tính bổ sung cho bảng ứng với thực thể cha (haythực thể tổng quát hóa)

Cách 2: Mỗi thực thể con sẽ chuyển thành một bảng tương ứng với thuộc

tính gồm tất cả thuộc tính của thực thể cha và tất cả thuộc tính của thực thể con.Thực thể cha sẽ biến mất trong trường hợp này

2.1.4 Mysql

MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới vàđược các nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng VìMySQL là cơ sở dữ liệu tốc độ cao, ổn định và dễ sử dụng, có tính khả chuyển,hoạt động trên nhiều hệ điều hành cung cấp một hệ thống lớn các hàm tiện ích rấtmạnh.Với tốc độ và tính bảo mật cao, MySQL rất thích hợp cho các ứng dụng cótruy cập CSDL trên internet MySQL miễn phí hoàn toàn cho nên chúng ta có thểtải về MySQL từ trang chủ Nó có nhiều phiên bản cho các hệ điều hành khácnhau: phiên bản Win32 cho các hệ điều hành dòng Windows, Linux, Mac OS

X, Unix, FreeBSD, NetBSD, Novell NetWare, SGI Irix, Solaris, SunOS,

MySQL là một trong những ví dụ rất cơ bản về Hệ Quản trị Cơ sở dữ liệuquan hệ sử dụng Ngôn ngữ truy vấn có cấu trúc (SQL)

MySQL được sử dụng cho việc bổ trợ PHP, Perl, và nhiều ngôn ngữ khác,

nó làm nơi lưu trữ những thông tin trên các trang web viết bằng PHP hay Perl,

Các lệnh cơ bản trong Mysql:

Trang 17

{ LIKE old_tbl_name | (LIKE old_tbl_name) }

| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]

[index_name] [index_type] (index_col_name, )

[index_type]

| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name, )

[index_type]

| [CONSTRAINT [symbol]] FOREIGN KEY

[index_name] (index_col_name, ) reference_definition

| CHECK (expr)

column_definition:

data_type [NOT NULL | NULL] [DEFAULT default_value]

[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]

[COMMENT 'string'] [reference_definition]

data_type:

BIT[(length)]

| TINYINT[(length)] [UNSIGNED] [ZEROFILL]

| SMALLINT[(length)] [UNSIGNED] [ZEROFILL]

| MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]

| INT[(length)] [UNSIGNED] [ZEROFILL]

| INTEGER[(length)] [UNSIGNED] [ZEROFILL]

| BIGINT[(length)] [UNSIGNED] [ZEROFILL]

| REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]

| DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]

| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]

| DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]

| NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]

Trang 18

[CHARACTER SET charset_name] [COLLATE collation_name]

| ENUM(value1,value2,value3, )

[CHARACTER SET charset_name] [COLLATE collation_name]

| SET(value1,value2,value3, )

[CHARACTER SET charset_name] [COLLATE collation_name]

REFERENCES tbl_name (index_col_name, )

[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]

[ON DELETE reference_option]

[ON UPDATE reference_option]

Trang 19

| COMMENT [=] 'string'

| CONNECTION [=] 'connect_string'

| DATA DIRECTORY [=] 'absolute path to directory'

| DELAY_KEY_WRITE [=] {0 | 1}

| INDEX DIRECTORY [=] 'absolute path to directory'

| INSERT_METHOD [=] { NO | FIRST | LAST }

| ADD [COLUMN] col_name column_definition

[FIRST | AFTER col_name ]

| ADD [COLUMN] (col_name column_definition, )

| ADD {INDEX|KEY} [index_name]

[index_type] (index_col_name, ) [index_type]

| ADD [CONSTRAINT [symbol]] PRIMARY KEY

[index_type] (index_col_name, ) [index_type]

| ADD [CONSTRAINT [symbol]]

UNIQUE [INDEX|KEY] [index_name]

[index_type] (index_col_name, ) [index_type]

| ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [index_name]

(index_col_name, ) [index_type]

| ADD [CONSTRAINT [symbol]]

FOREIGN KEY [index_name] (index_col_name, )

reference_definition

| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

| CHANGE [COLUMN] old_col_name new_col_name column_definition

[FIRST|AFTER col_name]

| MODIFY [COLUMN] col_name column_definition

[FIRST | AFTER col_name]

Trang 20

| DROP PRIMARY KEY

| DROP {INDEX|KEY} index_name

| DROP FOREIGN KEY fk_symbol

| DISABLE KEYS

| ENABLE KEYS

| RENAME [TO] new_tbl_name

| ORDER BY col_name [, col_name]

| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]

ta viết ứng dụng phía trình duyệt của chúng ta bằng ngôn ngữ java thay vìjavascript Đối với những nhà lập trình java, thì đây là một tác phẩm đồ sộ vượtqua cách lập trình javascript truyền thống Điều đó có nghĩa , ngoài việc thuận lợithay thế ngôn ngữ javascript bằng java thì chúng ta cũng có thể sử dụng các công

cụ phát triển java mà đã có sẵn như Eclipse, Junit, Netbean… Thay vì phải cố

Trang 21

gắng xây dựng những công cụ mới để phát triển ứng dụng phía trình duyệt bằngJavaScript Google thực sự đã làm nên sự biến đổi to lớn.

Sự cần thiết để viết mã nguồn java thay cho javascript là do nhu cầu cácứng dụng web ngày càng tăng kích cở và độ phức tạp Những ứng dụng lớn màkhó có thể quản lý được, và java được thiết kế để làm những ứng dụng lớn đó.Khi

mà mang tất cả những thuận lợi của java đến ứng dụng web thì GWT cũng vẫncho phép chúng ta tương tác với javascript khi cần thiết Khi chúng ta bắt đầu vớiGWT điều đó không có nghĩa chúng ta phải bỏ hết tất cả mã nguồn javascript cũcủa chúng ta, GWT cố gắng để không chỉ cho phép chúng ta tương tác với mãnguồn javascript đã tồn tại của chúng ta mà còn với những dịch vụ phía server đãtồn tại của chúng ta

Phần cốt lõi của GWT là trình biên dịch java-to-javascript tương thích vớiInternet Explorer, Firefox, Mozilla, Safari, and Opera.Trình biên dịch chuyển cáccấu trúc của java sang javascript, cho phép chúng ta sử dụng các lớp trong gói utilnhư Vector, Hashmap, Vector Và trình biên dịch kết nối chúng lại thành cácwidget thường dùng như Scriptaculous, JSCalendar, và TinyMCE

GWT cũng bao gồm nhiều widget và panel để giúp cho việc xây dựng mộtứng dụng web mà giống như một ứng dụng desktop Thư viện widget bao gồm:text boxes, drop-down menus, và những form fields khác Thêm vào nữa nó baogồm những widget phức tạp như menu bar, tree control, dialog box, tab panel,stack panel …

Về vấn đề giao tiếp với server, GWT hỗ trợ nhiều công cụ cho nhiều trườnghợp Công cụ đầu tiên là cách tương tác bằng đối tượng javascriptXMLHttpRequest, một đối tượng đồng hành với việc giao tiếp bất đồng bộ bằngajax Một công cụ khác được cung cấp bởi GWT là tập hợp những lớp thao táctrên định dạng tin nhắn json, một định dạng được biết đến với tính đơn giản vàthông dụng.Đặc biệt GWT còn cho phép gửi một đối tượng java về server màkhông cần một định dạng tin nhắn nào trung gian

GWT còn cho phép chúng ta giao tiếp với bất kỳ dịch vụ phía server viếtbằng ngôn ngữ nào (ví dụ php, java, python) Ngoài ra nó còn có thể tích hợp vớicác framework java khác như Java-Server Faces (JSF), Spring, Struts, andEnterprise JavaBeans Tính mềm dễ này của GWT cho phép chúng ta tiếp tục sửdụng các công cụ phía server mà chúng ta đang sử dụng

Nhưng để tạo một ứng dụng đậm chất web bằng java thì bao nhiêu chưađủ.Hướng tới mục tiêu cuối cùng, GWT còn hỗ trợ framework Test Junit và trình

Trang 22

duyệt ở chế độ đã host đặc biệt để chúng ta phát triển và debug ứng dụng java màkhông cần triển khai đến một ứng dụng java.

Đây là những lợi ích mà GWT mang lại, cũng là nguyên nhân mà nhómchọn GWT Trong mục tiếp theo sẽ giới thiệu các chức năng trong frameworkGWT và so sánh nó với các kỹ thuật khác đang sử dụng hiện nay Cuối cùng làmột ví dụ để giúp ai chưa làm quen với GWT tạo được một dự án GWT

2.2.2 Các chức năng cơ bản trong GWT

GWT cung cấp tập hợp những công cụ tập trung giải quyết vấn đề xây dựngnhững ứng dụng web như là ứng dụng desktop bao gồm một tập hợp nhiều widget

và nhiều công cụ khác Hộp công cụ của GWT cung cấp một XML parser, nhữngcông cụ khác nhau giao tiếp với server, quốc tế hóa ứng dụng và những công cụcấu hình , và một hệ thống quản lý lịch sử trình duyệt Trong hình 1.1 chúng ta sẽthấy tổng quan về GWT, những công cụ được thể hiện ở dạng các thư viện javatạo thành GWT API

2.2.1.1 Thảo luận về trình biên dịch Java thành JavaScript

Để hiểu rõ GWT cung cấp gì thì chúng ta sẽ tìm hiểu cái mà định nghĩa ra

nó đó là: trình biên dịch Trình biên dịch GWT thì làm nhiệm vụ chuyển mã nguồnjava thành javascript, cũng tương tự như trình biên dịch java chuyển mã nguồnjava thành bytecode Để biên dịch một chương trình GWT chạy chương trình javacom.google.gwt.dev.GWTCompiler, truyền vào cho nó vị trí module và một sốtham số khác Một module bao gồm một tập hơp các lớp các file java có liên quan

Trang 23

cùng với một file cấu hình đơn giản Đặc trưng của một module là một lớp entrypoint, đó là một lớp mà thực thi khi dự án bắt đầu

Trình biên dịch bắt đầu biên dịch lớp entry point cùng với những yêu cầukèm theo để biên dịch mã nguồn java Trình biên dịch GWT làm việc khác vớitrình biên dịch tiêu chuẩn của java bởi gì nó không biên dịch mọi thứ trongmodule mà chỉ biên dịch những gì được sử dụng trong lớp entry point

Trình biên dịch có ba cách để xuất ra mã nguồn javascript Cách mặt định là

“xáo trộn”(obfuscate) làm cho mã nguồn javascript rất khó đọc, không có khoảngcách giữa các câu lệnh, trông giống như một đoạn đã bị mã hóa gần như không thểđọc được Cách này giúp chống lại các kẻ trộm mã nguồn và làm cho kích thướcfile javascript nhỏ hơn rất nhiều Nó hữu ích cho các ứng dụng lớn.đây là một vídụ:

function b(){return this.c + '@' + this.d();}

Cách thứ 2 là “xinh đẹp” (pretty), cách này tạo ra mã nguồn có thể đọcđược.Nó lại giữ mã nguồn java gốc và cách 1 “xáo trộn” Như phương thức_toString() dưới đây chúng ta có thể đọc được nội dung nhưng chúng ta không biếtđược phương thức này viết cho lớp nào

Một khía cạnh quan trọng khác nữa là trình biên dịch GWT không biên dịch

mã nhị phân java mà biên dịch trực tiếp từ mã nguồn java Nên khi chúng ta xây

Trang 24

dựng những thư viện dưới dạng file jar, nó phải bao gồm cả mã nguồn java và mãnhị phân java

Một chức năng cuối cùng đáng chú ý là khi mã nguồn java được biên dịchđến javascript thì trình biên dịch tạo ra ít nhất bốn đến năm file javascript để tươngthích với nhiều trình duyệt như Internet Explorer, Firefox, Mozilla, Opera, vàSafari Đầu tiên trình duyệt sẽ chạy đoạn script bootrap để xác định đúng trìnhduyệt và load đúng file yêu cầu, giúp giảm băng thông khi load ứng dụng

Theo sơ đồ tiếp theo ta sẽ qua chức năng tương tác giữa ngôn ngữ java vớijavascript với JavaScript Native Interface(JSNI)

2.2.2.2 Sử dụng JSNI thực thi mã javascript từ java

Cho dù chúng ta viết mã nguồn java thay cho javascript, nhưng thỉnhthoảng chúng ta cũng muốn viết mã nguồn javascript trực tiếp Có nhiều nguyênnhân để chúng ta muốn làm điều này, nhiều khi chúng ta muốn gọi một số api ởphía trình duyệt mà GWT không có hỗ trợ Một trường hợp thông thường khác làchúng ta muốn sử dụng một tập thư viện javascript mà đặc biệt thì chúng ta có thể

sử dụng chức năng này

JSNI giúp chúng ta thực thi mã nguồn javascript từ java cũng như thực thi

mã nguồn java từ javascript Điều này có thể thực thi bởi trình biên dịch GWT,chúng sẽ kết hợp mà javascript mà chúng ta nhúng vào với mã nguồn javascript

mà được tạo ra từ java Đây là một ví dụ đơn giản về nó:

public native int addTwoNumbers (int x, int y)

đó Có thể chúng ta chưa thấy điều này trước đây, đây là cách mà cỗ máy javađược xây dựng để từ mã nguồn java chúng ta có thể gọi các thư viện đã biên dịchđược viết bằng ngôn ngữ C hoặc C++

Khi chúng ta xem đoạn mã trên chúng ta sẽ thấy đoạn code bên trongphương thức được chứa trong ký hiệu chú thích nhiều dòng Bên trong chú thích

Trang 25

này là mã nguồn javascript chúng ta nhúng vào Khi phương thức này thực thi thìđoạn mã này được thi Điều này làm thỏa mãn yêu cầu không cho phép cài đặt nộidung cho phương thức native nhưng nó đã cung cấp được đoạn Javascript mà trìnhbiên dịch GWT dùng để thực thi khi gọi phương thức này.

Ví dụ dưới đây truyền một danh sách đối tượng java và sử dụng javascript

Tiếp theo chúng ta sẽ nói về JRE emulation nhưng trong hình 1.1 Đây làmột sự tham chiếu giữa các lớp java trong java runtime environment đến các lớptương tự trong javascript

2.2.2.3 Truy cập đến thư viện JRE emulation

Vấn đề đặt ra là, chúng ta có thể sử dụng các lớp trong gói jre vào trong dự

án không, trình biên dịch GWT có hiểu và biên dịch được chúng thành javascriptkhông hay chỉ sử dụng trong vùng bộ API mà GWT cung cấp Câu trả lời là cónhưng có giới hạn chỉ một vài lớp trong gói java.lang và java.util.bảng 1.1 và bảng1.2 sẽ chỉ cho chúng ta các lớp mà được sử dụng trong ứng dụng gwt của chúng ta.Hãy xem cẩn thận có một số chi tiết quan trọng chúng ta có thể bỏ qua ví dụ nhưjava.util.Date thì được hỗ trợ nhưng java.util.Calendar bất kỳ công cụ định dạngngày tháng nào khác thì không

Trang 26

Tiếp theo chúng ta sẽ đi chi tiết vào các gói thư viện mà trình biên dịchGWT hỗ trợ

2.2.2.4 Hiểu về những thư viện và những widget của GWT

Trang 27

GWT có một lượng lớn các widget và những panel.Sự khác biệt giữawidget và panel là widget có thể là những nút, textbox … cho người dùng tươngtác còn những panel là những cái thùng chứa chúng.Hình 1.2 là một ví dụ nhỏ vềviệc sử dụng các widget và panel

Menubar là widget được dùng trong đỉnh của trang.Tabpanel là một paneltương tác được sử dụng ở giữa trang hoạt động như một thùng chứa một textareawidget và một button widget.Tabpanel và Menubar đều được chứa trong mộtthùng chứa là AbsolutePanel mà cho phép đặt chính xác vị trí mong muốn

Nếu chúng ta đã quen với việc sử dụng thư viện Swing trong java chúng ta

đã biết cách sử dụng bộ phận quản lý layout để tổ chức các thành phần trong mộtpanel Nhưng điều này thì khó khăn với việc kết hợp với các phần tử html NênGWT đã chọn cách tiếp cận khác, thay vào bộ phận quản lý các layout GWT cungcấp tập hợp những panel để hiển thị các con của nó theo một cách đặc biệt nào đó

Ví dụ: HorizonePanel hiển thị các con của nó từ trái qua phải, FlowPanel hiển thịcác con theo nguyên tắc dòng chảy bình thường HTML và AbsolutePanel chophép đặt một widget tại vị trí chính xác mà mình muốn

Những widget được cung cấp bởi GWT sẽ tương ứng với một thành phầntrong HTML Ví dụ như: Button, TextBox, TextArea, Checkbox, RadioButton,and FormPanel Thêm vào đó có 2 kiểu hiển thị thông tin giống bảng trong html,

nó là 2 lớp con của HTMLTable là Grid và FlexTable

Trang 28

GWT cũng cung cấp những thành phần mà trước đây chỉ có trong ứng dụngdesktop Như TabPanel để chúng ta đặt những widget trong những tab khác nhau,

và mỗi lần chỉ hiện thị tab được chọn MenuBar giúp tạo một menu nhiều cấp dễdàng sử dụng Sau đó là có PopupPanel, StackPanel…

Cho dù GWT cung cấp hơn 30 widget và panel nhưng đôi khi chúng ta lạikhông tìm gặp cái mà chúng ta cần Để bù đắp thì có nhiều dự án mã nguồn mởđược phát triển để làm tăng số lượng widget và panel cho chúng ta sử dụng trong

dự án của mình Danh sách đó bao gồm calendars, sortable tables, calculators,drawing panel, tooltrip… Cũng có nhiều widget sẵn dùng trong thư viện javascriptnhư Google maps api, Google Search API, Scriptaculous Graphics Thêm vào đó

là những widget dự trên HTML, như Scalar Vector Graphics (SVG), một ngônngữ đánh dấu văn bản để tạo các ứng dụng đồ họa vector

Khi chúng ta tạo các widget của chính chúng ta, chúng ta thường phải sửdụng tới javascript và rất may mắn GWT có hỗ trợ điều đó

Phần tiếp theo, chúng ta sẽ thảo luận về một phần khác của API GWT.GWT cung cấp nhiều công cụ cho việc quốc tế hóa và cấu hình, cho phép chúng tatạo ra ứng dụng với giao diện trong nhiều ngôn ngữ khác nhau

2.2.2.5 Về công cụ cấu hình và quốc tế hóa của GWT

GWT cung cấp nhiều kỹ thuật khác nhau để giải quyết vấn đề cấu hình vàquốc tế hóa ứng dụng Thoạt nhìn thì có vẻ 2 vấn đề này khác biệt nhau, nhưngchúng giống nhau vì chúng ta sẽ lưu các chuỗi ký tự hoặc các số theo vùng địa lýtrong một file cấu hình và hiển thị chúng theo đúng vùng địa lý cần thiết

Trong tài liệu này không đi sâu vấn đề này Chúng ta có thể xem trong tàiliệu tham khảo “Manning Gwt in action”

2.2.2.6 Gọi những thủ tục từ xa với GWT

Hầu hết những ứng dụng GWT đều cần khả năng trao đổi thông tin giữaclient và server Ví dụ chúng ta muốn lấy dữ liệu hiển thị cho người dùng xemhoặc người dùng đăng nhập đến ứng dụng, hoặc để tải dữ liệu từ bên ngoài.Những trình duyệt ngày nay có một đối tượng JavaScript đặc biệt được gọi làXMLHttpRequest cho phép kết nối giữa trình duyệt và server mà không cần làmới trang giống như các trang HTML forms truyền thống Đối tượng JavaScriptđặc biệt này là nền tảng để tạo ra kỹ thuật Remote Procedure Calls (RPCs) dựatrên nền tảng của trình duyệt

Trang 29

GWT cung cấp hai công cụ hàng đầu của đối tượng XMLHttpRequest Đầutiên là lớp RequestBuilder, lớp này là gói bao ngoài của đối tượng này, mặc dù nó

là một phần nhỏ ít được sử dụng như Java thông thường Công cụ thứ hai là RPC, nó thì phức tạp hơn và cho phép chúng ta gửi và nhận những đối tượng Javathực sự giữa client và server

GWT-Tạo PRC requests với RequestBuilder

Lớp RequestBuilder cho phép chúng ta tạo một yêu cầu gửi tới server, nócho phép chúng ta có thể gửi yêu cầu và cung cấp cách để truy cập tới kết quả trả

về từ server

Đây là một đoạn ví dụ mẫu của việc gọi thủ tục từ xa sử dụngRequestBuilder

String url = "/service/search";

RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, url); (1) try {

Request request = rb.sendRequest("term=GWT+in+Action", (2) new RequestCallback() {

public void onResponseReceived (Request req, Response res) { (3) // process here

}

public void onError (Request req, Throwable exception) {

// handle error here

và mật khẩu cho URL tìm được mà những yêu cầu này cần xác định chứng thực

Kế tiếp chúng gửi một yêu cầu tới server bằng cách gọi phương thứcsendRequest()(2) dựa trên đối tượng RequestBuilder đã tạo Phương thức này trả

về một xử lý tới yêu cầu, mà xử lý này có kiểu Request Trong quá trình yêu cầu,chúng ta có thể sử dụng nội dung trả về của Request để kiểm tra trạng thái của mộtyêu cầu hoặc hủy bỏ nó Phương thức sendRequest() có hai đối số: một chuỗi đểgửi tới server một yêu cầu, một RequestCallback để xử lý kết quả trả về và bất cứ

Trang 30

lỗi nào xảy ra Một anomymous class (3) cài đặt từ RequestCallback, về bản chất

là một Inline class trong ví dụ ngắn Nhưng nếu điều khiển trả về chứa nhiều hơnmột vài dòng lệnh, thì ta nên tạo ra một lớp riêng

Chúng ta sử dụng một lớp điều khiển để điều khiển kết quả trả về bởi vìRPC gọi từ trình duyệt một cách không đồng bộ tạm thời giới hạn của khôngđồng bộ trong ngữ cảnh này là phương thức sendRequest() không trả về ngay lậptức, không đợi server phản hồi, đặt vào server yều cầu và sự thực thi lệnhJavaScript tiếp theo

Một thuộc tính đáng chú ý khác là yêu cầu để gọi bằng RequestBuilder làvăn bản Văn bản này có thể là một tập tin XML, HTML code, một text đơn giản,hoặc JSON code

JSON là một thông điệp đơn giản định dạng cho cấu trúc dữ liệu gửi đi, và

nó là dạng đặc biệt được sử dụng trong trình duyệt một ví dụ đơn giản:

JSONObject obj = new JSONObject();

obj.put("title", new JSONString("GWT in Action"));

obj.put("author", new JSONString("Hanson and Tacy"));

obj.put("pages", new JSONNumber(600));

String serializedObj = obj.toString();

Đoạn code này tạo ra một đối tượng JSONOnject và chứa trong nó vàithuộc tính, giống như cách dùng một Java HashMap Việc gọi phương thứctoString() trả về một dạng có thứ tự của đối tượng như một chuỗi văn bản Bước

kế tiếp, không hiển thị, sẽ sử dụng lớp RequestBuilder để gửi dữ liệu có thứ tự nàyđến server để xử lý

Giao tiếp với GWT-RPC

Cơ chế GWT-RPC cho phép chúng ta gửi những đối tượng Java giữa client

và server chỉ cần tăng thêm một ít công việc ở cả phía client và server

Đầu tiên chúng ta cần một dịch vụ chung được cài đặt bởi server Ví dụnếu chúng ta muốn một dịch vụ tạo mật khẩu, nó có thể giống như sau:

public interface PasswordService extends RemoteService {

Boolean changePassword (String user,

String oldPass, String newPass);

}

Giao diện định nghĩa một phương thức để thay đổi mật khẩu người dùng.Yêu cầu duy nhất là giao diện này phải extend giao diện RemoteService đượccung cấp bởi GWT Kế đến là việc cài đặt ở server

Trang 31

public class PasswordServiceImpl

extends RemoteServiceServlet

implements PasswordService {

public Boolean changePassword (String user,

String old, String new) {

// add code here

}

}

Việc cài đặt cài đặt giao diện chúng ta định nghĩa cho dịch vụ của chúng ta

và extends RemoteServiceServlet RemoteServiceServlet là nơi mà xảy ra các biếnđổi Servlet này nhận được dữ liệu từ máy chủ cái mà chúng ta đã đề cập phải làvăn bản do đối tượng XMLHttpRequest cơ bản tạo ra, serializas các dữ liệu vănbản thành các đối tượng Java Đối tượng Java sau đó được truyền qua phương thứcchangePassword() để xử lý Trên đường trả về, RemoteServiceServlet xếp thứ tựgiá trị trả về được chuyển sang kiểu văn bản, mà những văn bản này sau đó đượcgửi lại cho trình duyệt

Cho đến nay, như vậy tốt Chúng ta tạo một giao diện dịch vụ và việc mãhóa thực hiện trên server một cách cụ thể Việc mã hóa được gọi ở máy khách mộtcách dễ dàng:

Ở đây chúng ta gọi phương thức changePassword(), trong lời gọi chúng ta

đã bao gồm việc bổ sung một bộ xử lý AsyncCallback

2.2.2.7 Nghiên cứu công cụ xử lý XML của GWT

Trong 5 năm qua, XML đã trở thành một phần của cuộc sống hàng ngàycủa chúng ta cũng như các nhà phát triển ứng dụng Cấu hình máy chủ của Javacủa chúng ta sử dụng một định dạng XML, RSS nguồn cấp dữ liệu tiêu thụ vàcung cấp XML, và thường là các giao thức để chúng ta sử dụng để giao tiếp vớicác dịch vụ từ xa, như trong trường hợp của SOAP và XML-RPC Để làm cho nóđơn giản như có thể để giải quyết các định dạng dữ liệu trên trình duyệt của kháchhàng, GWT cung cấp Document Object Model (DOM) dựa trên phân tích cú pháp

Trang 32

XML Trình phân tích cú pháp XML dựa trên DOM sử dụng XML và tạo ra mộtđối tượng cây Sau đó chúng ta có thể sử dụng API DOM đi qua cây và đọc nộidung của nó.

GWT có lợi thế thực sự mà các trình duyệt hiện đại có khả năng phân tích

cú pháp XML và tạo một cây DOM Bởi vì việc phân tích cú pháp được thực hiệnbởi trình duyệt và không bằng GWT, chúng ta sẽ có được hiệu quả của việc thựcthi mã nguồn gốc Đoạn code mẫu này cho chúng ta thấy làm thế nào XMLParserđược sử dụng để tạo ra một đối tượng Document, thông qua toàn bộ các cây DOM

có thể được đi qua:

Document doc = XMLParser.parse(responseText);

Element root = doc.getDocumentElement();

NodeList children = root.getChildNodes();

for (int i = 0; i < children.getLength(); i++) {

doSomethingWithNode(children.item(i));

}

Từ đối tượng Document, chúng ta có thể lấy phần tử gốc, và trong một tàiliệu XML có thể chỉ có một phần tử gốc Từ phần tử gốc, chúng ta có thể lập quacác con, và các con của con chúng, và cứ như vậy cho đến hết tài liệu Việc thựchiện GWT DOM dựa trên tiêu chuẩn được cung cấp bởi World Wide WebConsortium (W3C), những người cùng tiêu chuẩn HTML

mà người dùng mong đợi

Các giải pháp phổ biến cho vấn đề này có một chút phức tạp để thực hiện

và sử dụng Nó yêu cầu thêm vào một frame ẩn cho trang của chúng ta và thựchiện nhiều kịch bản để có thể làm việc được Trong trường hợp của GWT, tất cảcác công việc khó khăn này đã được làm cho chúng ta Để truy cập vào nó, chúng

ta cần viết một hàm xử lý sự kiện implements HistoryListener interface và đăng ký

Trang 33

nó với các đối tượng History Ở đây chúng ta cần đăng ký thể hiện của một lớpngười dùng định nghĩa MyHistoryListener:

History.addHistoryListener(new MyHistoryListener());

Với việc lắng nghe đăng ký, chúng ta có thể mô phỏng một sự thay dổicủa trang bằng cách tạo ra một mã thông báo lịch sử mới Mã thông báo là một từkhóa xác định sự thay đổi của nội dung Ví dụ chúng ta có thể tạo ra một thẻ tổngquan cho các trang với thông tin về công ty của chúng ta và một thẻ báo cáo chocác trang khác hiển thị thông tin báo cáo

Lưu ý rằng khi chúng ta nói trang, không có nghĩa là trình duyệt đang tảicác URL khác nhau Đây là GWT, do đó một trang có thể là nội dung được nạpbằng cách chọn một tab trên TabPanel hoặc chọn một tùy chọn từ MenuBar:

History.newItem("overview");

History.newItem("reports");

Việc tạo thẻ mới thực hiện hai việc Đầu tiên nó tải một cách vô hình mộtframe ẩn trên trang web với một trang mới Bởi vì frame ẩn này được nạp với mộttrang khác nên trình duyệt tính trang này như một trang mới và thêm nó vào lịch

sử trình duyệt Sau đó, nó gọi phương thức onHistoryChanged() củaHistoryListener để chỉ ra một sự thay đổi nội dung:

public class MyHistoryListener implements HistoryListener {

public void onHistoryChanged (String historyToken) {

2.2.2.9 Giới thiệu về việc kiểm thử đơn vị trong GWT

Nó luôn là một cách tốt nhất để thực hành viết các bài test tự động cho mãlệnh, và những frameworks khác nhau đã làm sẵn trong những năm qua để làm

Trang 34

cho quá trình kiểm thử dễ dàng hơn JUnit là công cụ phổ biến nhất về dạng nàyđược sử dụng bởi các nhà phát triển Java, và nó được tích hợp với nhiều IDEs.Thay vì tạo ra một framework mới cho GWT từ đầu, GWT cung cấp hỗ trợ choJunit để chúng ta không cần kiểm thử bằng framework khác chưa tìm hiểu.

Để tạo ra một trường hợp kiểm thử mới, chúng ta tạo một lớp extendsGWTTestCase, lần lượt mở rộng từng lớp TesCase riêng của Junit Sau đó chúng

ta cần yêu cầu một phương thức getModuleName(), tiếp theo là số lượng kiểm thử

cụ thể bất kỳ GWT sử dụng tên các Module để xác định vị trí các tập tin cấu hình

Ngoài cách kiểm tra thông thường, GWTTestCase cũng cho phép chúng takiểm tra RPC gọi đến máy chủ GWT bắt đầu với phiên bản riêng của Tomcat;thực hiện biên dịch mã GWT của chúng ta; và kiểm tra khi code phía client gọiứng dụng phía server, nó đạt được kết quả mong đợi Trong thời gian ngắn nó làmđiều chúng ta không thể làm mà không có người nào đó ngồi trước trình duyệt củachúng ta để kiểm tra cho ứng dụng của chúng ta Không có lỗi nếu kiếm tra bằngngười dùng thực sự, nhưng có thể có nếu chúng ta có một bộ lớn các test case màchúng ta muốn kiểm tra và hơn thế nữa, nó không thực tế để làm điều này bằngtay

2.3 GOOGLE APP ENGINE VÀ DATASTORE[4]

2.3.1 Google App Engine

Google App Engine (GAE) là một nền tảng và là SDK để phát triển và lưutrữ các ứng dụng web bằng cách sử dụng máy chủ và cơ sở hạ tầng của Google

Trang 35

Phiên bản mới nhất của tại thời điểm viết tài liệu này là 1.6.5 App Engine hỗ trợ

cả Java và Python thực thi trong các môi trường và SDKs, với từng loại môitrường hỗ trợ theo tiêu chuẩn các giao thức và công nghệ cho phát triển ứng dụngweb

GAE như một nên tảng được thiết kế cho khả năng mở rộng, mạnh mẽ vàhiệu suất App Engine cho phép chúng ta xây dựng các ứng dụng được thu nhỏ vàcân bằng tải tự động tùy thuộc vào nhu cầu ứng dụng của chúng ta và nhu cầu cầntăng lưu trữ cho dữ liệu của chúng ta Với các ứng dụng App Engine chúng takhông cần phải thực hiện bất kỳ thao tác nào để bảo trì server hoặc cơ sở dữ liệucủa chúng ta, chúng ta chỉ việc tải lên và chạy ứng dụng của chúng ta Cơ sở hạtầng của Google cung cấp hiêu j suất đáng tin cậy ngay cả dưới tầng tải nặng vàkhi sử dụng một lượng rất lớn dữ liệu

Một yêu cầu đến một ứng dụng App Engine là định tuyến tới máy chủđược lựa chọn, và ứng dụng thì cần thiết phải bắt đầu trên máy chủ Không cótrạng thái nào trên máy chủ được lưu lại giữa các yêu cầu (Thay vào đó GAE cóphương pháp khác để lưu giữ các yêu cầu) Không đảm bảo rằng cùng máy chủ sẽ

xử lý yêu cầu tiếp theo, thậm chí nếu thời gian giữa chúng là rất ngắn Vì vậy, mộttrường hợp thời gian thực hiện thường đi kèm với sự tồn tại khi xử lý một yêu cầubắt đầu, và được chấm dứt khi yêu cầu chấm dứt mặc dù đôi khi có thể được giữlại, phụ thuộc vào lưu lượng mà ứng dụng truy cập

Bằng cách làm cho không có giả định thời gian thực thi sẽ được duy trì giữacác yêu cầu trên máy chủ, App Engine có thể phân phối lưu lượng yêu cầu nhưnhiều máy chủ khi cần thiết, mục tiêu của các yêu cầu tại các máy chủ mà chúng

hy vọng là sẽ cung cấp phản hồi nhanh nhất

Thật hữu ích khi xem App Engine về khía cạnh một số chức năng của nó –App Engine Datastore, các dịch vụ có khả năng mở rộng của nó, và các môitrường thực thi theo thời gian của nó

Phần sau chúng ta sẽ tìm hiểu về Datastore và các dịch vụ được cung cấpbởi nó để lưu trữ dữ liệu của chúng ta

2.3.2 Datastore

Datastore được thiết kế với khả năng mở rộng cao, các ứng dụng với dữ liệulớn có thể được linh hoạt hơn Nếu chúng ta đã từng sử dụng phần cứng hoặc phầnmềm cân bằng tải, chúng ta biết rằng người dùng của chúng ta có thể tương tác vớihàng chục trang web hoặc CSDL của các máy chủ Một yêu cầu của người sửdụng có thể không được phục vụ từ cùng máy chủ mà nó đã được xử lý trước đó

Trang 36

Những máy chủ có thể được trải ra trong những trung tâm dữ liệu khác nhau hoặc

có lẽ trong các quốc gia khác nhau, yêu cầu chúng ta thực hiện các quy trình đểgiữ cho dữ liệu của chúng ta an toàn, bảo mật, và đồng bộ Các phần cứng và phầnmềm cần thiết để mở rộng ứng dụng của chúng ta có thể phức tạp và đắt tiền, vàthậm chí có thể yêu cầu chúng ta thuê ngoài hoặc thuê các tài nguyên

Với App Engine, Google quan tâm mọi thứ cho chúng ta App Enginedatastore cung cấp dịch dụ phân phối, nhân rộng, và cân bằng tải phía sau ứngdụng, giải phóng chúng ta để chúng ta có thể tập trung vào các vấn đề kinh doanhcủa chúng ta App Engine’s datastore được cung cấp chủ yếu bởi hai dịch vụ củaGoogle: Bigtable và Google File System (GFS)

Bigtable là một dịch vụ phân tán và khả năng mở rộng để lưu trữ và quản lýcấu trúc dữ liệu Nó được thiết kế để mở rộng tới một kích thước rất lớn với

petabytes dữ liệu trên hàng ngàn cụm máy chủ Đó là dịch vụ tương tự mà Google

sử dụng cho hơn 60 dự án riêng của mình bao gồm lập chỉ mục web, GoogleFinance, và Google Earth

Kho dữ liệu cũng sử dụng GFS để lưu trữ dữ liệu và các tập tin nhật ký.GFS là một hệ thống có khả năng mở rộng hệ thống tập tin được thiết kế chịu lỗilớn, phân tán, các ứng dụng dữ liệu chuyên sâu như Gmail và Youtube Ban đầuđược phát triển để lưu trữ dữ liệu và tìm kiếm chỉ mục, GFS hiện đang được sửdụng rộng rãi để lưu trữ nội dung mà người dùng tạo từ nhiều sản phẩm củaGoogle

Bigtable chứa dữ liệu như các đối tượng với các thuộc tính được sắp trật tựbằng các loại ứng dụng xác định như khách hàng, bán hàng, hoặc các sản phẩm.Đối tượng cùng loại không yêu cầu phải có các thuộc tính giống nhau hoặc cùngmột giá trị cho các thuộc tính giống nhau Các truy vấn BigTable các đối tượngcủa cùng một loại và có thể sử dụng các bộ lọc và sắp xếp trên cả hai khóa và cácgiá trị thuộc tính Nó cũng đặt chỉ số tất cả các truy vấn, kết quả ấn tượng khi thựchiện ngay cả với bộ dữ liệu rất lớn Dịch vụ này cũng hỗ trợ thực hiện cập nhậtthông tin về nhóm đơn nhất hoặc các ứng dụng xác định của các đối tượng

Điều đầu tiên chúng ta sẽ nhận thấy về BigTable là nó không phải là một

cơ sở dữ liệu quan hệ Bigtable sử dụng mô hình đối tượng không mối quan hệ đểchứa các thực thể, cho phép chúng ta tạo các ứng dụng đơn giản, nhanh chóng, và

có khả năng mở rộng Google không phải là nơi duy nhất cung cấp loại hình kiếntrúc này Amazon SimpleDB và nhiều kho dữ liệu mã nguồn mở (ví dụ, CouchDB,Hypertable) cũng sử dụng cách tiếp cận này, mà không phải yêu cầu một schema

Trang 37

trong khi cung cấp tự động lập chỉ mục dữ liệu và các API đơn giản cho việc lưutrữ và truy cập.

Chúng ta có thể tương tác với Bigtable bằng cách sử dụng hoặc là một APIchuẩn hoặc là API cấp độ thấp Với API chuẩn, hoặc là một Java Data Object(JDO) hoặc Java Persistence API (JPA) để cài đặt, chúng ta có thể đảm bảo rằngcác ứng dụng của chúng ta có thể dễ dàng di chuyển tới các nhà cung cấp dịch vụlưu trữ dữ liệu khác hoặc các công nghệ cơ sở dữ liệu khác mà chúng ta muốnchuyển đến Điều này là một lý do tốt cho App Engine vì nó không ngăn chúng tatới các nhà cung cấp khác Nếu chúng ta chắc chắn rằng ứng dụng của chúng ta sẽluôn chạy trên App Engine, chúng ta có thể sử dụng các API cấp thấp vì nó chothấy khả năng đầy đủ của Bigtable Cả hai API đều đạt kết quả tương tự về khảnăng và hiệu suất, do đó nó đi ngược lại với sở thích cá nhân

Kho dữ liệu cung cấp đầy đủ CRUD (các thao tác tạo, đọc, cập nhật, vàxóa) Chúng ta thấy phần ứng dụng vào đề tài của Datastore ở chương 3

2.4 SỬ DỤNG OAUTH 2.0 ĐỂ TRUY CẬP CÁC GOOGLE API

Google APIs sử dụng giao thức OAuth 2.0cho việc chứng thực và xácthực Google hỗ trợ nhiều cách OAuth 2.0 cho nhiều ngữ cảnh khác nhau như:javascript, ứng dụng cài đặt, ứng dụng trên thiết bị, giao tiếp từ server đến server

OAuth 2.0 là một giao thức đơn giản giúp nhà phát triển tích hợp vào ứngdụng một cách dễ dàng Đầu tiên, chúng ta đăng ký ứng dụng với google, chuyểnhương trình duyệt đến một URL, phân tích response nhận mã thông báo và gửi mã

đó đến Google API mà chúng ta muốn truy cập

Trong phần này sẽ giới thiệu tổng quan về OAuth 2.0 và các link để chúng

ta tham khảo chi tiết hơn, đến chương tiếp theo sẽ mô tả một ví dụ sử dụng OAuth2.0 bằng ngôn ngữ java được sử dụng trong dự án

Trang 38

ứng dụng javascript thì không cần một mã bí mật còn ứng dụng web phía serverthì cần.

2 Lấy mã truy cập từ Google Authorization Server

Trước khi ứng dụng của chúng ta có thể truy cập đến Google API, chúng tacần một mã truy cập được gán quyền truy cập đến API đó.Một mã truy cập có thểđược gán quyền đến nhiều API Có một tham số được gọi là “scope” sẽ xác địnhnguồn tài nguyên và phương thức mà chúng ta được thực thi trong suốt quá trìnhyêu cầu truy cập được cấp phép bởi mã truy cập trên Trong một request chúng ta

có thể bao gồm nhiều “scope”

Có nhiều hướng để tạo request này, và chúng khác nhau là tùy thuộc vàoứng dụng mà chúng ta đang xây dựng Ví dụ, một ứng dụng JavaScript có thểrequest một mã truy cập bằng cách sử dụng một trình duyệt chuyển hướng đếnGoogle lần nữa, trong khi một ứng dụng cài đặt trên thiết bị không có trình duyệt

sử dụng một request của dịch dụ web

Request yêu cầu người dùng đăng nhập tới Google Sau khi đăng nhậpthành công người dùng sẽ thấy các điều khoản theo yêu cầu của ứng dụng và đượcyêu cầu và được yêu cầu nếu họ sẵn sàng cấp những quyền truy cập ứng dụng củachúng ta Tiến trình này gọi là “user consent”

Nếu người dùng cấp quyền truy cập tới ứng dụng của chúng ta, ứng dụngcủa chúng ta sẽ gửi một mã truy cập hoặc một mã ủy quyền (được sử dụng để cóđược một mã truy cập) Nếu người dùng không cấp quyền cho ứng dụng củachúng ta, Google Authorization sẽ trả về một lỗi

3 Gửi một mã truy cập tới một API

Sau khi ứng dụng có được mã truy cập, nó có thể gửi mã truy cập trong mộtrequest tới một Google API Mã truy cập chỉ có giá trị trong thiết lập của quá trìnhhiện tại và những tài nguyên được mô tả trong mã request Ví dụ nếu một mã truycập được cấp cho API Google+, nó sẽ không cấp quyền truy cập tới GoogleContacts API Tuy nhiên, nó có thể gửi tới Google+ API nhiều lần cho các hoạtđộng tương tự Thẻ truy cập được gửi đến một Google API trong phần header củaHTTP Authorization, hoặc như một tham số chuỗi truy vấn (nếu header của HTTPkhông có sẵn)

4 Làm mới mã truy cập (tùy chọn)

Mã truy cập đều có một giới hạn thời gian, trong một số trường hợp ứngdụng cần truy cập tới một Google API vượt quá thời gian giới hạn thời gian tồn tại

Trang 39

của một mã truy cập Trong trường hợp này ứng dụng của chúng ta có thể làm

được bằng refresh token Một refresh token cho phép ứng dụng của chúng ta có

ta có thể dùng dịch vụ của Google để xác nhận tài khoản người dùng, từ đó tíchhợp vào ứng dụng chúng ta

Quá trình đăng nhập bắt đầu bằng cách chuyển hướng trình duyệt (mởpopup hoặc mở trang đầy đủ nếu cần thiết), với một tập hợp các tham số của chuỗitruy vấn Google sẽ xử lý chuyến hướng nếu chúng ta đã đăng nhập lần giốngnhau, chấp nhận và xác nhận thông tin người dùng và xác nhận mật khẩu lần nữanếu tài khoản yêu cầu, được tiết lộ thông tin cá nhân cơ bản, cũng như tạo ra và trả

về một mã truy cập OAuth tới ứng dụng của chúng ta

Kết quả của chuỗi xác thực người dùng là một mã truy cập OAuth 2.0, vàsau đó chúng ta có được thông tin người dùng (tên, địa chỉ email, địa chỉ email xácnhận, hồ sơ hình ảnh) bằng cách gọi một API Google UserInfo

Trang 40

Thông tin trả về từ UserInfo có thể được sử dụng trong suốt quá trình đăng

ký và có thể cải thiện tỷ lệ thành công việc đăng ký Ngoài ra khi tài khoản và mậtkhẩu người dùng được lưu trên server google chúng ta sẽ không cần phải lo về vấn

đề bảo mật tài khoản người dùng

Để biết thêm thông tin, chúng ta có thể tham khảo Login documentation

Ứng dụng web phía server

Google OAuth 2.0 Authorization Server hỗ trợ nhiều cho ứng dụng webphía server (ví dụ như Android, Window, Mac OS, iOS, Blackberry,…) Trình tựnày bắt đầu bằng cách chuyển hướng trình duyệt (mở popup hay mở trang webđầy đủ nếu cần thiết) tới một URL của Google với một tập hợp các tham số chobiết loại của Google API truy cập mà ứng dụng yêu cầu Giống như các kịch bảnkhác, Google xử lý xác thực người dùng, lựa chọn phiên sử dụng, cho phép sửdụng, nhưng kết quả của tiến trình là một mã số xác thực Sau khi nhận được mã

số xác thực, ứng dụng có thể trao đổi một mã truy cập và một refresh token

Các ứng dụng có thể truy cập vào một API của Google sau khi nhận được

mã truy cập

Ngày đăng: 23/10/2014, 07:31

HÌNH ẢNH LIÊN QUAN

Bảng BANG1 ứng với thực thể BANG1 (bên nhiều) có khóa chính sẽ là 2 thuộc  tính B1_ID và B2_ID, đồng thời thuộc tính B2_ID cũng là khóa ngoại của bảng  BANG1. - LVTN công cụ thiết kế CSDL online- tập trung nghiêu cứu xây dựng một công cụ hỗ trợ thiết kế cơ sở dữ liệu trên nền tảng web
ng BANG1 ứng với thực thể BANG1 (bên nhiều) có khóa chính sẽ là 2 thuộc tính B1_ID và B2_ID, đồng thời thuộc tính B2_ID cũng là khóa ngoại của bảng BANG1 (Trang 15)
Hình 3.1: Kiến trúc phần mềm của chương trình demo a) Phía người dùng (Client): - LVTN công cụ thiết kế CSDL online- tập trung nghiêu cứu xây dựng một công cụ hỗ trợ thiết kế cơ sở dữ liệu trên nền tảng web
Hình 3.1 Kiến trúc phần mềm của chương trình demo a) Phía người dùng (Client): (Trang 49)
Hình 3.2: Mô hình triển khai ứng dụng - LVTN công cụ thiết kế CSDL online- tập trung nghiêu cứu xây dựng một công cụ hỗ trợ thiết kế cơ sở dữ liệu trên nền tảng web
Hình 3.2 Mô hình triển khai ứng dụng (Trang 51)
Hình 3.3: Mô hình CDM và PDM tương ứng - LVTN công cụ thiết kế CSDL online- tập trung nghiêu cứu xây dựng một công cụ hỗ trợ thiết kế cơ sở dữ liệu trên nền tảng web
Hình 3.3 Mô hình CDM và PDM tương ứng (Trang 52)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w