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 1M 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 23.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 4CHƯƠ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 5chú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 6thướ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 7Thờ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 8Phâ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 9CHƯƠ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 102.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 11Mỗ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 12nhiề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 13Thuộ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 142.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 15Diễ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 16Có 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 21gắ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 22duyệ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 23cù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 24dự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 25nà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 26Tiế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 27GWT 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 28GWT 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 29GWT 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 30lỗ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 31public 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 32XML 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 33nó 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 34cho 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 35Phiê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 36Nhữ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 37trong 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 39củ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 40Thô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