Cùng với quá trình chạy đua trong việc nâng cấp hệ điều hành OS từ các nhà cung cấp cũng như sự phát triển của HTML5, thì các ứng dụng chạy trên nền web web app đang dần thu hẹp khoảng c
Trang 1LỜI CÁM ƠN
Trước tiên, em xin dành những lời cảm ơn chân thành tới các thầy cô giáo Đại học Bách Khoa Hà Nội, đặc biệt là các thầy cô Viện Công Nghệ Thông Tin và Truyền Thông, Viện đào tạo sau đại học đã hết sức tận tình giảng dạy, hướng dẫn em trong suốt năm học vừa qua, từng bước xây dựng, vun đắp những kiến thức em tích lũy được ngày nay
Đặc biệt em xin được dành những lời cảm ơn sâu sắc nhất tới thầy giáo TS.Nguyễn Thanh Hùng – giảng viên bộ môn Công Nghệ Phần Mềm, là người đã trực tiếp hướng dẫn em hoàn thành luận văn này Trong suốt quá trình nghiên cứu, thầy đã rất tận tình chỉ dẫn, định hướng, giúp đỡ, động viên em để hoàn thành khóa luận Với
tư cách là một người thầy, một người đồng nghiệp, một bậc đàn anh đi trước, qua thời gian được làm việc với thầy em đã được truyền đạt những kinh nghiệm quý báu về sự nghiệp giảng dạy, sự nghiệp trồng người Những kinh nghiệm học được từ thầy chắc chắn sẽ là những hành trang quan trọng cho em trong con đường nghiên cứu, giảng dạy và làm việc sau này
Xin được cám ơn các em phòng kỹ thuật công ty cổ phần đầu tư và phát triển KoolSoft đã chia sẻ và giúp đỡ chị hoàn thành khóa luận này
Cuối cùng em xin được gửi lời cảm ơn tới Bố mẹ thân yêu, chồng con, gia đình,
bè bạn và người thân đã là nguồn động viên, giúp đỡ em trong quá trình thực hiện khóa luận Cảm ơn tập thể lớp 13BCNTT1 luôn luôn đoàn kết, giúp đỡ lẫn nhau, tạo ra một môi trường tốt nhất để hoàn thành khóa học này
Hà Nội, Tháng 4 năm 2015 Chân thành cám ơn!
Trang 2MỤC LỤC
LỜI CÁM ƠN 1
PHẦN MỞ ĐẦU 5
Giải pháp 6
Cơ sở lý luận và thực tiễn của đề tài 5
Giải pháp 6
Tìm hiểu về Frame work đa nền tảng Google Web Toolkit và Phone Gap 6
Lý do chọn Google Web Toolkit và Phone Gap 6
Nội dung luận văn 6
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT VÀ CÁC CÔNG NGHỆ SỬ DỤNG 8
1.1 Google Web Toolkit (GWT) 8
1.1.1 Google Web Toolkit là gì? 8
1.1.2 Tại sao chọn GWT xây dựng ứng dụng 8
1.1.3 Những hạn chế của GWT 111
1.1.4 Các thành phần cơ bản của GWT? 122 GWT Compiler: 12
Thư viện JRE Emulation 13
Thư viện UI 166 Giao thức RPC 16
- GWT RPC là gì? 17
- Các thành phần Java của cơ chế GWT RPC: 17
- Sơ đồ luồng hoạt động một giao tiếp GWT RPC : 18
1.1.5 Cấu trúc của một GWT application 211 HTML Host page 21
Thư mục src 22
Thư mục war 23
1.2 Google App Engine (GAE) 23
1.2.1 Lưu trữ dữ liệu trong App Engine 24
Trang 3Lưu trữ dữ liệu trong Java 25
- App Engine Datastore 26
- So sánh App Engine Datastore với các cở dữ liệu truyền thống 27
1.2.2 Objectify 27
- Cài đặt objectify trong project 28
- Định nghĩa và đăng ký các Entity 29
- Các thao tác cơ bản 311 1.3 PhoneGap 333 1.3.1 Tổng quan về PhoneGap 333 Tại sao sử dụng Phonegap 344
Kiến trúc của ứng dụng phonegap 355 1.3.2 Nguyên tắc hoạt động và mô hình của PhoneGap 36
1.3.3 Các Phonegap API 38
Cách lấy thông tin từ thiết bị di động 38
Kiểm tra mạng kết nối thiết bị 40
1.3.4 So sánh Phonegap với framework khác như Titanium Mobile, Adobe AIR 41
So sánh framework Phonegap với Titanium mobile 41
So sánh framework Phonegap với Adobe AIR 44
1.3.5 GWT-Phonegap một wrapper 45
CHƯƠNG 2: MÔ HÌNH XÂY DỰNG ỨNG DỤNG 48
2.1 Mô hình sử dụng trong ứng dụng – Mô hình MVP (MVP Activity and Place) 48
2.1.1 MVP là gì? 48
2.1.2 Activity and Place 51
Place 51
Activity 55 CHƯƠNG 3: PHÂN TÍCH VÀ THIẾT KẾ 5959
3.1 Phân tích yêu cầu hệ thống thi trắc nghiệm trực tuyến 5959
3.1.1 Mô tả hệ thống 5959
Trang 43.1.2 Đặc tả chức năng 61
3.1.3 Biểu đồ User Case 68
3.1.4 Sơ đồ hoạt động 6969 3.2 Thiết kế lớp 700 3.2.1 Thiết kế các lớp model cơ sở dữ liệu 700 3.2.2 Biểu đồ thiết kế lớp: View và presenter(Activity and Place) 75
CHƯƠNG 4: CÀI ĐẶT 78
4.1 Cài đặt frammework 78
4.1.1 Các yêu cầu cài đặt 78
Môi trường cài đặt framework GWT 78
Môi trường cài đặt framework Phonegap 7979
Các phương thức cài đặt 7979 4.2 Cài đặt ứng dụng và kết quả 82
4.2.1 Đăng ký ứng dụng với facebook 82
4.2.2 Ứng dụng trên android 84
Tạo ra code cordova project cho từng hệ điều hành di động 84
Thêm các plugin cho Clicker cordova project 84
Tạo GWT-Phonegap project cho hệ điều hành android 855 4.2.3 Ứng dụng trên web 86
4.2.4 Một số hình ảnh kết quả chạy ứng dụng 8787
KẾT LUẬN 911 TÀI LIỆU THAM KHẢO 9494
DANH MỤC CÁC KÝ HIỆU CHỮ VIẾT TẮT 9595
DANH MỤC CÁC BẢNG 9696
DANH MỤC CÁC HÌNH VẼ 9797
Trang 5PHẦN MỞ ĐẦU
Cơ sở lý luận và thực tiễn của đề tài
Hiện nay một số khó khăn gặp phải đã và đang được giải quyết trong kiểm tra đánh giá chất lượng giáo dục là khó khăn trong đánh giá kết quả học tập một cách trung thực khách quan, tiết kiệm thời gian chấm bài và trả bài, giảm gánh nặng cho cả giảng viên và học viên đồng thời có thể thanh lọc, sửa chữa, bổ sung ngân hàng đề thi câu hỏi một cách nhanh chóng dễ dàng Chính vì vậy trắc nghiệm khách quan đang là một giải pháp hữu hiệu Bộ Giáo dục và Đào tạo (BGD&ĐT) chủ trương từng bước đưa trắc nghiệm khách quan vào áp dụng trong các kỳ thi quốc gia và từng bước áp dụng rộng rãi để đánh giá kết quả học tập tại các bậc học Hiện nay trên thế giới thi trắc nghiệm là một hình thức phổ biến nhờ vào ưu điểm luôn có sự rõ ràng trong đáp án, tính khách quan trong cách đánh giá người học, nhanh chóng trong khâu chấm bài và trả kết quả, hiệu quả trong tổ chức thi Ở Việt Nam hiện nay, trắc nghiệm khách quan
đã được đưa vào các kỳ thi tốt nghiệp trung học phổ thông và tuyển sinh đại học theo yêu cầu của BGD&ĐT và đồng thời đang được các trường đại học, cao đẳng tích cực đẩy mạnh áp dụng đưa vào đánh giá kết quả thi học phần các môn học
Ứng dụng công nghệ thông tin trong dạy và học là một trong những xu thế phát triển nhằm nâng cao chất lượng giáo dục và đào tạo, góp phần đổi mới phương pháp dạy và học cũng như quản lý trong các trường học Chỉ thị số 55/2008/CT-BGDĐT ngày 30/9/2008 về tăng cường giảng dạy, đào tạo và ứng dụng công nghệ thông tin trong nghành giáo dục giai đoạn 2008-2012 đã chỉ rõ việc đẩy mạnh xây dựng trên website các cơ sở dữ liệu và thư viện học liệu điện tử ( bao gồm cả đề thi trắc nghiệm) Chính vì thế, luận văn đã lựa chọn công nghệ và tìm hiểu về framework phát triển ứng dụng đa nền tảng như Google Web Toolkit (GWT) và PhoneGap để xây dựng ứng dụng thi trắc nghiệm trực tuyến Cùng với tính ngày càng gia tăng của thị trường di động đặc biệt là SmartPhone với nhiều hệ điều hành khác nhau và sự phát triển của
Trang 6máy tính điện tử sử dụng nhiều hệ điều hành khác nhau là tiền đề cơ sở để tạo điều kiện thúc đẩy lượng cầu về sản phẩm ứng dụng của luận văn này
Mục đích của hệ thống: Là áp dụng công nghệ vào hỗ trợ giảng dạy trong các trường học Hệ thống xây dựng cho phép bất cứ học viên nào với chiếc máy tính (cả laptop và desktop) hay thậm chí ngay cả với chiếc di động nhỏ gọn smartphone có thể đăng nhập vào hệ thống đều có thể nhận và gửi trả lời các câu hỏi trắc nghiệm khách quan từ giáo viên và hệ thống sẽ tự chấm bài trực tuyến
Phạm vi của hệ thống: Áp dụng trong các kỳ thi trắc nghiệm khách quan cho các bậc đào tạo
Giải pháp
Tìm hiểu về Framework đa nền tảng Google Web Toolkit và Phone Gap
Hiện nay có rất nhiều sự lựa chọn về mặt công nghệ lập trình, framework để phát triển ứng dụng Qua khảo sát bài toán yêu cầu thực tế, Luận văn đã xây dựng một ứng dụng dựa trên web sử dụng framework đa nền tảng là GWT và Phonegap
GWT được google phát hành phiên bản đầu tiên vào ngày 16/5/2006 được công
bố tại hội nghị JavaOne đến nay đã trải qua nhiều phiên bản (phiên bản mới nhất là v.2.7.0 ngày 20/11/2014) và có chỗ đứng trên thị trường khi mà xu thế xây dựng web application ngày càng phát triển
Đồng thời với sự phát triển của thị trường di động smartphone ngày càng gia tăng thì PhoneGap là một framework dành cho xây dựng ứng dụng trên các thiết bị điện thoại di động (hybrid application) PhoneGap được phát triển bởi Nitobi được Adobe mua lại năm 2011, tuy công nghệ mới xuất hiện vài năm lại đây nhưng nó đã khẳng
định được chỗ đứng trên thị trường framework xây dựng ứng dụng dành cho di động
Lý do chọn Google Web Toolkit và Phone Gap
Trang 7Từ nắm bắt nhu cầu thực tế thị trường của việc gia tăng sử dụng các loại thiết bị điện tử khác nhau vào phục vụ học tập, sự phát triển ngày càng nâng cao về chất lượng phục vụ internet Cùng với đó là mục tiêu hướng đến luận văn không chỉ dừng lại ở áp dụng cho các kỳ thi trắc nghiệm mà tham vọng mở rộng áp dụng cho nhiều lĩnh vực hoạt động như: trợ giảng trong các buổi học tại lớp hoặc tích hợp vào lĩnh vực E_learning đã dẫn đến quyết định xây dựng ứng dụng web application trên đa nền tảng Luận văn đã quyết định lựa chọn framework đa nền tảng GWT và PhoneGap vào xây dựng ứng dụng của mình Ưu điểm và nhược điểm của các framework nêu trên sẽ được người viết đề cập sâu hơn ở chương 2 Cơ sở lý thuyết và các công nghệ sử dụng
Nội dung luận văn
Luận văn được chia làm 4 chương
Phần mở đầu: Trong phần này nêu rõ thực tiễn vấn đề khó khăn đang gặp phải và kết quả luận văn có thể làm được là xây dựng một ứng dụng để hỗ trợ giải quyết khó khăn này
Chương 1: Công nghệ sử dụng Trong phần này đi sâu vào phân tích các công nghệ được lựa chọn để áp dụng giải quyết vấn đề đưa ra trên
Chương 2: Mô hình xây dựng ứng dụng Trong phần này đưa ra mô hình MVP để xây dựng ứng dụng Đồng thời phân tích framework hỗ trợ cài đặt mô hình MVP của GWT là Activity và Place
Chương 3: Phân tích và thiết kế Trong phần này sẽ giới thiệu về các tính năng mà
hệ thống có thể làm được Đồng thời đi vào phân tích cách thiết kế ứng dụng và cài đặt
Chương 4: Cài đặt Trong chương này đi vào phân tích cách cài đặt ứng dụng trên web và điện thoại di động hệ điều hành Android
Kết luận và hướng phát triển
Trang 8CHƯƠNG 1: CƠ SỞ LÝ THUYẾT VÀ CÁC CÔNG NGHỆ
SỬ DỤNG
1.1 Google Web Toolkit (GWT)
1.1.1 Google Web Toolkit là gì?
GWT là tập hợp các công cụ (tool), các thư viện và các plugin GWT lần đầu tiên được đưa ra như một dự án mã nguồn mở của Google năm 2006 Nó được xây dựng
như một nền tảng ổn định cho các ứng dụng dựa trên web (của Google) mà phải chạy
trên hầu hết các trình duyệt
Điều cốt lỗi, GWT là một trình biên dịch đặc biệt có thể chuyển đổi từ Java sang Javascript với thời gian chạy rất nhỏ Nó cho bạn viết hầu hết ở dạng mã chuẩn Java, sau đó biên dịch sang JavaScript để chạy trên trình duyệt web hoặc môi trường khác như HTML Chỉ biên dịch một lần, code được tạo ra chạy trên hầu hết các trình duyệt web của người dùng như JavaScript không yêu cầu Applet Thời gian chạy của GWT bao gồm thời gian chay tối thiểu của tập Java API chuẩn như là List và String Những tập Java API chuẩn được thực hiện trong JavaScript bởi vậy code của bạn có thể gọi chúng ngay cả khi đã chuyển đổi Bạn có thể xem danh sách đầy đủ các API Java mô phỏng tại http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.html
GWT không chỉ đơn thuần là trình biên dịch Nó là tập hợp các bước biên dịch được thiết kế rõ ràng và các thư viện runtime xử lý sự khác biệt giữa các trình duyệt Trình biên dịch có thể tạo đầu ra khác biệt cho mỗi trình duyệt Nó biết cách tối ưu hóa tham chiếu đối tượng, đưa ra ưu điểm của thủ thuật ngôn ngữ Javascript, giảm thiểu sử dụng bộ nhớ
1.1.2 Tại sao chọn GWT xây dựng ứng dụng
Trang 9Trong mục này chúng ta sẽ đi giải quyết các câu hỏi và bố cục tổng thể cách tiếp cận GWT Tìm hiểu tại sao GWT được tạo ra, nó được ứng dụng ở đâu và tại sao nó lại quan trọng khi xây dựng (quản lý) phát triển một phần mềm.
Tại sao phải code ứng dụng web với GWT? Tại sao không chỉ dừng lại với JavaScript? Ưu điểm của GWT là gì? Tại sao khuyên bạn nên dùng GWT
- GWT là một công cụ cho phép bạn phát triển code phía client với Java, và phiên dịch code của bạn sang JavaScript để có thể chạy trên trình duyệt của máy client Sản phẩm cuối cùng là một ứng dụng web với hầu hết mức độ tương tác của ứng dụng desktop, cho phép chạy trên máy khách với yêu cầu tối thiểu code hoặc tương tác phía server Biên dịch sang JavaScript tăng thêm tốc độ của code được tối ưu hóa tốt tương
đương hoặc tốt hơn so với code được viết tay bởi người lập trình Quan trọng nhất là bạn không phải lo lắng với các trình duyệt khác nhau bởi vì GWT tạo ra code tương thích với từng trình duyệt cụ thể
- Tại sao lại là ứng dụng dựa trên web?
Ngày nay, với sự phát triển không ngừng của thế hệ Web 2.0, việc xây dựng 1
ứng dụng chạy trên nền web, gọi tắt là RIA (Rich Internet Application) đã trở nên khá
phổ biến Ứng dụng nền web (Web App) là khái niệm xuất hiện trên thế giới từ lâu với những tên gọi quen thuộc và nổi tiếng như: Apps FaceBook, Google Apps, Microsoft Apps, Hiện nay, ở Việt nam, sự phát triển của các ứng dụng trên nền web cũng là một trong những điểm sáng đáng chú ý trong lĩnh vực công nghệ thông tin
Việc xây dựng ứng dụng trên nền web có khá nhiều lợi thế so với ứng dụng desktop thông thường Trong khi 1 ứng dụng desktop thông thường sẽ phải tốn nhiều chi phí cho việc cài đặt, bảo trì, nâng cấp trên từng máy tính thì ứng dụng trên web có thể chạy bất cứ nơi đâu thông qua một trình duyệt web mà không hề phải cài đặt Tuy nhiên, những ứng dụng trên web vẫn tồn tại những hạn chế nhất định, đó là khả năng
hỗ trợ ứng dụng, các control không mạnh bằng ứng dụng desktop, tốc độ chương trình
Trang 10phụ thuộc vào server, đường truyền Cùng với quá trình chạy đua trong việc nâng cấp
hệ điều hành (OS) từ các nhà cung cấp cũng như sự phát triển của HTML5, thì các ứng dụng chạy trên nền web (web app) đang dần thu hẹp khoảng cách với ứng dụng gốc
Sự phát triển và những tiện lợi đi đầu của ngôn ngữ HTML5 (bên cạnh đó là jQuery/CSS) đã giúp cho ứng dụng web có thể làm được những điều mà ứng dụng gốc
đã và đang có
Có thể nói khi phần cứng và hệ điều hành của smartphone được nâng cấp thì đó cũng chính là “thời” của ứng dụng web, vì hạn chế trước đây của ứng dụng web như tốc độ truy cập, giao diện người dùng không hấp dẫn đã dần được khắc phục Các nhà phát triển phần mềm đang dần chuyển sang mảnh đất được cho là khá màu mỡ này,
vì không bị giới hạn bởi hệ điều hành cụ thể, và đặc biệt phần mềm có thể được nâng cấp nhanh chóng hơn
Các phần hướng phát triển của web và các khó khăn là lý do để các công nghệ ra đời, đầu tiên là RIA và sau này có GWT Các công nghệ luôn đi kèm với nhưng ưu và nhược điểm của nó, nhưng điểm tốt đó là GWT được thiết kế theo hướng thiết kế web tier
- Các công cụ và hỗ trợ thử nghiệm:
Một trong những ưu điểm của GWT so với RIA là nó cung cấp công cụ và hỗ trợ thử nghiệm GWT bao gồm một shell debug mạnh, cho phép kiểm tra và sửa lỗi code tương tác với native browser trong hệ điều hành đang sử dụng GWT cung cấp hỗ trợ thử nghiệm dựa trên JUnit Mã code GWT được test như java từ shell Sau khi biên dịch mã sang JavaScript, cùng một thử nghiệm có thể sử dụng lại nền sâu hơn cung cấp bởi GWT Điều này cho phép bạn kiểm thử trên các trình duyệt khác nhau, thậm chí trên các hệ điều hành khác nhau và các kết hợp trình duyệt
Phương tiện kiểm thử và công cụ hỗ trợ là đích hướng tới và trọng tâm của GWT,
là chế độ tiêu chuẩn trong lập trình truyền thống nhưng không phải phổ biến cho các
Trang 11công nghệ web phía máy client Cùng với sự hỗ trợ này, GWT cung cấp rất nhiều trợ giúp cho các nhà phát triển trong các lĩnh vực khác Một trong những ưu điểm lớn nhất của GWT đưa ra là cho phép bạn giải quyết với sự khác biệt giữa các trình duyệt
- Giải quyết với sự thay đổi công nghệ:
Theo phong cách lập trình truyền thống, để phát triển web cần yêu cầu trình độ cao
để giải quyết với sự khác nhau trong cách xử lý giữa các loại trình duyệt và các phiên bản Thậm chí ngay cả khi bạn chỉ viết một ứng dụng web chuẩn sử dụng HTML và các form thì kéo theo đó bạn phải biết chi tiết, cụ thể về phiên bản nào của HTML, DOM (Document Oject Model), CSS, JavaScript và các chuẩn HTTP Người phát triển cần nhận thức ra được cách mà các lỗi và các thói quen ảnh hưởng đến mỗi trình duyệt… GWT không giải quyết các khó khăn trực tiếp đó, nhưng nó đóng gói lại và cho phép người phát triển chỉ cần quan tâm đến ứng dụng của họ mà không phải quan tâm đến sự khác nhau giữa các trình duyệt GWT cho phép bạn làm việc trên một single codebase (sử dụng Java) và sau đó biên dịch đa nền tảng mã code đó sang HTML cho phép Ajax và JavaScript cho hầu hết các loại trình duyệt chính và các phiên bản hiện thời đang sử dụng (IE, Firefox, Safari, Opera…)
1.1.3 Những hạn chế của GWT
Trước tiên, các trang web GWT có hỗ trợ nhưng rất khó khăn trong việc lập chỉ mục cho công cụ tìm kiếm Bởi vì ứng dụng được tạo ra tự động, công cụ tìm kiếm không đánh chỉ mục cho nội dung của nó Nếu mô hình doanh nghiệp của bạn phụ thuộc vào Search Engine Optimization (SEO) thì GWT có thể không phù hợp cho bạn Ngoài ra các trang GWT không giảm sự tinh xảo khi trình diện trong trình duyệt
cũ vì vậy nó có thể không chạy hoặc chạy được nhưng không có middle ground với chức năng giới hạn và phạm vi hạn chế May mắn thay trở ngại này đang mờ dần và lúc này bạn không phải lo lắng về điều này
Trang 12Về bảo mật, ứng dụng GWT cũng dễ bị tấn công như bất cứ ứng dụng JavaScript nào Sử dụng GWT không cho phép bạn bỏ qua bất cứ bảo mật nào, tuy nhiên trước khi có một số cải tiến bảo mật sắp tới bạn nên phòng ngừa như đối với các ứng dụng web phát triển với bất kỳ công cụ nào khác
Các nhà phát triển phàn nàn rằng biên dịch và phát triển GWT chậm hơn so với viết thẳng bằng JavaScript Tuy nhiên quan điểm ở đây là code với JavaScript chậm hơn và dễ bị lỗi hơn so với Java Có ít công cụ hơn cho code bằng JavaScript, ứng dụng của bạn sẽ có nhiều vấn đề về trình duyệt nếu kiểm thử với IE8 Một số quan điểm cho rằng để ứng dụng internet phong phú bạn nên trực tiếp làm việc với JavaScript vì đó là những gì lập trình viên thực sự làm và hãy quên đi sự lựa chọn thay thế Kết luận này đưa ra bởi cho rằng sự chuyển đổi từ Java sang JavaScript bị nghèo nàn bởi sự khác biệt giữa hai ngôn ngữ, và các mã code tạo ra sẽ cồng kềnh và chậm chạp Một phần sự phản đối này không có cơ sở xác đáng, phần nữa JavaScript không phải vấn đề duy nhất, việc triển khai khác nhau trên các trình duyệt đang là vấn đề lớn khác Code thực sự độc lập trên các trình duyệt khá là khó viết, và nó khó để đảm bảo yêu cầu kỷ luật của ứng dụng Kết quả là bạn phải dành nhiều thời gian hơn và viết code nhiều hơn với một kết quả tương tự chỉ với vài dòng Java
1.1.4 Các thành phần cơ bản của GWT?
GWT cung cấp một số công nghệ để xây dựng ứng dụng Ajax: GWT compiler ( java-to-JavaScript compiler), tầng UI, hệ thống RPC, hàng loạt tiện ích bổ sung giúp web tier dễ quản lý hơn, GWT shell, thư viện mô phỏng JRE…
- GWT Compiler:
Trình biên dịch GWT làm nhiệm vụ chuyển mã nguồn Java thành JavaScript, cũng tương tự như trình biên dịch Java chuyển mã nguồn Java thành bytecode Để biên dịch một chương trình GWT chạy chương trình
Trang 13javacom.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 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 entry point,
đó 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ầu kèm theo để biên dịch mã nguồn Java Trình biên dịch GWT làm việc khác với trình biên dịch tiêu chuẩn của Java bởi vì nó không biên dịch mọi thứ trong module mà chỉ biên dịch những gì được sử dụng trong lớp entry point
Thành phần quan trọng nhất của GWT là trình biên dịch Java sang JavaScript Nó đưa code Java 1.5 tạo ra các phiên bản JavaScripts tương đương khác nhau để có thể chạy trên tất cả các trình duyệt được hỗ Tuy nhiên bằng cách xác định nhiệm vụ biên dịch GWT thành các module, trình biên dịch có thể thực hiện nhiều hơn các phân tích trong code mà nó xử lý và phân nhánh thành nhiều thành phần biên dịch cho các mục tiêu đầu ra khác nhau Điều này có nghĩa khi biên dịch một lớp, bạn có thể xác định việc triển khai khác nhau dựa trên các thông số được biết đến Tính năng này khiến nhân của GWT tương thích với đa trình duyệt
Trình biên dịch có nhiệm vụ tối ưu hóa code trong suốt quá trình biên dịch với mục đích chung là đưa ra mã code tốt nhất (Tốt hơn cả cách code tay của người lập trình nhiều kinh nghiệm) Một số tối ưu hóa code được kể đến như: Loại bỏ những mã chết, nối chuỗi (Constant Folding), code inlining…
- Thư viện JRE Emulation
Trong khi nhìn chung Java có thể sử dụng thư viện đóng gói sẵn mà không cần quan tâm gì hơn, thì GWT Compiler khi làm việc nó yêu cầu phải truy cập vào mã nguồn thực tế cho bất cứ lớp nào bạn có thể dùng Yêu cầu này dẫn đến phải có JRE GWT cung cấp thực hiện một phần của nó gọi là JRE Emulation library Công việc của JRE Emulation library là cung cấp một ánh xạ của Java Runtime Environment (JRE)
Trang 14lên JavaScript Nó gồm hai phần: Phần thứ nhất giải quyết hỗ trợ ngôn ngữ Java và sự khác biệt giữa GWT Emulation và phiên bản Java thực sự Phần thứ hai giải quyết với các lớp được mô phỏng bởi GWT và có thể được sử dụng bởi các nhà lập trình
Hỗ trợ ngôn ngữ
Bạn có thể sử dụng toàn bộ ngôn ngữ Java khi phát triển ứng dụng GWT, tuy nhiên
có một vài sự khác biệt bạn cần nhận thức được để tránh các vấn đề xuất hiện trong các giai đoạn sau Sau đây là một danh sách nhưng chưa phải đầy đủ những khó khăn mà bạn có nhiều khả năng gặp phải:
Hỗ trợ kiểu long: Vì JavaScript không hỗ trợ kiểu long Bạn không thể đưa vào một kiểu long từ code Java của bạn tới các phương thức JavaScript Native Interface (JSNI) Tuy nhiên, bạn có thể an toàn sử dụng kiểu long nếu như nó được giữ lại trong context code Java của bạn GWT sẽ đảm bảo rằng nó sẽ được chuyển sang cái
gì đó làm việc được trên JavaScript
Xử lý ngoại lệ: Nhìn chung xử lý ngoại lệ làm việc như trong code Java thông thường ngoại trừ hai trường hợp đặc biệt: Thứ nhất, phương thức getStackTrace() không trả về bất cứ cái gì hữu dụng khi chạy như JavaScript Thứ hai, ngoại lệ mặc định như NullPointerException và OutOfMemoryError không bao giờ được đưa vào trong code của bạn, bạn nên tự kiểm tra giá trị null rõ ràng
Đơn luồng: Vì trình biên dịch JavaScript là đơn luồng nên ứng dụng của bạn tốt hơn nên là đơn luồng Vì tất cả các phương thức liên quan đến luồng và các từ khóa( ví dụ đồng bộ) sẽ không có hiệu lực và sẽ bị bỏ qua bởi GWT compiler
Không reflection: Bạn không thể sử dụng reflection để tải các lớp động Điều này liên quan trực tiếp đến việc GWT compiler cần biết về mỗi lớp và phương thức bạn dùng để tạo ra file JavaScript tối ưu hóa cho mỗi nền tảng Điều này có nghĩa là bạn
sẽ không được phép tải các lớp động
Trang 15Các lớp được mô phỏng
Như đã chỉ ra ở trên, chúng ta có thể sử dụng hầu hết các ngôn ngữ java khi phát triển ứng dụng GWT Nhưng không phải tất cả mọi thứ là có thể khi phát triển mã mà điều cần thiết là phải dịch sang được JavaScript và sau đó là chạy trên một môi trường trình duyệt Có bốn thư viện chuẩn của Java được hỗ trợ trong GWT là java.io (rất hạn chế), java.lang, java.sql (cũng khá hạn chế) và java.util bạn có thể thấy thiếu một số lớp và một số phương thức( điều này cũng là hợp lý: Ví dụ: Bởi vì JavaScript không thể sử dụng các file hầu như là các lớp trong java.io nó chỉ không làm việc khi biên dịch sang javaScript)
Ngoài ra còn có hai sự khác biệt nhỏ mà bạn nên nhớ khi viết code ứng dụng GWT:
Các biểu thức thông thường: Java và JavaScript có cú pháp khác nhau cho các biểu thức thông thường Mặc dù sự khác biệt khá tinh tế nhưng nó có xu hướng kết quả mạnh vì vậy hãy thận trọng khi sử dụng những biểu thức thông thường
Serialization: Java serialization phụ thuộc rất nhiều vào reflection do đó nó không
có sẵn trong GWT Tuy nhiên GWT cung cấp cơ chế để thực hiện serialization như một phần hỗ trợ RPC của nó
Các lớp tiện ích
Một số lớp cơ bản mà nhà phát triển hay sử dụng nhưng nó lại không có sẵn trong các lớp mô phỏng của GWT, vì thế GWT cung cấp các lớp tiện ích để thực hiện điều này Sau đây là một số lớp tiện ích hay được dùng khi xây dựng ứng dụng GWT thực tế:
com.google.gwt.i18n.client.DateTimeFormat: Thay thế cho lớp
java.util.DateTimeFormat trong java
com.google.gwt.i18n.client.NumberFormat: Thay thế cho lớp
java.util.NumberFormat
Trang 16 com.google.gwt.user.client.Timer: Lớp browser-safetimer có thể được dùng để bắt chước một môi trường luồng cho phép bạn tạo ra các schedule task và các hành động Nó là một phiên bản đơn giản của lớp java.util.Timer
- Thư viện UI
GWT cung cấp một tập chuẩn lớn các widget (như các button và các trường đầu vào văn bản…) và các panel Sử dụng các widget khá giống với Swing trong java Tuy nhiên không có các layout manager, và các panel hoặc CSS được dùng thay thế cho các đối tượng định vị Các widget được ánh xạ vào các đối tượng trình duyệt Style có thể được thực hiện trên cơ sở object-per-object hoặc tổng quát hơn bằng cách sử dụng CSS Một số đối tượng tổng hợp, thường dùng cho các ứng dụng máy tính để bàn, chẳng hạn như DatePicker cho đầu vào ngày, SuggestBox cho các đề xuất thời gian thực dựa trên những gì người dùng gõ vào, RichTextArea cho đầu vào văn bản… Các panel là các container cho các widget hoặc các panel khác Panel cũng thực hiện hai nhiệm vụ như layout manager Chẳng hạn như FlowPanel dùng những quy luật HTML flow chuẩn, trong khi VerticalPanel stack thì các phần tử theo hàng dọc
- Giao thức RPC
Chúng ta có thể lựa chọn một số chiến lược để thực hiện giao tiếp với server mà GWT cung cấp tùy theo từng dạng dữ liệu mà ta muốn lấy về như ba cách chính sau: Tạo ra một GWT RPC, lấy về một JSON data thông qua HTTP hay tạo ra các yêu cầu Cross-Site cho JSONP Nếu bạn sử dụng GWT RPC hoặc lấy về một JSON data
thông qua HTTP có nghĩa bạn đã sử dụng tương tác không đồng bộ Client-Server Do
vậy các cuộc gọi trên server sẽ không bị chặn trong khi chờ kết quả trả về cho client
Và các đoạn code viết sau cuộc gọi callback này sẽ được thực hiện ngay mà không cần chờ kết quả trả về
Điểm khác biệt cơ bản giữa ứng dụng GWT và ứng dụng web HTML là ứng dụng GWT không cần tìm về các trang HTML mới trong khi chạy bởi vì nó chạy như một
Trang 17ứng dụng bên trong một browser(có nghĩa là với các ứng dụng nó sẽ thay bằng chuyển các place chứ không gửi request một trang HTML mới đến server để cập nhật lại các giao diện mới) Tuy nhiên, cũng giống bất kỳ ứng dụng client/server nào, ứng dụng GWT cũng thực sự cần tìm về dữ liệu phía server khi nó chạy Cơ chế tương tác với server thông qua mạng được gọi là tạo ra một RPC Chúng ta sẽ cùng tìm hiểu trong GWT thì RPC là gì? được thực hiện như thế nào?
- GWT RPC cung cấp cơ chế tương tác không đồng bộ do vậy client không bị khóa khi đang giao tiếp với server
- Bên trong code phía client bạn sẽ sử dụng một lớp đại diện tự sinh để tạo ra các cuộc gọi tới service Ví dụ:
Đối tượng lớp đại diện tự sinh
private StockPriceServiceAsync stockPriceSvc = GWT.create( StockPriceService.class );
Các thành phần Java của cơ chế GWT RPC:
Khi cài đặt GWT RPC, bạn sẽ tập trung trên ba thành phần chính được triệu gọi trong khi gọi các phương thức từ xa chạy trên server
- Service chạy trên server (chính là phương thức mà bạn đang gọi)
- Code phía client để triệu gọi service
- Các đối tượng dữ liệu Java để chuyển đổi giữa client và server
Trang 18Hình 1.1 Sơ đồ kiến trúc GWT RPC ( http://www.gwtproject.org/doc/latest/tutorial/RPC.html ) Thứ tự để định nghĩa một interface RPC: Bạn cần viết ba thành phần
1 Định nghĩa một interface (VD: StockPriceService) cho service của bạn kế thừa từ RemoteService và liệt kê ra tất cả các phương thức RPC của bạn
2 Tạo ra một lớp (VD: StockPriceServiceImpl) kế thừa từ RemoteServiceServlet (hoặc HttpServlet) và thực thi interface bạn vừa tạo ra ở trên
3 Định nghĩa một interface không đồng bộ (VD: StockPriceServiceAsync) để service của bạn được gọi từ code phía client
Sơ đồ luồng hoạt động một giao tiếp GWT RPC :
Mô tả một workflow thông qua một ví dụ code xây dựng LoginService trong ứng dụng thi trắc nghiệm trực tuyến (Clicker)
1 Tạo ra một Service interface:
Định nghĩa một interface cho service phía client kế thừa từ RemoteService và liệt
kê ra tất cả các phương thức RPC của bạn Sử dụng chú thích @RemoteServiceRelativePath
Trang 19để liên kết service với một đường dẫn mặc định của remote servlet liên quan đến module URL cơ sở
@RemoteServiceRelativePath( "login" )
public interface LoginService extends RemoteService {
public User login(User user);
}
2 Tạo ra một lớp servlet thực thi interface ở trên trên
public class LoginServiceImpl extends BHRemoteServiceServlet implements
LoginService{
// BHRemoteServiceServlet là lớp kế thừa từ AbstractRemoteServiceServlet
private static final long serialVersionUID = 1L;
private static final Logger log =
Logger.getLogger(DataServiceImpl.class.getName());
static {
ObjectifyService.register(User.class);
}
@Override
public User login(User user) {
User oldUser = ofy().load().type(User.class).id(user.getId()).now();
if(oldUser == null) {
log.severe( "New user: " + user.getEmail());
user.setRegisterDate(new Date());
ofy().save().entities(user);
return user; // New User login
}
log.severe( "old user: " + user.getEmail());
return oldUser; // User re-login
}
}
3 Tạo một Async Service Interface
Trang 20Định nghĩa một interface không đồng bộ cho service trên phía client, có cùng tất cả các phương thức như interface Service ở trên
public interface LoginServiceAsync {
void login(User user, AsyncCallback<User> callback);
}
4 Cập nhật file web.xml để thêm khai báo servlet
Chỉnh sửa file web.xml để thêm khai báo servlet LoginServiceImpl
<servlet>
<servlet-name> loginService </servlet-name>
<servlet-class> com.bh.clicker.server.LoginServiceImpl class>
</servlet-</servlet>
<servlet-mapping>
<servlet-name> loginService </servlet-name>
<url-pattern> /clicker/login </url-pattern>
</servlet-mapping>
5 Tạo một cuộc gọi thủ tục từ xa trong code ứng dụng phía client
Tạo ra đối tượng của lớp đại diện tự sinh:
public static LoginServiceAsync loginService = GWT.create(LoginService.class);Tạo ra một handle Asyncallback để xử lý RPC callback và server sẽ trả về một đối tượng User cho phía client Khi thủ tục trên server được gọi và trả về thành công code xử lý phía client sẽ được viết trong hàm onSuccess, khi không thành công code
xử lý phía client sẽ được viết trong hàm onFailure
Clicker.loginService.login(currentUser,new AsyncCallback<User>() {
Trang 21().getId()))
ClientData.getDeviceInfo().setUserId(ClientData.getCurrentUser().getId()); ClientData.updateDeviceInfo(ClientData.getDeviceInfo());
1.1.5 Cấu trúc của một GWT application
( Dựa theo : Đồ án tốt nghiệp - Nguyễn Lan Anh – K53CNPM)
Khi một project đƣợc khởi tạo, ngoài trang chủ html, các file config nó sẽ chứa 3 thƣ mục con nhƣ sau: Thƣ mục src, thƣ mục war và thƣ mục test chứa các file mã nguồn cho Junit tests
Hình 1.2 Cấu trúc một ứng dụng GWT
Trang 22- HTML Host page
Các mô đun GWT được lưu trữ trên một máy chủ web như một tập hợp các tập tin JavaScript và các tập tin liên quan Để chạy các mô đun đó, nó phải được tải từ một trang web từ phía client Bất kỳ trang HTML nào cũng có thể chứa một ứng dụng GWT thông qua một thẻ SCRIPT Trang HTML này được gọi là một trang chủ HTML Một trang chủ HTML điển hình cho một ứng dụng được viết với GWT từ đầu có thể không bao gồm bất kỳ nội dung có thể nhìn thấy ở thẻ body.Theo cách này, chức năng GWT có thể được thêm vào như là chỉ là một phần của trang đã có, và việc thay đổi cách bố trí ứng dụng có thể được thực hiện một cách đơn giản với HTML Một trang chủ HTML không phải là nội dung tĩnh Nó cũng có thể được tạo ra bởi một servlet, hoặc một trang JSP
các thư mục con
Trang 23com.test.client Test.java Mã nguồn Java phía client dùng làm
điểm bắt đầu
com.test.client GreetingService.java Giao diện RPC service
các thư mục con
com.test.server GreetingServiceImpl.java Mã nguồn Java phía server cái mà
dùng để thực thi tính logic của dịch
Nội dung tĩnh mà người phát triển cung cấp, ví dụ như trang chủ HTML
Đầu ra GWT đã được biên dịch
Các lớp java và file jar cho mã nguồn phí server
Một file web.xml để cấu hình ứng dụng web và các servlet
1.2 Google App Engine (GAE)
Google app engine là một Platform as a service (PaaS) cho phép bạn xây dựng và chạy ứng dụng trên cơ sở hạ tầng của Google Ứng dụng app engine rất dễ xây dựng, bảo trì và mở rộng quy mô và thay đổi nhu cầu lưu trữ dữ liệu Với app engine bạn không phải bảo trì server, bạn đơn giản chỉ cần đẩy ứng dụng lên và chạy nó
Trang 24Google app engine hỗ trợ rất nhiều ngôn ngữ như Java, Python, PHP, Go Với các môi trường chạy ứng dụng đều dễ dàng triển khai (deploy) lên google app engine ngay
cả với ứng dụng dữ liệu lớn Chương trình thi trắc nghiệm trực tuyến được viết bằng ngôn ngữ Java Chúng ta sẽ tìm hiểu về cách app engine hỗ trợ ngôn ngữ Java và môi trường runtime
Google App Engine chạy ứng dụng web Java sử dụng máy ảo Java 7 trong môi trường sandbox an toàn( là môi trường search engine ảo cho website của bạn để google quản lý, có nghĩa nó sẽ không được xuất hiện trên search engine thật tức google.com ) Môi trường sandbox tách riêng các ứng dụng của bạn để đảm bảo bảo mật cho các dịch
vụ Nó chắc chắn rằng ứng dụng của bạn không có các hành động giao tiếp với hiệu năng và sử mở rộng của các ứng dụng khác (Ví dụ như một ứng dụng không thể sinh
ra nhiều thread, không thể ghi dữ liệu lên các hệ thống file nội bộ hoặc tạo ra các kết nối mạng tùy ý) App Engine triệu gọi các lớp servlet để yêu cầu xử lý và trả lời trong môi trường này Nó sử dụng Java Servlet 2.5 chuẩn cho các ứng dụng web Bạn sẽ cung cấp các lớp servlet, các JSP(JavaServer Page), các file tĩnh và các file dữ liệu cùng với file mô tả triển khai(file web.xml) và các file cấu hình khác trong một cấu trúc thư mục WAR chuẩn sau đó App Engine phục vụ các yêu cầu bằng việc triệu gọi các servlet dựa theo mô tả triển khai
1.2.1 Lưu trữ dữ liệu trong App Engine
Một số cách lưu trữ dữ liệu mà App Engine cung cấp như : Datastore, Google cloud SQL, Blobstore, Google Cloud Storage Client Library Phần tiếp theo, chúng ta
sẽ đi tìm hiểu App Engine sẽ cho phép Java sử dụng những cách lưu trữ nào và chúng
ta sẽ đi tìm hiểu giao diện lập trình ứng dụng(API) lưu trữ dữ liệu trên Java Sau đó, chúng ta sẽ đi tìm hiểu về Objectify là một API truy cập dữ liệu trên java được thiết kế đặc biệt cho App Engine Datastore, đây là cách mà chương trình thi trắc nghiệm trực
tuyến sử dụng
Trang 25Lưu trữ dữ liệu trong Java
App Engine cung cấp cho java các cách lưu trữ dữ liệu cho ứng dụng như sau: App Engine Datastore: Một kho dữ liệu đối tượng kiểu phi lược đồ với bộ nhớ đệm tự động, một công cụ truy vấn phức tạp và các giao dịch nguyên tử
Google Cloud SQL: Một cơ sở dữ liệu quan hệ SQL cho các ứng dụng App Engine dựa trên cơ sở dữ liệu quan hệ MySQL quen thuộc
Google Cloud Storage: Một dịch vụ lưu trữ cho các đối tượng và các file có kích thước lên đến hàng terabyte, có thể truy cập tới các ứng dụng App Engine thông qua thư viện máy khách Google Cloud Storage
App Engine Datastore cho phép một quota (thanh toán dựa trên số lượng đã sử dụng) miễn phí hạn định trong ngày Các tài khoản trả phí có thể thực hiện các thao tác viết, đọc, lưu trữ không giới hạn
Cloud SQL
Quan hệ Tính nhất quán mạnh Có 2 hình thức thanh toán: Theo gói, và theo
lưu lượng của người dùng
Tính nhất quán mạnh trừ khi thực hiện các thao tác danh sách như lấy về một danh sách các đối tượng hoặc các bucket
Chi phí được tính theo tháng theo khối lượng lưu trữ, dung lượng truyền, các thao tác với CSDL (được phân loại thao tác và các hàm API sử dụng đến khi thực hiện thao tác đó)
để tính phí
Bảng 1.2 So sánh các cách lưu trữ dữ liệu cho ứng dụng mà Google App Engine
cung cấp cho ngôn ngữ java
Trang 26App Engine Datastore – cách lưu trữ mà đồ án sử dụng để xây dựng chương trình:
Java Datastore SDK bao gồm việc thực thi các JDO (Java Data Object) và các interface JPA (Java Persistence API) - như là một API Datastore mức thấp Thêm vào
đó, Java SDK hỗ trợ các framework khác được thiết kế để đơn giản hóa việc sử dụng kho dữ liệu cho các nhà phát triển java bao gồm:
Objectify: Là một interface rất đơn giản và thuận tiện giúp bạn tránh được những phức tạp bởi JDO/JPA và Datastore mức thấp
Slim3: Là một framework MVC full-stack mà bạn có thể sử dụng cho một loạt các chức năng của AE, bao gồm không giới hạn các Datastore
Datastore lưu trữ các đối tượng dữ liệu trong các thực thể (entity) Mỗi entity được xác định theo các kind(các kind phân loại entity dựa theo mục đích của các truy vấn) của nó, và một khóa duy nhất để xác định nó (nằm trong kind của nó) Khóa bao gồm các thành phần sau:
- Kind của entity
- Một định danh(identifer), định danh được kết hợp với các thực thể vĩnh viễn và không thể thay đổi
- Một ancestor path định vị entity trong hệ thống phân cấp Datastore
Datastore có thể thực hiện nhiều thao tác trong một giao tác duy nhất(single transaction) Các thao tác như chèn, sửa, xóa một entity được diễn ra trong context của giao tác Để duy trì tính nhất quán của dữ liệu, giao tác phải đảm bảo tất cả các thao tác
mà nó có đều phải được thực hiện, nếu một trong số chúng bị lỗi thì không thao tác nào được thực hiện Chỉ có các ancestor query mới được phép trong một giao tác Bởi vậy
mà một truy vấn trong giao tác phải được giới hạn trong một nhóm thực thể duy nhất Mỗi giao tác có thể thuộc về một nhóm thực thể duy nhất hoặc nhiều nhất là năm nhóm thực thể khác nhau Datastore dùng optimistic concurrency để quản lý các giao tác Khi hai hay nhiều giao tác muốn thay đổi cùng entity group trong cùng một thời điểm thì
Trang 27giao tác đầu tiên sẽ chuyển giao thành công, các giao tác còn lại không chuyển giao thành công Các giao tác còn lại này có thể sẽ được thực hiện lại trên dữ liệu đã được cập nhật
So sánh App Engine Datastore với các cở dữ liệu truyền thống:
Không giống như các CSDL quan hệ truyền thống Datastore sử dụng kiến trúc phân tán để quản lý tự động các tập dữ liệu rất lớn Trong khi datastore có nhiều tính năng tương tự CSDL truyền thống, nó khác chúng ở cách mô tả mối quan hệ giữa các đối tượng dữ liệu Các entity của cùng một kind có thể có các thuộc tính khác nhau, các entity khác nhau có thể có cùng tên thuộc tính như kiểu dữ liệu khác nhau
Datastore khác với cơ sở dữ liệu quan hệ truyền thống các đặc điểm quan trọng sau: Datastore được thiết kế để mở rộng quy mô, cho phép ứng dụng duy trì hiệu năng cao khi chúng nhận được lưu lượng truy cập nhiều hơn
o Mở rộng quy mô ghi lên Datastore bằng cách tự động phân phối dữ liệu khi cần thiết
o Mở rộng quy mô đọc từ Datastore
Bởi vì tất cả các truy vấn được đáp ứng bởi các index được xây dựng trước, nên các kiểu của các truy vấn có thể thực hiện được đều có nhiều hạn chế hơn
Không giống như cơ sở dữ liệu quan hệ truyền thống, Datastore không yêu cầu các entity có cùng kind phải có cùng cố định một tập thuộc tính( tuy nhiên bạn có thể thực hiện điều này để tăng yêu cầu cho code ứng dụng của bạn)
1.2.2 Objectify
Để ứng dụng có thể cập nhật dữ liệu lên server, GAE cung cấp nhiều cách như sử dụng các API Một trong các cách mà đồ án lựa chọn để giao tiếp là sử dụng Objectify với Java
Trang 28Objectify là một API truy cập dữ liệu Java đặc biệt được thiết kế cho GAE datastore Dễ sử dụng và dễ hiểu hơn JDO hoặc JPA, quan trọng hơn là nó thuận tiện hơn so với API mức thấp Mục đích của Objectify:
Được thiết kế để những người mới chưa có kinh nghiệm có thể dễ dàng sử dụng ngay, nhưng nó cũng thể hiện đầy đủ sức mạnh của datastore
Hỗ trợ tất cả các tính năng kho dữ liệu native một cách trực quan và thân thiện với người dùng
Mô hình cấu trúc dữ liệu đa hình phức tạp
Cho phép các tính năng modul, logic giao tác như EJB
Tăng hiệu suất và giảm chi phí thông qua bộ nhớ đệm transaction-aware
Liên tục cung tồn tại với các công cụ kho dữ liệu khác: API Java mức thấp, JDO/JPA, Twig, Go, Python DB, NDB
Objectify cung cấp mức độ trừu tượng đủ cao để tạo thuận lợi cho người dùng, nhưng không đủ thấp để che đậy bản chất key/value của kho dữ liệu Nó được thiết kế theo hướng Goldilocks API
Cài đặt objectify trong project:
Để cài đặt objectify cho ứng dụng bạn phải thực hiện các yêu cầu sau:
Import objectify.jar và guava.jar vào ứng dụng
Kích hoạt ObjectifyFilter cho các yêu cầu
Kích hoạt các import tĩnh trong Eclipse
Import 2 file objectify.jar và guava.jar vào trong thư mục war/WEB-INF/lib của
ứng dụng Link download Objectify: (Phiên bản mới nhất V5.1.1)
http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.googlecode.objectify
%22
Link download guava: (Phiên bản mới nhất V18)
https://repo1.maven.org/maven2/com/google/guava/guava-gwt/
Trang 29Sau khi import xong, chọn từng file nhấn chuột phải, build path
Kích hoạt ObjectifyFilter: objectify yêu cầu một bộ lọc để xóa các context giao
tác luồng nội bộ và các thao tác không đồng bộ đang ở trạng thái chờ còn lại ở cuối của yêu cầu Để kích hoạt bộ lọc cần thêm đoạn code sau vào file web.xml trong thƣ mục WEB-INF:
<filter>
<filter-name> ObjectifyFilter </filter-name>
<filter-class> com.googlecode.objectify.ObjectifyFilter </filter-class>
Kích hoạt các import tĩnh trong Eclipse: Eclipse không tự động và import tĩnh gói
objectify.jar Vì vậy khi bạn muốn sử dụng đối tƣợng objectify cho lớp nào thì tại file java của lớp đó bạn phải import thƣ viện tĩnh của nó vào nhƣ sau:
import static com.googlecode.objectify.ObjectifyService.ofy;
Vì trong ứng dụng của bạn chỉ (nên) dùng một đối tƣợng tĩnh ofy của lớp ObjectifyService nên để tránh phải gõ ObjectifyService.ofy() lại nhiều lần trong code ứng dụng khi muốn gọi ra đối tƣợng đó bạn có thể thêm vào mục favorite nhƣ sau: Vào
Window » Preferences » Java » Editor » Content Assist » Favoritesvà thêm dòng
com.googlecode.objectify.ObjectifyService.ofy
Tuy nhiên bạn vẫn có thể thêm Objectify cho ứng dụng của bạn từ source code thay vì import các file theo cách làm trên Tham khảo theo link http://code.google.com/p/objectify-appengine/wiki/ContributingToObjectify Download
mã nguồn Objectify bằng cách nhấn nút “Download Zip” theo link https://github.com/stickfigure/objectify
Định nghĩa và đăng ký các Entity:
Trang 30Đăng ký các Entity: Trong mô hình MVP để định nghĩa các model của ứng dụng bạn xây dựng các class entity sử dụng các annotation của objectify, sau đó đăng ký các
lớp này với ObjectifyFactory:
Bởi vì objectify chỉ hỗ trợ trên server nên việc đăng ký các lớp này thường được thực hiện trong các servlet file implement các service (đăng ký trong file web.xml, mỗi service được xác định path riêng với anotation @RemoteServiceRelativePath (tên pathservice) )
trong gói server của thư mục src
Định nghĩa các entity: Các entity là các POJO rất đơn giản với các annotation đặc
biệt của objectify và không sử dụng các chú thích (annotation) của JPA hay JDO Một
ví dụ định nghĩa lớp Users đơn giản như sau:
@Entity // annotation của Objectify
public class Users implements Serializable,IsSerializable {
public @Id Long Id;
@Index public String Name;
@Index public String Pwd;
public int State;
@Index public String Email;
@Index public String Dienthoai;
public String Diachi;
public Users(String name, String pwd, int state, String email, String dienthoai,String
Trang 31@Unindex(chế độ mặc định cho các trường) để lưu trữ
- Các lớp thực thể(entity) phải chứa ít nhất và chỉ một trường với chú thích @Id là một phần trong khóa xác định một entity Trường này phải có kiểu Long, long hoặc String Nếu bạn dùng trường này kiểu Long và lưu một entity với một id null thì một giá trị số sẽ được tự động sinh ra cho bạn dùng cấp phát GAE chuẩn, trong trường hợp bạn dùng hai kiểu còn lại thì id null không bao giờ được tự động cấp phát khi lưu
- Các lớp thực thể phải chứa ít nhất một phương thức khởi tạo không có tham số hoặc không chứa một phương thức khởi tạo nào mà lúc đó Java sẽ tự động tạo ra một phương thức khởi tạo không chứa tham số
Các thao tác cơ bản:
Tất cả các thao tác trên datastore được bắt đầu với cùng một thể hiện của Objectify và chỉ nên dùng nó trong một đơn luồng Để lấy về một thể hiện của Objectify cách hay dùng là gọi một phương thức tĩnh ObjectifyService.ofy() không cần thêm tham số tới các phương thức nghiệp vụ của bạn Thể hiện được trả về bởi objectify sẽ thay đổi khi bạn vào và thoát khỏi các giao dịch, vì vậy hãy chắc chắn rằng bạn đã cài đặt ObjectifyFilter để nó làm sạch thể hiện cuối cùng khi kết thúc một yêu
Trang 32cầu(request) Trên thực tế chúng ta được khuyến cáo không nên giữ lại một biến thể hiện của objectify
// Thực tế đây là một cách sử dụng không hay:
Objectify ofy = ofy ();
// Ví dụ
Users th = ofy () load () type ( Users class ).first() now ();
Thing th = ofy () load () key ( thingKey ) now ();
Result < Thing > th = ofy () load () entity ( entity );
Result < Thing > th = ofy () load () type ( Thing class ) parent ( par ) id ( 123L );
Thao tác Save:
Để lưu lại lưu các đối tượng các lớp entity hoặc những thay đổi của nó lên GAE ta dùng thao tác save()
// Lưu từng entity
ofy () save () entity ( thing1 ); // không đồng bộ
ofy () save () entity ( thing1 ) now (); // đồng bộ
// Lưu nhiều entity
ofy () save () entities ( thing1 , thing2 , thing3 ); // không đồng bộ
ofy () save () entities ( thing1 , thing2 , thing3 ) now (); // đồng bộ
// Lưu danh sách các entity
List < Users > things =
ofy () save () entities ( things ); // không đồng bộ
ofy () save () entities ( things ) now (); // đồng bộ
// Cập nhật một entity sau đó lưu thay đổi
Currentuser.setState(1);
Currentuser setUserPasswd(“123456”);
Trang 33Để xóa các thể hiện entity trên GAE ta dùng thao tác delete()
// Xóa dựa trên trường @Id
ofy () delete () type ( Thing class ) id ( 123L ); // không đồng bộ
ofy () delete () type ( Thing class ) id ( 123L ) now (); // đồng bộ
// Xóa khi biết cả thực thể
ofy () delete () entity ( thing ); // không đồng bộ
ofy () delete () entity ( thing ) now (); // đồng bộ
1.3 PhoneGap
1.3.1 Tổng quan về PhoneGap
PhoneGap là framework mã nguồn mở dành cho xây dựng các ứng dụng native trên
đa nền tảng sử dụng công nghệ web chuẩn nhƣ HTML5, CSS, JS
Dạng ứng dụng di động đƣợc tạo ra bởi phonegap đƣợc gọi là ứng dụng hybird Những ứng dụng này không thuần HTML/CSS cũng nhƣ không hoàn toàn là ứng dụng gốc (native) bởi vì tất cả các layout đƣợc hiển thị thông qua các web view thay vì các
UI của framework gốc của hệ điều hành, cũng không phải là ứng dụng web, chúng đƣợc đóng gói và phân phối nhƣ các ứng dụng gốc và có thể truy cập đến các API của thiết bị gốc Một phần ứng dụng duy trì UI (user interface), ứng dụng logic và giao tiếp với server dựa vào HTML/JavaScript Phần còn lại của ứng dụng giao tiếp và điều khiển thiết bị (điện thoại hay tablet) dựa trên ngôn ngữ native cho platform đó
Trang 34Hình 1.3 : Đặc tính của ứng dụng Hybird
PhoneGap cung cấp 1 cầu nối từ JavaScript đến platform thiết bị Điều này cho phép JavaScript API có thể điều khiển và truy cập thiết bị PhoneGap chủ yếu cung cấp JavaScript API để truy cập thiết bị sử dụng các ứng dụng nhƣ camera, GPS, thông tin thiết bị, danh bạ, thông báo (notification), hệ thống file, kết nối mạng PhoneGap là công nghệ nền tảng đƣợc sử dụng rộng rãi nhất cho việc tạo ra các ứng dụng có thể chạy trên nhiều thiết bị di động, nó hỗ trợ các platform nhƣ:
windows (8.0, 8.1, Phone 8.1)
tizen
cordova
CLIMac, Windows, Linux
Mac, Windows, Linux Mac, Windows
Mac, Windows, Linux Mac Ubuntu Windows Không
Embedded
WebView (see details) (see details) Không Không
(see details) Không Không Không
Plug-in
Interface (see details) (see details) (see details) Không
(see details)
(see details) Không
Bảng 1.3 Danh sách các platform Phonegap hỗ trợ
- Tại sao sử dụng Phonegap
Ứng dụng của bạn đƣợc xây dựng hoàn toàn với các công nghệ web và bạn hoàn toàn có thể triển khai đƣợc trên nhiều application store nhƣ Android market, Apple
Trang 35App Store hay BlackBerry App World (đây là một giải pháp giúp cho các ứng dụng GWT mà đề tài lựa chọn có thể đƣợc triển khai lên các application store)
Bạn có thể xây dựng một ứng dụng di động nâng cao với các kỹ năng phát triển web của bạn Điều này có nghĩa bạn cần nâng cao những đặc tính của thiết bị không đƣợc hỗ trợ bởi trình duyệt di động cho tới thời điểm bây giờ (nhƣ camera hay calendar…) và phonegap có thể làm đƣợc điều đó bằng cách cung cấp các API hỗ trợ cho các thiết bị di động
Bạn có thể xây dựng nhanh một nguyên mẫu của ứng dụng di động mà không phải dành thời gian học các ngôn ngữ hỗ trợ cho từng hệ điều hành của điện thoại di động nhƣ Objective-C, swift, java…(iOS dùng Objective-C; Android dùng Java (Dalvik VM); BlackBerry dùng Java/C++; Windows Phone dùng :C#, VB.NET, JavaScript; Nokia dùng C++, Flash)
Ngoài ra nó còn rất nhiều điểm khá mềm dẻo nhƣ là hỗ trợ: nhiều framework phổ biến, các ứng dụng multi-page hay single page/AJAX, thƣ viện giao diện UI…
- Kiến trúc của ứng dụng phonegap
Hình 1.4 Ứng dụng Phonegap tương tác với thiết bị di động ( https://github.com/notiontaxi/phonegap-trial )
Trang 36Phonegap chủ yếu là các thư viện JavaScript cho phép HTML/JavaScript có thể truy cập tính năng các thiết bị Một ứng dụng sử dụng PhoneGap có thể chia làm hai phần:
JavaScript Bussiness Logic: Điều khiển UI và các chức năng của nó
JavaScript: Truy cập và điều khiển thiết bị
Ứng dụng Phonegap có 3 thành phần cơ bản:
Ứng dụng chạy như một webview bên trong một wrapper ứng dụng gốc (ở
BlackBerry nó như là một đối tượng Browser File - dùng net.rim.device.api.browser.field2, ở Android nó là một view: WebView – dùng android.webkit.WebView, ở IOS nó là một UIWebView – dùng System/Library/Frameworks/UIKit.framework ) Nó thực thi như một trang web có tên mặc định là index.html, và sẽ tham chiếu tới bất kỳ file CSS, JavaScript, các file ảnh, các file media hoặc những nguồn tài nguyên khác khi nó chạy
Ứng dụng Cordova( mã nguồn mở dựa trên PhoneGap) dựa vào tập tin config.xml
chung để cung cấp các thông tin về ứng dụng và đặc tả các tham số ảnh hưởng đến cách hoạt động của nó (chẳng hạn như là liệu nó có phản ứng với các chuyển định hướng)
Một giao diện plugin cho Cordova và các thành phần native giao tiếp với nhau Có
nghĩa là bạn có thể triệu gọi native code từ JavaScript Từ phiên bản 3.0 các plugin cung cấp các ràng buộc tới các chuẩn API của thiết bị Tuy nhiên, các plugin (bên thứ ba này) không cần phải sẵn có trên tất cả các hệ điều hành (xem trong bảng 1.2.6)
1.3.2 Nguyên tắc hoạt động và mô hình của PhoneGap
Ý tưởng cơ bản là sử dụng một Chromeless Browser – một browser không có bất
kỳ thành phần UI nào, nó được dùng như một blank platform cho bất kỳ ứng dụng nào được viết trong HTML, CSS và Javascript - nhưng browser này có thể truy cập được
Trang 37tới thiết bị phần cứng của di động Với cách này nhà phát triển có thể truy cập đến phần cứng thông qua một bộ JavaScript API mà Phonegap cung cấp.
Hình 1.5 Nguyên tắc hoạt động của Phonegap, Cordova
Khi người dùng thực hiện các tính năng của ứng dụng có sử dụng đến một trong các Phonegap API, ứng dụng sẽ gọi API thông qua việc dùng JavaScript và sau đó một layer riêng bên trong ứng dụng sẽ dịch cái Phonegap API này để gọi tới một native API tương ứng với loại hệ điều hành của thiết bị người dùng đang dùng để thực hiện chức năng người dùng yêu cầu (chẳng hạn như truy cập đến camera để chụp ảnh, hay lấy về danh sách contact lưu trong thiết bị…)
Hình 1.6 Mô hình xây dựng một ứng dụng với Phonegap
Trang 38Kiến trúc plugin của phonegap cho phép đăng ký tất cả các plugin cần thiết cho ứng dụng và phonegap framework cũng cho phép tự viết và dùng các plugin của nó Mỗi plugin có một native code riêng tương ứng cho mỗi hệ điều hành và một sự thực
thi cài đặt cho JavaScript API
1.3.3 Các Phonegap API
Danh sách các Phonegap API hỗ trợ cho thiết bị di động được liệt kê trong bảng I.2.4
Bảng 1.4 Danh sách các Phonegap API hỗ trợ cho các thiết bị di động
Ở đây đồ án không có tham vọng đề cập hết tất cả mà chỉ đề cập đến một số API
sử dụng trong ứng dụng Clicker thi trắc nghiệm trực tuyến để lấy thông tin từ thiết bị, kiểm tra kết nối network và các thông báo notification
- Cách lấy thông tin từ thiết bị di động
Phonegap có một đối tượng runtime được gọi là đối tượng thiết bị device để lưu trữ các thông tin cần thiết của thiết bị Để lấy về đối tượng device của phonegap chúng
ta làm như sau:
Trang 39//Lấy về đối tượng phonegap
public static PhoneGap phoneGap = GWT.create(PhoneGap.class);
//Lấy về đối tượng device
public static Device mydevice = phoneGap.getDevice();
Đối tượng Device cho phép ứng dụng truy cập tới một số thông tin về ứng dụng và thiết bị chạy trong một ứng dụng phonegap Sau đây là một số thuộc tính của đối tượng Device:
device.name: Trả về tên được gắn với thiết bị Tên này có thể được đăng ký bởi nhà sản xuất thiết bị hoặc cũng có thể bởi người dùng thiết bị tùy thuộc vào loại hệ điều hành di động
device.phonegap: Trả về phiên bản của phonegap framework được dùng để xây dựng ứng dụng
device.platform: Hầu hết các hệ điều hành đều hỗ trợ tính năng này và trả về hệ điều hành của thiết bị mà ứng dụng đang chạy
device.uuid: Trả về định danh id duy nhất của thiết bị
device.version: Trả về phiên bản của hệ điều hành chạy trên thiết bị di động
Cách lấy về ID quốc tế của thiết bị UUID
Mỗi thiết bị đều phải có số UUID bởi nhà sản xuất thiết bị khi thiết bị được sản xuất và không thể thay đổi, nó là duy nhất UUID có thể có chiều dài khác nhau phụ thuộc vào thiết bị, nó luôn được định nghĩa theo một model từng platform Với Android, nó là một số ngẫu nhiêu kiểu int-64 bit được tự sinh khi boot lần đầu trên thiết bị Với BlackBerry, nó là số mã pin với 9 kí tự kiểu int Với iPhone, sử dụng một chuỗi ký tự string là giá trị của hàm băm được tạo ra từ nhận diện nhiều phần cứng, nó đảm bảo là duy nhất với mỗi phần cứng và không thể được gắn với tài khoản người dùng Với Windows Phone7, nó trả về giá trị hàm băm của thiết bị + người dùng hiện tại nếu người dùng chưa được định nghĩa, một guid được tạo ra và sẽ tồn tại cho đến khi ứng dụng được gỡ cài đặt
Trang 40(http://www.phonegapcn.com/docs/zh/1.4.1/phonegap_device_device.md.html )
Ta sử dụng device.uuid như sau:
//Lấy về UUID của thiết bị
String deviceID = phoneGap.getDevice().getUuid();
Thuộc tính này chỉ hỗ trợ cho các hệ điều hành:
Android
BlackBerry
BlackBerry WebWorks (OS 5.0 và cao hơn)
iPhone
Windows Phone 7(Mango)
- Kiểm tra mạng kết nối thiết bị
Khi bắt đầu làm việc với thiết bị di động chúng ta cần kiểm tra kết nối mạng vì tín hiệu kết nối có thể rất yếu, không ổn định hoặc không tồn tại Phonegap API có chứa đối tượng Connection object cho phép ta truy cập vào thông tin kết nối của thiết bị Để xác định dạng của kết nối mạng hiện thời mà ứng dụng đang sử dụng chúng ta có thuộc tính connection.type, nó có thể có các giá trị sau:
Điện thoại smartphone hiện đại thường có nhiều sóng kết nối, vì vậy các thiết bị
có thể kết nối đến nhiều kiểu mạng trong suốt cả ngày Khi dữ liệu được truyền đến