TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN MẠNG MÁY TÍNH

– VIỄN THÔNG

ĐẶNG NGUYỄN KIM ANH – ĐÀO ANH TUẤN

NGHIÊN CỨU JAVA MOBILE VÀ XÂY DỰNG ỨNG DỤNG MINH HỌA

KHÓA LUẬN CỬ NHÂN TIN HỌC

TP.HCM, 2005

Sưu t m b i: www.daihoc.com.vn

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN MẠNG MÁY TÍNH – VIỄN THÔNG

ĐẶNG NGUYỄN KIM ANH ĐÀO ANH TUẤN

– 0112424 – 0112451

NGHIÊN CỨU JAVA MOBILE VÀ XÂY DỰNG ỨNG DỤNG MINH HỌA

KHÓA LUẬN CỬ NHÂN TIN HỌC

GIÁO VIÊN HƯỚNG DẪN Thầy NGUYỄN MINH TUẤN

NIÊN KHÓA 2001-2005

Sưu t m b i: www.daihoc.com.vn

Lời Cảm Ơn!
Sau hơn năm tháng tìm hiểu và thực hiện, luận văn “Nghiên cứu công nghệ Java Mobile và xây dựng ứng dụng minh hoạ” đã cơ bản hoàn thành. Để đạt được kết quả này, chúng tôi đã nỗ lực hết sức đồng thời cũng nhận được rất nhiều sự quan tâm, giúp đỡ, ủng hộ của các thầy cô, bạn bè và gia đình. Trước hết, chúng em xin gởi lời cảm ơn chân thành đến Bộ môn Mạng máy tính và Viễn thông, Khoa Công nghệ Thông tin, trường Đại học Khoa học Tự nhiên và các thầy cô đặc biệt là Thầy Nguyễn Minh Tuấn đã tận tình giúp đỡ, hướng dẫn chúng em hoàn thành luận văn này. Chúng tôi rất cảm ơn các bạn bè trong khoa, các anh chị, các bạn trong cộng đồng Java Việt Nam đã bên cạnh ủng hộ, đóng góp ý kiến cho chúng tôi trong quá trình thực hiện luận văn. Và chúng con cũng xin chân thành cảm ơn gia đình đã luôn động viên, tạo điều kiện tốt nhất cho chúng con học tập và hoàn tất luận văn. Luận văn đã hoàn thành với một số kết quả nhất định, tuy nhiên vẫn không tránh khỏi sai sót. Kính mong sự cảm thông và đóng góp ý kiến từ các thầy cô và các bạn. Thành phố Hồ Chí Minh, tháng 7 năm 2005

Đặng Nguyễn Kim Anh - Đào Anh Tuấn

Sưu t m b i: www.daihoc.com.vn

MỤC LỤC
Lời Nói Đầu...................................................................................................... 1 Phần 1: Kiến thức nền tảng J2ME ................................................................ 5 Chương 1: Tổng quan về J2ME.................................................................... 5
1.1 Giới thiệu J2ME (Java 2 Micro Edition).......................................................5 1.2 Lý do chúng ta cần J2ME..............................................................................6 1.3 Các thành phần của J2ME:............................................................................7 1.3.1 Configuration:.............................................................................................7 1.3.2 Profile: ........................................................................................................9 1.3.3 Máy ảo Java ..............................................................................................10

Chương 2: Giới thiệu CLDC và MIDP ...................................................... 13
2.1. CLDC ..........................................................................................................13 2.1.1. Yêu cầu phần cứng: ..................................................................................13 2.1.2. Yêu cầu phần mềm: ..................................................................................13 2.1.3. Máy ảo Java:.............................................................................................13 2.2. MIDP:..........................................................................................................16 2.2.1. Yêu cầu phần cứng: ..................................................................................16 2.2.2. Yêu cầu phần mềm: ..................................................................................16 2.2.3. Cấu trúc MID Profile:...............................................................................16 2.2.4. MIDlet Suite: ............................................................................................18 2.2.5. Môi trường phát triển ứng dụng J2ME.....................................................22

Chương 3: Các vấn đề cơ bản của chương trình MIDlet ......................... 25
3.1. Cấu trúc cơ bản: ..........................................................................................25 3.2. Xây dựng một ứng dụng MIDlet:................................................................25 3.3. Lớp MIDlet: ................................................................................................26 3.4. Lớp MIDletStateChangeException:............................................................28 3.5. Display.........................................................................................................28 3.6. Lớp Displayable: .........................................................................................30 3.7. Quản lý các sự kiện (event).........................................................................32 3.7.1. Command & CommandListener...............................................................33 3.7.2. Item và ItemStateListener.........................................................................38

Chương 4: Giao diện đồ họa cấp cao.......................................................... 40
4.1. Screen: .........................................................................................................42 4.2. Form: ...........................................................................................................43 4.3. Item:.............................................................................................................45 4.3.1. DateField: .................................................................................................46 4.3.2. Gauge:.......................................................................................................48 4.3.3. String Item: ...............................................................................................51 4.3.4. TextField: .................................................................................................53 4.3.5. ChoiceGroup: ...........................................................................................57 4.3.6. Image và ImageItem: ................................................................................61 4.4. List:..............................................................................................................64

Sưu t m b i: www.daihoc.com.vn

......7.....................com.........103 5...................................149 8.......................................6..........2.. 78 5... Alert:..............................152 Sưu t m b i: www....................2...................................2.................. Giới thiệu ............................................................................... Các vấn đề nảy sinh trong hệ thống ứng dụng phân tán..............3.................................127 7...........1........... AlertType:.2..........................5...............6.............. Giới thiệu GFC.......................................................1.......................5.... Vẽ các đối tượng hình ảnh (image): .................... TextBox:................................................................151 8.....................2........................................................................119 Nhận thông điệp khi Record Store thay đổi ............................... Lược đồ lớp ................................. Game action:.................................1.137 7..................................................1..........72 4.........2.........................4...................1..............1...................4...90 5.................149 8................................................... 6.....3..........................................................6...............................................................................138 7................................ 6.150 8.................................................................... Giới thiệu RMS ...........106 Duyệt danh sách Record với RecordEnumeration .....1............6.............................3...78 5...................... Ứng dụng phân tán (Distributed Application) ....... Vùng xén (Clipping regions):...2..............................................................................................3...4.........89 5....................3............72 4..... Khởi tạo kết nối: ....................79 5......................................................................1... Các phương thức tịnh tiến đối tượng:..vn .........................................................74 4......69 4....................93 5...........124 7...............1.........................141 7.............................144 Phần 2 : Web Service và Ứng dụng "Đăng Ký Học Phần" ...................3.........2..............4..........121 Xử lý lỗi khi thao tác với Record Store..79 5...................1.........................................................................................3...... 149 8........................ 6........5..2.........115 Sắp xếp bằng RecordComparator................ Các đặc điểm của kết nối HTTP bằng J2ME: .98 5.................... Sự kiện con trỏ:..............................1...........1......122 Chương 7: Kết nối mạng với Generic Connection Framework (GCF) 124 7...............2............................................. Graphics: ..................................................................... Web Service ...............101 5...........2............ Màu sắc:............105 Chương 6: Lưu trữ thông tin với RMS......... Kết nối HTTP:.................... 106 6...... Ticker: ...daihoc..................................2...3........................................6........................77 Chương 5: Giao diện đồ họa cấp thấp................................... Canvas: .......................... Nét vẽ:.. 6............................................ 149 Chương 8: Giới thiệu Web Service...........127 7....82 5.......... Hệ toạ độ:.........................87 5......................................................................4............................................................. Gửi và nhận SMS ...... Bắt sự kiện trong các đối tượng Canvas:............2.......................................................1.... Vẽ trên đối tượng Canvas:...1......... Hạn chế của những mô hình ứng dụng phân tán trước đây...........130 7...........................................85 5...............................2.................6.............................................1..................1..2.....................................117 Lọc record với RecordFilter ......................1... Font chữ:...... Thông số kết nối: ..................3.......................5......... Kết nối socket Datagram (UDP) ......................................................................................124 7...............5................... 6............................... Alert và AlertType: .......................... Kết nối TCP socket ..................

.............155 8.............................................................................183 9......................... Ưu điểm của web service ..........2 Các chức năng chính: ................. WSDL (Web Service Definition Language) ..........6 Các chức năng store procedures:..............................................................................................................................................................2.......152 8...........174 9..183 9................................4..................1 Kết luận: ......................4...............8..............2.........................2 Hướng phát triển: ........................................ 205 10.....4 Thiết kế mô hình dữ liệu: ..........2.1.......5 Mô hình dữ liệu: ...191 9....................193 Chương 10: Tổng kết ..................................................................... SOAP (Simple Object Access Protocol) ........188 9.............................thử nghiệm:................................................4.......................................172 9...176 9.................157 8........192 9............ Định nghĩa ...........162 Chương 9: Ứng dụng đăng ký học phần .......................................................................................................................................174 9........................................................................daihoc....172 9...................2......................................................2 Đặc tả một số use case chính:.vn .........................................................2..............................2.................................................................207 Tài liệu tham khảo ....... Các thành phần chính của Web Service ....................................................................2 Yêu cầu phần mềm: ....1..1.........thiết kế:.4 Ràng buộc dữ liệu:......................................2 Mô hình bảo mật (mã hoá password): ............................. 222 Sưu t m b i: www....................172 9.152 8.......................................2 Các bảng dữ liệu:..........................193 9........................ Thành phần cơ bản của Web service:..................4............................157 8......................2................com........5........................................................................... Hoạt động của Web service....3 Chi tiết các bảng dữ liệu:....................................3....................................1 Tổng quan:.....................1 Đặc tả chương trình:....................... 217 Phụ Lục C: Giới thiệu các thư viện JSR ..4...............................184 9..............152 8...................................4.......................................... 172 9.....................1 Mô hình use case: ......................................................................................................... 211 Phụ Lục B: Xây dựng và Sử dụng Web Service.............................190 9........1.......................178 9.....4..................................2..2 Kiến trúc chương trình: ....3...........3..........................3....................1 Mô hình kết nối: .......................................................................3 .........3 Phân tích ................7 Thiết kế lớp:..1 Yêu cầu phần cứng: ..............177 9............................................................................ 210 Phụ Lục A: Hướng dẫn sử dụng công cụ Sun Wireless ToolKit 2..........190 9..192 9.........................5.............4..3.177 9...........205 10............3 Giao diện chương trình:.....................................................................5 Cài đặt .183 9...........................................3..................5....................1 Mô hình thực thể kết hợp: ...................

...........................................................162 Hình 9..........................................67 Hình 4...............................................................152 Hình 8................7 Hình 1...........1 Sơ đồ các lớp giao diện đồ hoạ ..........................176 Sưu t m b i: www...............8 Giao diện đối tượng ChoiceGroup chế độ nhiều lựa chọn..2 Kết nối UDP.....4 Web Service Endpoint......................................................................................5 Cấu trúc chương trình MIDP ...................10 Giao diện đối tượng List cho phép chọn nhiều lựa chọn ...........................1 Lược đồ các lớp trong thư viện GCF .59 Hình 4.............................................................................................................145 Hình 8................................................................................................4 Giao diện đối tượng Gauge chế độ không tương tác ..........................................................174 Hình 9................11 Hình 2..................................................138 Hình 7....................com..........49 Hình 4.1 Các phương thức vẽ đường cong ..........................................60 Hình 4...........................................48 Hình 4.......7 Vẽ bằng đối tượng Mutable Image ..............................................................................2 Mô hình mã hoá password .....................................................................................4 Các định dạng trong Text Graphic...................Danh Sách Các Hình Hình 1.............................3 Một web service có thể triệu tập đến các web services khác...............6 Hình 1......................................101 Hình 5........................................102 Hình 5...daihoc.......................................................2 Giao diện đối tượng DateField.....5 Giao diện đối tượng StringItem ..36 Hình 4....8 Các định dạng vị trí trong Graphics ...7 Giao diện đối tượng ChoiceGroup chế độ một lựa chọn ........................................................................................................................95 Hình 5..........97 Hình 5....................141 Hình 7...103 Hình 7.........................................................................97 Hình 5...........................1 Command Exit ........6 Vẽ bằng đối tượng Immutable Image .......3 Configurations và các thiết bị ........................................vn .............12 Giao diện đối tượng Alert .............2 Các thành phần của J2ME.........................4 Lược đồ lớp thư viện WMA........................................100 Hình 5.71 Hình 4........................................................................2 Các phương thức vẽ hình chữ nhật ......36 Hình 3........................9 Hình 1....17 Hình 3..............52 Hình 4..4 Cấu trúc chương trình J2ME............................40 Hình 4.154 Hình 8.......................................................................................11 Giao diện đối tượng TextBox.............13 Giao diện Ticker.......3 Ánh xạ soft-button..............1 Hoạt động của Web Service..............................3 Kết Nối TCP......2 Command Label ..............................................3 Giao diện đối tượng Gauge chế độ tương tác ...........11 Hình 1.................1 Các thiết bị J2ME hỗ trợ .3 Các phương thức hỗ trợ vẽ Text .....76 Hình 4..................................................................................5 Các phương thức tạo font...............................................................................................9 Giao diện đối tượng List dạng menu....................155 Hình 8..................................2 Một client truy xuất đến nhiều web services cùng lúc......................................................6 Giao diện đối tượng TextField ...................................................................................................................................................................125 Hình 7...................34 Hình 3................................68 Hình 4...................56 Hình 4.1 Cấu trúc thiết bị MID .77 Hình 5.....1 Kiến trúc chương trình ứng dụng..............46 Hình 4..........................94 Hình 5...............................

................221 Hình B...........................2 Khai báo lớp và hàm............................................13 Màn hình đăng ký học phần lý thuyết.........190 Hình 9......................................201 Hình 9.............................................vn .............................200 Hình 9...........................................................................196 Hình 9..................15 Màn hình xem thời khoá biểu ..............................................213 Hình A.........................................................................................................11 Confirm ....................202 Hình 9................................................................3 Lược đồ use case .......6 Biên dich project ...........................................................5 Ràng buộc chu trình ........217 Hình B........com..........12 Menu chức năng.........................................................................................................................................................................1 Hướng phát triển thực tế ...........3 Export nhiều hàm cùng lúc.9 Màn hình welcome.............................6 Công cụ Stub Generator ............................4 Màn hình thực thi Web Service của IE .......................................................17 Màn hình xem phiếu đăng ký....215 Hình A.................2 Màn hình chính của công cụ ..........daihoc......211 Hình A..219 Hình B.........................................................199 Hình 9...192 Hình 9.................................14 Màn hình đăng ký học phần thực hành .........8 Sơ đồ các màn hình .......18 Màn hình xem thời khoá biểu ..................195 Hình 9.7 Mô hình Lớp........198 Hình 9.......................183 Hình 9.....3 ................................................207 Hình A....................218 Hình B............................................216 Hình B.........................................1 Tạo project Web Service ...................6 Mô hình cơ sở dữ liệu ........177 Hình 9...........................................................................................203 Hình 9........................3 Tạo project mới ....................................7 Đóng gói ứng dụng............194 Hình 9...............................................5 Chỉnh sửa nội dung file Jad và Jar ......................................................................................................................................................................................................5 File WSDL.................7 Các options của công cụ Stub Generator................................................4 Mô hình thực thể kết hợp ER .............16 Màn hình xem kết quả học tập ..............................................................................................................................10 Màn hình đăng nhập.......1 Công cụ Sun WirelessToolkit 2.......................220 Hình B....................204 Hình 10.......................221 Sưu t m b i: www......................................214 Hình A...................................................................................................212 Hình A......................................219 Hình B.......Hình 9..189 Hình 9.........4 Các options cho project .....................................197 Hình 9................212 Hình A....................................................................

.......................53 Bảng 4......45 Bảng 4..............................................................44 Bảng 4..........................................................66 Bảng 4.............58 Bảng 4.....................................79 Bảng 5................................................................9 Lớp ChoiceGroup ..................................5 Command và CommandListener .......................62 Bảng 4................vn ..............10 Các phương thức vẽ ...............................................77 Bảng 5.........................12 Giá trị Anchor .....................................................................96 Bảng 5...................................................................................9 Lớp Graphics ........................20 Bảng 3.................................................................................................................................17 Lớp Alert....................................................19 Lớp Ticker .............................16 Lớp TextBox.........................6 Item và ItemStateListener..............................com.........................................................................................................8 Lớp TextField .............................................1 Truy vấn kích thước Canvas........32 Bảng 3...............................1 Lớp MIDlet ........................................................................................................................15 So sánh TextField và TextBox .........................................................................................................................................................101 Sưu t m b i: www..............38 Bảng 3.........2 Lớp Canvas .............................................6 Lớp StringItem..................18 AlertType......87 Bảng 5.........................................................49 Bảng 4.90 Bảng 5..5 Lớp Gauge ..................75 Bảng 4.................................................................3 Lớp Item ...................................12 Lớp ImageItem ................................27 Bảng 3.....1 Lớp Screen................55 Bảng 4.........................93 Bảng 5...................63 Bảng 4.............................70 Bảng 4.................................13 Xử lý Font chữ..........................4 Mã Phím......................73 Bảng 4..........................daihoc..................................................................65 Bảng 4...................................1 Cấu trúc file manifest....................................42 Bảng 4..................84 Bảng 5.....................51 Bảng 4.......11 Định dạng ImageItem ...8 Sự kiện con trỏ........................................................................85 Bảng 5.......81 Bảng 5..............................29 Bảng 3..................................................................................................................................4 Các Command Type .....................................................................................2 Cấu trúc file JAD ...............62 Bảng 4.................................................4 Lớp DateField ................5 Sự kiện keyPressed ....................................................................................................81 Bảng 5..................7 Bắt sự kiện trong Game Action ..............3 Lớp Displayable............................................15 Vẽ hình ảnh......................Danh Sách Các Bảng Bảng 2........7 Các Ràng Buộc của TextField ......................99 Bảng 5...................................................83 Bảng 5.........................................................................................2 Lớp Form ..........................................................46 Bảng 4....................................11 Xử lý Text...........................................................................................13 So sánh List và ChoiceGroup ..........................86 Bảng 5.......................................................................................................................................................14 Các giá trị Font ...........................................10 Lớp Image.........98 Bảng 5................................................................19 Bảng 2......................................................................................69 Bảng 4......37 Bảng 3................................................3 Giao tiếp với Application Manager .................................................................................................................96 Bảng 5.................................................................................................................2 Lớp Display ..........................6 Sự kiện Game Action....................39 Bảng 4...14 Lớp List.....

.............................185 Bảng 9...128 Bảng 7....3 Table SV .............................................................4 Table MonHoc ...........................................................139 Bảng 7...8 Table Lop_MonTH...........................................8 Lớp Datagram ...............184 Bảng 9................................................................................................................................................................................137 Bảng 7................................187 Bảng 9.187 Bảng 9.................185 Bảng 9..............1 Danh sách các Use Case ..187 Bảng 9........................107 Bảng 6..........................................................................103 Bảng 5...........185 Bảng 9..186 Bảng 9.....3 Các Request Method chính..178 Bảng 9...daihoc................................................................................................................................................................Bảng 5.........................................................134 Bảng 7.......7 Table Lop_MonLT ...........11 Table DangKyTH ......................2 Mode Kết Nối .............142 Bảng 7..........................................................................3 Lớp RecordEnumeration .....16 Giá trị Image Anchor ............................6 Table Lop..........................................10 Table DangKyLT............1 Lớp Connector ........................................................vn ...............................................................188 Sưu t m b i: www....................................................5 Table GV ..............................17 Các phương thức tịnh tiến ............131 Bảng 7......10 Lớp SocketConnection .....143 Bảng 7...................................12 Table ThongBao ..........................................5 Các phương thức truy vấn HTTP Header...............................128 Bảng 7...............................................................4 Các phương thức set/get Request Method..........................121 Bảng 7........................103 Bảng 5.....................2 Lớp RecordStore........144 Bảng 9..............1 Mô hình Record Store.................118 Bảng 6...............................................................................................................2 Table ChuyenNganh .6 Lấy thông số kết nối ...........................................................................................................................................105 Bảng 6..............................................................................................com......................................................................9 Thuộc tính của SocketConnection.109 Bảng 6...................................9 Table PhanCongTH .............130 Bảng 7...........................................................184 Bảng 9.7 Lớp DatagramConnection .....................................117 Bảng 6..............5 Lớp RecordListener ..11 Các interfaces chính của WMA.............................................18 Vùng xén...................................................................................187 Bảng 9.....................................................................................................................................................................................................................4 Các giá trị hằng để sắp xếp record........140 Bảng 7....................

daihoc. phiên bản Java cho những dự án lớn. âm thanh.com. RecordStore Management System. cơ chế lưu trữ của J2ME. Sưu t m b i: www. những yêu cầu cần bổ sung cho các phiên bản Java. Máy ảo Java cho môi trường CLDC.Các chữ viết tắt. phiên bản Java cho những thiết bị nhỏ. Thư viện mã hóa và bảo mật cho ngôn ngữ J2ME. tin nhắn hình ảnh. dành cho PC thông thường. Thư viện truy xuất web service cho ngôn ngữ J2ME. Tên gọi chung cho các ứng dụng J2ME. Mobile Information Device Profile. video cho di động. Personal Digital Assistant. Tổ chức Java Community Process Java Development Kits Java Specification Requests. Java 2 Standard Edition. Multimedia Message Service. Java 2 Micro Edition. phiên bản Java ra đời đầu tiên. thuật ngữ được sử dụng API CDC CLDC Configuration DES GCF IIS J2EE J2ME J2SE JCP JDK JSR JSR-172 JSR-177 KVM MIDlet MIDP MMS PDA Profile RMS Application Program Interface Connected Device Configuration Connected Limited Device Configuration Đặc tả qui định các thư viện gốc J2ME phải hỗ trợ cho một dòng phần cứng. Thuật toán mã hóa khóa bí mật 64 bits General Connection Framework Internet Information Services-Web server chuẩn trên Windows Java 2 Enterpise Edition.vn . Các tập thư viện cấp cao định nghĩa trên nền Configuration.

Universal Description.daihoc. Discovery. Simple Object Access Protocol. Wireless Message API Web Service Definition Language Extensible Markup Language Sưu t m b i: www. tin nhắn thông thường cho điện thoại di động.com. định dạng thông điệp của Web Service.vn . Hệ điều hành cho điện thoại di động của hãng Symbian.SMS SOAP Symbian UDDI Web Service WMA WSDL XML Short Message Service. and Integration Giao thức gọi hàm từ xa dựa trên XML và HTTP.

Java Mobile Lời Nói Đầu Mạng điện thoại di động xuất hiện tại Việt Nam từ đầu những năm 1990 và theo thời gian. Chúng ta có thể nói đối tượng của ngôn ngữ J2ME là rộng hơn rất nhiều so với C++ trên nền Symbian. tiện dụng. ngôn ngữ J2ME không hỗ trợ được nhiều tính năng như C++ trên Symbian nhưng lại có những ưu điểm trội hơn. kể cả các điện thoại có hệ điều hành Symbian. Tuy nhiên hệ điều hành Symbian lại có kích thước khá lớn nên chỉ có ở các thế hệ điện thoại tương đối cao cấp. xây dựng các ứng dụng cho điện thoại di động đang là một yêu cầu tất yếu trong xu thế hiện nay. với những lập trình viên đã có kinh nghiệm với Java việc lập trình với J2ME trở nên rất 1 Sưu t m b i: www. và xây dựng ứng dụng dùng Symbian API cũng phức tạp hơn. số lượng các thuê bao cũng như các nhà cung cấp dịch vụ di động tại Việt Nam ngày càng tăng.vn . được hỗ trợ bởi hầu hết các thế hệ điện thoại mới ra đời. gọn nhưng rất chặt chẽ và dễ nắm bắt. J2ME không những là một ngôn ngữ hướng đến các thiết bị di động mà còn là ngôn ngữ chính để lập trình trên các thiết bị gia dụng. thư mục… như máy tính cá nhân vì được hỗ trợ trực tiếp bởi hệ điều hành. Ngày nay điện thoại di động không chỉ còn mang chức năng gọi điện hay nhắn tin thông thường mà còn là một thiết bị giải trí. Hai hướng phát triển ứng dụng trên điện thoại di động phổ biến hiện nay là sử dụng ngôn ngữ C++ trên nền hệ điều hành Symbian và J2ME.com. thẻ tín dụng điện tử và các thiết bị thông minh khác. Ngành công nghiệp phần mềm cho các thiết bị di động được xem như một mảnh đất màu mỡ và hứa hẹn đem lại nhiều tỉ đô la doanh thu. J2ME là một ngôn ngữ nhỏ. Các ứng dụng viết trên nền Symbian có các ưu thế truy cập trực tiếp các tài nguyên của điện thoại cũng như hỗ trợ hệ thống tập tin. Do đó.daihoc. Đối trọng với Symbian API là công nghệ J2ME với kích thước nhỏ gọn. tra cứu thông tin rất tiện lợi. Cùng với sự phát triển của số lượng thuê bao di động là sự đa dạng hoá các dịch vụ hướng đến thiết bị di động. Tại thời điểm hiện tại.

org) là một chương trình do Sun thành lập luôn tiếp thu các ý kiến và đưa ra các đặc tả mới dành cho Java nói chung và J2ME nói riêng.com. chúng tôi chọn nghiên cứu về J2ME vì những ưu điểm khá rõ ràng đã nêu trên. Thương mại điện tử (e-commerce) đang tiến dần sang thương mại di động (m-commerce). JSR-172 (Web service). Ứng dụng chúng tôi chọn thực hiện để bước chân vào lãnh vực khá mới mẻ này là ứng dụng "Đăng Ký Học Phần" qua mạng di động. số người sở hữu máy vi tính cá nhân. JSR 205 (Gửi tin nhắn SMS. Chúng tôi nhận thấy xu hướng mở rộng các ứng dụng trên web sang điện thoại di động đang được chú trọng. Trong luận văn của mình. MMS). hệ thống đăng ký học phần SMS qua môi trường web là một ứng dụng rất quen thuộc.Java Mobile dễ dàng.vn .jcp. Đối với sinh viên khoa công nghệ thông tin. Chúng tôi muốn phát triển ứng dụng của mình như một mở rộng của hệ thống đăng ký học phần này trên điện thoại di động nhằm hỗ trợ các bạn sinh viên có thể sử dụng các tiện ích của hệ thống mà không cần phải có máy 2 Sưu t m b i: www. JCP (Java Community Processhttp://www. tính khả thi và thực tế ngày càng được đề cao. Thật khó so sánh giữa các dòng ngôn ngữ lập trình với nhau vì mỗi loại đều có ưu và khuyết điểm riêng. số người sử dụng dịch vụ trực tuyến chắc chắn sẽ tăng nhanh vì đối với nhiều người chiếc điện thoại di động dễ sử dụng hơn rất nhiều so với chiếc máy tính "phức tạp và khó hiểu". Về chương trình ứng dụng. Các đặc tả này thường có tiếp đầu ngữ JSR và là các tính năng bổ sung mới cho J2ME. Việc chuyển các ứng dụng thương mại từ môi trường web sang môi trường di động sẽ khiến sự tiện dụng tăng cao. JSR-177 (Security and Trust Services). J2ME còn là một ngôn ngữ được các tổ chức mã nguồn mở ủng hộ mạnh mẽ và phát triển rất nhanh chóng. JSR 184 (3D Game)… Các đặc tả này ngày càng phong phú và phần nào phát triển nhanh hơn cả sự phát triển của phần cứng.daihoc. mặt khác chúng tôi cũng muốn thử sức ở một lãnh vực khá mới mẻ là tiếp cận với phần mềm mã nguồn mở. Những JSR quan trọng có thể được nhắc đến như JSR-82 (Bluetooth). đặc biệt là máy tính xách tay chưa nhiều nhưng tỉ lệ số người có điện thoại di động lại khá cao. Với thực trạng Việt Nam hiện nay.

Chiếc điện thoại di động sẽ trở thành một công cụ giao dịch không thể thiếu trong thời đại mới. Cần phải nói thêm. tính tiện dụng của hệ thống đăng ký học phần SMS đã được mở rộng. đóng gói ứng dụng di động. môi trường phát triển ứng dụng J2ME. Giới thiệu CLDC và MIDP: Trình bày chi tiết về hai thành phần quan trọng của J2ME dành cho điện thoại di động. Chương 1. Với việc xây dựng thành công hệ thống đăng ký học phần qua mạng điện thoại di động.daihoc. Luận văn được trình bày thành hai phần lớp: Phần 1: Giới thiệu về lý thuyết nền tảng của J2ME.vn . phần Kết Luận). chúng tôi hi vọng trong một tương lai rất gần. Tuy nhiên. các bước cơ bản để xây dựng ứng dụng này. Chương 2. các đặc điểm và các thành phần con. Với ứng dụng này. xem lại tài khoản ngân hàng… với chiếc điện thoại di động nhỏ bé. các thư viện. chúng tôi rất tự tin về việc xây dựng các hệ thống thương mại di động lớn hơn.Java Mobile tính kết nối mạng.com. Trong tương lai gần. hiện nay ứng dụng này chỉ chạy trên chương trình giả lập. Chỉ cần có một điện thoại di động hỗ trợ GPRS các bạn sinh viên có thể đăng ký học phần ngay cả khi đang về quê ăn tết ở những vùng internet chưa phổ biến nhưng đã phủ sóng di động hay khi đang di chuyển trên tàu xe… Vì một số điều kiện đặc biệt của điện thoại. chứ không chỉ mới là lý thuyết trên giấy tờ. 3 Sưu t m b i: www. các kỹ thuật lập trình. mã hoá… mà chúng tôi đang sử dụng để xây dựng phần mềm thì ứng dụng này có thể được áp dụng rộng rãi trong thực tế cho sinh viên của khoa. Tổng quan về J2ME : Giới thiệu tổng quan về J2ME. khi các thế hệ điện thoại mới có giá thành vừa phải ra đời và hỗ trợ một số công nghệ như WebService. ứng dụng hiện tại hoàn toàn có thể sử dụng được trong thực tế Việt Nam nhưng có một số đòi hỏi về thiết bị khá đắt tiền (xin xem thêm Chương 10. thời đại của thương mại điện tử toàn cầu. Chương 3. khách hàng có thể ngồi trên taxi mua vé máy bay. Các vấn đề cơ bản của chương trình MIDlet: Chương này sẽ trình bày những đặc điểm quan trọng nhất của một ứng dụng J2ME. đặt chỗ khách sạn.

tổng kết các kết quả đạt được và hướng phát triển trong tương lai. một cơ chế lưu trữ riêng của J2ME. Chương 8.vn . Đánh giá.Java Mobile Chương 4. các phương thức vẽ. Phần 2: Giới thiệu về Web Service. game action … trong J2ME. một công nghệ rất mới để xây dựng các ứng dụng thương mại điện tử phân tán và giới thiệu chi tiết về ứng dụng cùng những đánh giá. Lưu trữ thông tin với RMS: Trình bày về Record Management System. Giới thiệu về ứng dụng phân tán và web service Chương 9. Lập trình mạng vơi GCF: Trình bày về khả năng lập trình mạng trong J2ME. Chương 6. Chương 7. xử lý font. tổng kết. Tuy đã đầu tư khá nhiều thì giờ và công sức vào luận văn này nhưng chắc chắn chúng tôi cũng không tránh khỏi những sai sót. Giao diện đồ họa cấp cao: Trình bày về thư viện đồ họa cấp cao như Form.com. TextBox… trong J2ME. Rất mong nhận được ý kiến đóng góp và sự thông cảm của quý thầy cô và các bạn! Xin chân thành cảm ơn! Kim Anh – Anh Tuấn 4 Sưu t m b i: www. List. Chương 5.daihoc. Giao diện đồ họa cấp thấp: Trình bày về lập trình đồ họa cấp thấp. Trình bày chi tiết về ứng dụng "Đăng Ký Học Phần" Chương 10.

Được giới thiệu lần đầu vào năm 1995. máy ảo Java sẽ đọc mã trung gian này và dịch ra mã máy và thực thi. nhờ vào quá trình trung gian đó một ứng dụng Java có thể chạy trên bất kỳ môi trường nào có cài đặt máy ảo Java tương thích. Java sử dụng một phương thức biên dịch mã nguồn tương đối khác so với các ngôn ngữ lập trình truyền thống. một phiên bản Java mới là J2EE (Java 2 Enterprise Edition) đã được giới thiệu nhắm tới việc phát triển các ứng dụng có qui mô lớn hơn. khả năng hiển thị và xử lý hạn chế. Ban đầu Java được xây dựng chỉ gồm một phiên bản duy nhất. điện thoại di động … 5 Sưu t m b i: www. ngày nay mục tiêu Java nhắm đến cũng đã thay đổi khá nhiều.daihoc. Bộ biên dịch Java không biên dịch mã nguồn trực tiếp sang mã máy mà biên dịch sang một dạng mã trung gian mà máy ảo Java hiểu được (mã bytecode). Java hiện nay không chỉ nhắm đến họ máy tính để bàn đơn thuần. ngày nay được biết đến với tên J2SE (Java 2 Standard Edition). run anywhere”). Java được hình thành trên ý tưởng xây dựng một ngôn ngữ mà lập trình viên chỉ cần viết một lần duy nhất nhưng ứng dụng có thể chạy trên bất cứ môi trường nào có hỗ trợ máy ảo Java (Java Virtual Machine).com. với phương châm là “viết một lần. Khi có nhu cầu sử dụng ứng dụng.vn . J2ME nhắm đến việc phát triển ứng dụng cho các ứng dụng có năng lực hạn chế như đầu giải mã kỹ thuật số TV set-top boxes.Java Mobile Phần 1: Kiến thức nền tảng J2ME Chương 1: Tổng quan về J2ME 1. Phiên bản mới nhất được thêm vào dòng ngôn ngữ Java là J2ME (Java 2 Micro Edition). Để làm được việc này. hai năm sau ngày đầu được ra mắt. chạy trên mọi môi trường” (“Write once.1 Giới thiệu J2ME (Java 2 Micro Edition) J2ME là một nhánh của ngôn ngữ lập trình JAVA được phát triển nhằm hướng tới việc lập trình cho các thiết bị “nhỏ” (micro) có bộ nhớ.

Đơn cử như chiếc điện thoại di động. dễ nắm bắt. TV… cũng ngày càng được trang bị những tính năng hiện đại hơn. Một thực tế đặt ra cho các nhà phát triển phần mềm trên các thiết bị này là hiện nay không có một chuẩn hóa nào dành cho các nhà sản xuất phần cứng. gia dụng ngày càng tăng cao và được đánh giá là một ngành công nghệ có thể đem lại nhiều tỉ đô la doanh thu.1 Các thiết bị J2ME hỗ trợ 6 Sưu t m b i: www. Hình 1. Trước thực tế đó. chặt chẽ và thích hợp cho các thiết bị có khả năng hạn chế. Các thiết bị gia dụng khác như lò vi ba. nghe nhạc. đặc biệt là điện thoại di động hầu hết đều hỗ trợ rất tốt ngôn ngữ J2ME và J2ME thực sự đã trở thành một trong những ngôn ngữ phổ biến nhất trong lãnh vực lập trình di động. “thông minh” hơn và ngày càng có nhiều tính năng nổi bật.Java Mobile 1. Các thiết bị trên thị trường hiện nay rất đa dạng và mang nhiều đặc điểm cũng như cấu hình khác nhau.2 Lý do chúng ta cần J2ME Ngày nay ngành công nghiệp sản xuất thiết bị di động trên thế giới đang phát triển nhanh chóng.daihoc. Các thiết bị di động trên thị trường hiện nay. ngày nay chúng không chỉ đơn thuần đảm nhận chức năng hội thoại mà còn có thêm nhiều chức năng như chụp ảnh. xem phim … như một “trung tâm giải trí”. Ngôn ngữ J2ME thực sự là một ngôn ngữ nhỏ gọn.vn .com. việc có thể chạy trên nhiều môi trường là một lợi thế rất lớn của ngôn ngữ Java. Các nhà phát triển Java đã cho ra đời ngôn ngữ J2ME hướng đến việc phát triển phần mềm cho các thiết bị di động. Các thiết bị di động ngày càng hiện đại hơn. Nhu cầu phát triển phần mềm cho các thiết bị di động.

Việc phân chia thành những Configurations khác nhau chủ yếu dựa vào khả năng bộ nhớ. nếu ta đưa 7 Sưu t m b i: www. Khái niệm Configuration có mối liên hệ chặt chẽ với máy ảo Java. các thiết bị di động rất khác nhau về nguồn tài nguyên. Chúng ta sẽ tìm hiểu hai khái niệm mới là Configurations và Profiles.1 Configuration: Để đáp ứng nhu cầu cho nhiều chủng loại thiết bị khác nhau. Để đáp ứng được nhu cầu khác nhau của những thiết bị này. Nói chính xác hơn. Sun đã đưa ra khái niệm Configuration.vn . Với những thiết bị có năng lực hạn chế. Như chúng ta đã biết. 1. một Configuration qui định những thành phần và những thư viện gốc của ngôn ngữ Java mà máy ảo phải hỗ trợ cho configuration đó.3.2 Các thành phần của J2ME Khái niệm thiết bị di động là tương đối rộng lớn.000 pixels). Chúng bao hàm những thiết bị có kích thước vật lý khác nhau nhiều lần và cho dù cùng kích thước những thiết bị này vẫn có khả năng xử lý cũng như hiển thị khác nhau ( những chiếc điện thoại hiển thị 12. bản thân ngôn ngữ J2ME cũng được chia thành những thành phần nhỏ hơn. năng lực hiển thị.daihoc.com.000 pixels cho đến những chiếc PDA 20. năng lực xử lý và khả năng kết nối mạng của các thiết bị.3 Các thành phần của J2ME: Hình 1. về khả năng phần cứng.Java Mobile 1.

CLDC(Connected Limited Device Configuration): • 128 kb (minimum) bộ nhớ để chạy Java • 32 kb (minimum) bộ nhớ cấp phát động. băng thông rộng. 8 Sưu t m b i: www. Công nghệ hiện nay đang phát triển khá nhanh. • Giao diện người dùng hạn chế • Năng lượng tiêu tốn ít (chủ yếu dùng pin) • Kết nối mạng Wireless.com. Hiện nay Sun đã đưa ra hai loại Configurations khác nhau: CDC (Connected Device Configuration): • 512 kb (minimum) bộ nhớ để chạy Java • 256 kb (minimum) bộ nhớ cấp phát động. chậm.daihoc. nhu cầu phân chia thành nhiều Configurations là việc cần thiết. và việc phát triển này càng làm cho ranh giới giữa các loại Configuration này trở nên không rõ ràng.vn .Java Mobile quá nhiều thư viện hỗ trợ vào máy ảo trên thiết bị đó sẽ gây chậm hệ thống và dư thừa không cần thiết. Do đó. Việc phân chia này thực chất cũng chỉ mang tính tương đối. Với những thiết bị có khả năng cao hơn. • Kết nối mạng liên tục. chúng ta sẽ đưa thêm nhiều thư viện hỗ trợ vào máy ảo giúp ích cho công việc lập trình của các nhà phát triển.

do đó nếu chỉ dùng configuration thì lập trình viên phải xây dựng tất cả các chức năng giao diện từ đầu. Profile định nghĩa các thư viện giúp lập trình viên phát triển phát triển ứng dụng cho một dạng thiết bị nào đó.daihoc.3. nhập liệu và xử lý sự kiện. lưu trữ. Profile MIDP được định nghĩa trên nền tảng của CLDC.3 Configurations và các thiết bị 1. nhưng với thị trường là các máy PDA với màn hình và bộ nhớ lớn hơn 9 Sưu t m b i: www.Java Mobile Hình 1. Ta có thể xem Profile là một mở rộng của khái niệm Configuration. Vì lý do này Sun đã linh hoạt và đưa thêm một khái niệm mới nằm ở tầng trên của configuration.… phù hợp với màn hình hiển thị và khả năng xử lý của các thiết bị di động. Ví dụ Mobile Information Device Profile (MIDP) định nghĩa các hàm API cho các thành phần giao diện.2 Profile: Configuration thực ra chỉ cung cấp một số rất ít các lớp và người phát triển ứng dụng hầu như không thể chỉ làm việc đơn thuần với các configuration này.vn . kết nối mạng và xử lý thời gian. đó là Profiles. Ngoài ra chúng ta còn một số Profile tiêu biểu khác như – PDA Profile: tương tự MIDP. Ta có thể thấy điều này qua một ví dụ: các configuration không hỗ trợ các công cụ về giao diện (GUI).com.

Game Profile.3 – Ngoài ra còn có Personal Basis Profile.3. Chúng ta có thể nói chính máy ảo Java làm cho chương trình của chúng ta “chạy”. Chính những hạn chế về tài nguyên của các thiết bị di động đã đề ra nhu cầu về sự ra đời của KVM. RMI Profile. cấp phát và thu hồi bộ nhớ và quản lý việc điều phối các tiến trình. Đến đây chúng ta có thể hình dung phần nào cấu trúc tổng thể của một chương trình J2ME như sau: 10 Sưu t m b i: www. máy ảo Java có cùng các đặc tính như J2SE.3 Máy ảo Java Như chúng ta đã biết. gọi tắt là KVM. Sun đã phát triển riêng một dạng máy ảo chuyên biệt được gọi là K Virtual Machine. Personal Profile. KVM không phải là một máy ảo Java “truyền thống”: • Máy ảo chỉ cần 40-80 kb bộ nhớ • Chỉ đòi hỏi 20-40 kb bộ nhớ động (heap) • Có thể chạy với bộ vi xử lý 16-bit và xung nhịp 25 MHz.Java Mobile – Foundation Profile: cho phép mở rộng các tính năng của CDC với phần lớn các thư viện của bộ Core Java2 1. với CLDC. Với CDC.vn . Máy ảo Java sẽ chịu trách nhiệm việc cung cấp tính năng bảo mật. 1. một chương trình Java sẽ được biên dịch thành mã trung gian sau đó chính máy ảo Java sẽ biên dịch phần mã này sang mã máy để thực thi. Luận văn chủ yếu chỉ đề cập đến Profile MIDP và các thư viện liên quan để phục vụ cho việc viết ứng dụng trên điện thoại di động.daihoc. Tuy nhiên.com.

Nếu chương trình được biên dịch với CLDC.vn . bên trên là CLDC và trên cùng là MID Profile.5 Cấu trúc chương trình MIDP Tầng dưới cùng là hệ điều hành có hỗ trợ máy ảo Java (KVM). chạy bất cứ 11 Sưu t m b i: www.4 Cấu trúc chương trình J2ME Nếu chương trình được biên dịch với CDC. Với chương trình xây dựng bởi MIDP.daihoc.Java Mobile Hình 1. chúng ta có cấu trúc chuyên biệt sau: Hình 1. Lúc này khái niệm “Viết một lần.com. chương trình sẽ chạy với máy ảo chuyên biệt KVM và những đặc tính riêng do CLDC đòi hỏi. chương trình sẽ chạy trên các máy ảo “truyền thống” và mang các đặc tính như chương trình J2SE.

daihoc. 12 Sưu t m b i: www. Tuy nhiên chúng ta phải cảm kích các nỗ lực của Sun đã giúp cho Java trở thành một trong những ngôn ngữ có khả năng độc lập với môi trường bên dưới nhất hiện nay. điều này đúng với cả môi trường thiết bị di động.com.vn .Java Mobile môi trường nào” của Sun không còn đúng hoàn toàn vì đã xuất hiện máy ảo chuyên biệt KVM. Ở những phần tiếp theo chúng ta sẽ tìm hiểu kỹ hơn về hai thành phần cơ bản của J2ME là Configuration và Profile. Một số chương trình viết bằng MIDP sẽ không chạy trên môi trường J2SE và ngược lại.

Bộ nhớ này thường được gọi là volatile memory (hay là “heap”). Nhằm mục đích phục vụ tối đa các thiết bị hiện có trên thị trường. ngay cả khi ngắt điện. Hệ điều hành phải tương thích với JVM và có chức năng quản lý các ứng dụng Java.1. CLDC chỉ đề ra các yêu cầu về bộ nhớ và không đề ra yêu cầu nào cho các thành phần khác.1. 2. bộ nhớ của thiết bị phải bảo lưu được nội dung lâu dài.3.2. Máy ảo Java: Do các thiết bị di động dùng CLDC thường có tài nguyên hạn chế nên Sun đã đề ra máy ảo Java KVM phục vụ riêng cho các thiết bị này. Bộ nhớ này thường được gọi là nonvolatile memory. CLDC 2. 13 Sưu t m b i: www.1. Yêu cầu phần cứng: Khi đề ra yêu cầu về phần cứng việc xem xét các chi tiết như bộ xử lý. bao gồm: • Cho phép chọn và kích hoạt ứng dụng • Cho phép gỡ bỏ ứng dụng khỏi thiết bị 2.com. bộ nhớ… và các phần mềm hiện có trên các thiết bị di động là việc vô cùng quan trọng.Java Mobile Chương 2: Giới thiệu CLDC và MIDP 2. Flash. Không phân biệt loại bộ nhớ sử dụng (Rom.1.vn . Máy ảo KVM thực chất là một bộ phận con của các máy ảo trên môi trường J2SE và J2EE nên cũng có nhiều hạn chế và khác biệt so với hai phiên bản trên. • 32 kilobytes bộ nhớ trống để cấp phát các đối tượng (objects). Yêu cầu tối thiểu để có thể sử dụng CLDC như sau: • 128 kilobytes để chạy JVM và các thư viện của CLDC.…). Yêu cầu phần mềm: CLDC có yêu cầu tối thiểu về mặt phần mềm.daihoc.1.

chúng ta có thể khai báo phương thức finalize (tương tự như phương thức destructor). • Không hỗ trợ ThreadGroup: mỗi thread được quản lý riêng biệt. phương thức này thường được dùng để thu hồi các tài nguyên hệ thống như sockets. mảng float. một trong những khác biệt chính là quá trình Class Verify (tạm dịch là “kiểm tra lớp”).vn . trong J2ME chúng được chia thành 2 giai đoạn: 14 Sưu t m b i: www. Quá trình này trong J2SE và J2EE có thể chiếm đến 50 kbytes bộ nhớ. file handles… trước khi đối tượng bị “phá hủy”.daihoc. • Error Handling: Trong J2ME chúng ta vẫn được hỗ trợ các công cụ về bẫy lỗi (chủ yếu thông qua try và catch). các hàm cũng không nhận tham số và trả về các số float.com. Nếu muốn điểu khiển một lúc nhiều threads chúng ta có thể dùng mảng hoặc Vector. • Phương thức finalize: Trong J2SE.Java Mobile Một số hạn chế: • Không hỗ trợ kiểu dữ liệu float: Việc sử lý số float đòi hỏi nhiều tài nguyên xử lý. Các lớp trước khi được load sẽ thông qua một quá trình “kiểm tra” về sự hợp lệ và tính nguyên vẹn. • Không hỗ trợ việc sử dụng code của các ngôn ngữ lập trình khác • Không hỗ trợ Reflection: Trong J2SE và J2EE. ngoài ra các thiết bị di động không có những cấu hình phần cứng dành riêng cho việc xứ lý số float nên trong J2ME chúng ta không thể khai báo các biến. không còn lớp ThreadGroup. Đây là một cơ chế quan trọng để bảo đảm an toàn (security) của Java. Tuy nhiên khả năng về xử lý lỗi của J2ME cũng hạn chế hơn với hai phiên bản còn lại. Garbage Collector sẽ gọi phương thức này trước khi hủy bỏ một đối tượng. J2ME cũng còn một số điểm khác biệt so với J2SE và J2EE. chúng ta có thể dùng các lớp Reflection để tìm hiểu thông số môi trường máy ảo Java đang thực thi. Tuy nhiên trong J2ME chúng ta không có phương thức finalize.

Quá trình này đòi hỏi ít bộ nhớ và tài nguyên hơn nhiều lần so với trong J2SE và J2EE.totalMemory()).getProperty("microedition.println("Free memory: " + rtime. //thông tin về bộ nhớ trống 15 Sưu t m b i: www.getProperty("microedition.println("Total memory: " + rtime.daihoc.getProperty("microedition.profiles") Ngoài ra chúng ta có thể truy cập lớp Runtime để lấy các thông số về thiết bị như: Runtime rtime= Runtime.configuration") • Lấy thông tin về Profile: System. Nếu phát hiện một lỗi nào đó bộ kiểm tra sẽ phát sinh báo cáo và từ chối nạp lớp đối tượng vào bộ nhớ.encoding") • Lấy trông tin về version và tên của configuration: System. một phần mềm sẽ được sử dụng để thêm vào một số thông số bổ sung vào file class. CLDC không hỗ trợ tất cả các lớp và thư viện được hỗ trợ trong ngôn ngữ Java truyền thống mà chỉ hỗ trợ những thư viện thật sự cần thiết đối với thiết bị di động. công cụ kiểm tra trong thiết bị sẽ thực hiện một vài kiểm tra để xác nhận tính hợp lệ của đoạn code.getProperty("microedition.vn .Java Mobile • Tiền kiểm tra (Pre-verification): Trước khi một lớp được nạp vào thiết bị. System.getRuntime().platform") • Lấy thông tin về bảng mã mặc định: System. Quá trình này giảm thời gian và bộ nhớ cần thiết để máy ảo thực hiện giai đoạn 2 trong quá trình kiểm tra.out.freeMemory()). File class sau khi được “tiền kiểm tra” sẽ tăng dung lượng khoảng 5% • Kiểm tra nội thiết bị (In-device verification): Khi thiết bị nạp các file class đã được tiền kiểm tra. //thông tin về tổng bộ nhớ System. Ngoài ra trong CLDC chúng ta cũng được hỗ trợ việc truy vấn một số thuộc tính của hệ thống: • Lấy thông tin về platform của thiết bị: System.out.com.

• Có ít nhất 128 kilobytes bộ nhớ non-volatile để chạy các thành phần của MID • Có ít nhất 8 kilobytes bộ nhớ non-volatile để lưu các cấu hình chương trình và dữ liệu • Có ít nhất 32 kilobytes để chạy Java • Có kết nối không dây (wireless network) 2. Yêu cầu phần cứng: • Màn hình ít nhất phải có 96 x 54 pixels • Có ít nhất một thiết bị nhập liệu: bàn phím hoặc màn hình cảm ứng.1.2. 2. ngắt điện).2. Yêu cầu phần mềm: Mặc dù hệ điều hành của từng thiết bị có thể khác nhau nhưng phải đáp ứng được các yêu cầu tối thiểu sau: • Hệ điều hành phải hỗ trợ việc xử lý ngắt.2.3.Java Mobile 2. Cấu trúc MID Profile: 16 Sưu t m b i: www.com.daihoc. MIDP: 2.2. • Phải hỗ trợ truy xuất mạng. đặc biệt phải có tính năng đọc/ghi dữ liệu thông qua mạng không dây (wireless network). xử lý exception và hỗ trợ xử lý đồ họa bitmap để xuất dữ liệu ra màn hình • Hệ điều hành phải nhận được tín hiệu nhập liệu (input) và chuyển dữ liệu đó cho máy ảo Java • Hệ điều hành phải hỗ trợ việc đọc/ghi vào bộ nhớ non-volatile.2. Không đòi hỏi hệ điều hành phải định nghĩa file system nhưng phải cho phép ghi dữ liệu dạng persistent (không bị mất đi khi tắt máy.vn .

Samsung. các chương trình MIDP (MIDP Applications) có thể sử dụng các lớp được cung cấp bởi cả CLDC và MIDP. chỉnh giờ… Chính nhờ J2ME ra đời chúng ta mới có chức năng cài đặt thêm các chương trình được viết thêm vào điện thoại.1 Cấu trúc thiết bị MID Tầng dưới cùng là phần cứng của thiết bị di động. 17 Sưu t m b i: www. Ngoài ra chúng ta còn có các lớp OEM (original equipment manufacturer) là các lớp do các nhà sản xuất cung cấp thêm cho điện thoại (các hãng như Nokia. Trước khi J2ME ra đời. các ứng dụng này thường chỉ chạy trên các điện thoại của hãng đã cung cấp thư viện lơp OEM. thông thường đây là loại chương trình duy nhất có trên các thiết bị.vn . CLDC là nền tảng cơ bản cho MID Profile. Bên trên hệ điều hành ta có thể chia thành 2 phần riêng biệt. chỉnh thông số điện thoại.daihoc. Đây là loại chương trình được nhà sản xuất đưa sẵn vào máy di động lúc sản xuất như chương trình chọn tiếng chuông.com. Motorola… thường có thêm nhiều lớp cấp cao hỗ trợ cho lập trình viên) và bên trên là các ứng dụng được xây dựng từ các lớp này. Chúng ta sẽ thấy phần bên phải là các chương trình native application (tạm dịch là “chương trình nguyên gốc”). Bên trên phần cứng ta có hệ điều hành điều khiển các hoạt động.Java Mobile Hình 2.

MIDlet Suite: Chúng ta gọi chương trình Java chạy trên thiết bị di động là một MIDlet.com. trong file Jar còn có một tập tin được gọi là manifest. Trong file manifest chúng ta có thể định nghĩa các thuộc tính của file jar nhưng quan trọng nhất là 6 thuộc tính sau: MIDlet-Name MIDlet-Version MIDlet-Vendor MIDlet-<n> (mỗi một MIDlet cần một mẫu thông tin này) MicroEdition-Profile MicroEdition-Configuration Nếu 1 trong 6 thông tin này thiếu thì thiết bị sẽ từ chối chạy các ứng dụng trong file Jar này. Tập tin này có tên manifest.daihoc. MIDlet sẽ sử dụng các lớp cung cấp bởi CLDC và MIDP. mẫu tin này gồm 3 mẫu tin con: Tên MIDlet Bắt buộc Có Có Có Tham chiếu đến từng MIDlet trong bộ Có 18 Sưu t m b i: www. mỗi một MIDlet cần một mẫu tin này. Bảng sau mô tả các thuộc tính có thể định nghĩa trong file manifest: Thuộc tính MIDlet-Name MIDlet-Version MIDlet-Vendor MIDlet-<n> Mục đích Tên của bộ MIDlet Số phiên bản Cho biết người tạo MIDlet Suite MIDlet (trong file Jar).mf và bản thân nó cũng được nén trong file Jar.4. Một MIDlet Suite (một bộ MIDlet) chứa một hay nhiều ứng dụng MIDlet được nén chung trong một file JAR (Java Archive). Cấu trúc file Jar: Ngoài các file lớp và resource.Java Mobile 2.vn .2. Đây là tập tin mô tả nội dung của toàn file Jar.

Todo.Java Mobile File Icon MIDlet (có thể không cần) Tên lớp sẽ được nạp khi thực thi MIDlet này MicroEditionProfile MicroEdition Configuration MIDlet-Icon MIDlet-Description MIDlet-Info-URL Tên profile cần thiết để chạy MIDlet này.jad) để cung cấp thông tin về các MIDlet trong file JAR. một bộ ứng dụng MIDlet còn có thêm file JAD (.0) File icon (.0 MicroEdition-Configuration: CLDC-1. Có thường là MIDP1.0 File JAD (Java Application Descriptor File): Bên cạnh file Jar. • Cung cấp các tham số dùng cho MIDlet để tránh thay đổi file JAR.0 hoặc MIDP2.1 Cấu trúc file manifest Đây là một ví dụ đơn giản của file manifest: MIDlet-Name: Todo List MIDlet-Version: 1.TodoMIDlet MicroEdition-Profile: MIDP-1.pgn) của bộ MIDlet Mô tả (text) của bộ MIDlet Địa chỉ trang web nhà phát triển MIDlet Bảng 2.com. /images/Todo.daihoc.png. Việc đặt ra file JAD có một số mục đích sau: • Cung cấp thông tin về nội dung file Jar.vn . Từ thông tin này. bộ quản lý ứng dụng trên thiết bị mới quyết định ứng dụng này có thích hợp để chạy trên thiết bị hay không. Không Không Không 19 Sưu t m b i: www.0 Configuration cần để chạy MIDlet (thường Có là CLDC 1. File JAR chứa mã ứng dụng nên cần tránh bị thay đổi.0 MIDlet-Vendor: Core J2ME MIDlet-1: TodoList.

daihoc.com.Java Mobile Danh sách các thuộc tính trong file Jad: Thuộc tính MIDlet-Name MIDlet-Version MIDlet-Vendor MIDlet-<n> Mục đích Tên của bộ MIDlet Số phiên bản Cho biết người tạo MIDlet Suite MIDlet (trong file Jar).2 Cấu trúc file JAD Ta cũng có thể định nghĩa thêm các thuộc tính riêng. mẫu tin này gồm 3 mẫu tin con: Tên MIDlet File Icon MIDlet (có thể không cần) Tên lớp sẽ được nạp khi thực thi MIDlet này MIDlet-Jar-URL MIDlet-Jar-Size MIDlet-Data-Size Địa chỉ URL của file Jar Kích thước file Jar tính bằng byte các dữ liệu của chương trình (persistent data) MIDlet-Description MIDlet-DeleteConfirm MIDlet-InstallNotify Bảng 2. Những thuộc tính sau phải giống nhau ở file Jad và file manifest (nằm trong file Jar): MIDlet-Name MIDlet-Version URL nhận thông báo về quá trình cài đặt Không Mô tả MIDlet (dạng text) Thông báo nhắc nhở khi xóa MIDlet Không Không Có Có Bắt buộc Có Có Có Tham chiếu đến từng MIDlet trong bộ Có Kích thước tối thiểu tính bằng byte để ghi Không 20 Sưu t m b i: www. bắt đầu bằng “MIDlet-“ tùy theo mục đích của lập trình viên.vn . mỗi một MIDlet cần một mẫu tin này.

com/TodoMIDlet.jar MIDlet-Jar-Size: 17043 MIDlet-1: TodoList.Jar và .TodoMIDlet Ở đây có một câu hỏi được đặt ra: Tại sao phải ghép nhiều ứng dụng MIDlet thành một file nén dạng JAR.daihoc.Jad. /images/Todo. Một ví dụ có thể đề cập đến là việc chia sẻ chung các Record Store: trong môi trường J2ME chúng ta không có khái niệm file system. Sau đây là một ví dụ đơn giản về file Jad: MIDlet-Name: Todo List MIDlet-Version: 1.0 MIDlet-Vendor: Core J2ME MIDlet-Jar-URL: http://www. Trong một bộ MIDlet Suite thì tên các Record phải phân biệt và các ứng dụng MIDlet cùng chung trong một bộ sẽ có thể chia sẻ các Record này với nhau.Jad sẽ là file thực thi và file . danh sách các người chơi có điểm cao nhất… Khi nạp ứng dụng vào thiết bị ta cùng lúc nạp hai file . nếu file Jad và file manifest khác nhau thì thuộc tính trong file Jad sẽ được ưu tiên hơn.Jar chứa mã thực thi của chương trình 21 Sưu t m b i: www. Với các thuộc tính còn lại. nó có thể giúp chúng ta viết các games cùng chia sẻ danh sách người chơi.vn . Điều này khá thuận lợi.corej2me. ứng dụng sẽ bị thiết bị từ chối. mọi nhu cầu lưu trữ dữ liệu được thông qua các Record.png. Mục đích của việc kết hợp này giúp cho các ứng dụng MIDlet được nén chung này có thể chia xẻ chung các tài nguyên với nhau.Java Mobile - MIDlet-Vendor MIDlet-<n> for each MIDlet MIDlet-Jar-URL Nếu các thuộc tính này không giống nhau. Todo.com. file .

com.c:\jdk\bin.vn .Java Mobile 2.com/products/jdk/ Connected.5. ta giải nén vào chung một thư mục (ví dụ C:\J2ME). Chọn System.sun.daihoc.2. 22 Sưu t m b i: www. Limited Device Configuration (CLDC): http://java.) • Cài đặt CLDC và MIDP: File CLDC và MIDP có dạng zip.sun. cách cài đặt và cấu hình các phần mềm này. chúng ta chỉ cần chạy và làm theo các hướng dẫn sẽ cài đặt thành công bộ JDK (giả sử thư mục cài đặt là C:\jdk1. version 1. – Chọn Environment (hoặc Advanced/Environment) – Tìm mục PATH.exe).42) http://java.com/products/midp/ Ghi chú: Ở đây xem Microsoft Windows như hệ điều hành mặc định được sử dụng. không cần phải gõ tên và đường dẫn đầy đủ của trình biên dịch.sun.3 hoặc cao hơn (phiên bản mới nhất tính đến lúc luận văn được thực hiện là phiên bản 1. – Vào Control Panel. Ngoài ra chúng ta sẽ nghiên cứu về các tools phát triển được hỗ trợ thêm.1) Set biến môi trường (Environment Variable): Việc set biến môi trường giúp chúng ta chạy trình biên dịch từ bất cứ vị trí nào. Để viết một ứng dụng J2ME chúng ta cần ít nhất 3 chương trình sau: Java Development Kit (JDK) .. Cài đặt các phần mềm: • Cài đặt JDK: File cài đặt JDK có dạng file thực thi (.3.com/products/cldc Mobile Information Device Profile(MIDP): http://java. thêm thư mục \bin của thư mục JDK (ví dụ C:\JDK\bin) vào biến môi trường PATH (PATH=………….. nếu người dùng sử dụng hệ điều hành khác thì phải có một số điều chỉnh phù hợp với hệ điều hành đó. Môi trường phát triển ứng dụng J2ME Phần này chúng ta sẽ tìm hiểu về các phần mềm cần thiết dùng để phát triển một ứng dụng J2ME.

Ta sẽ xây dựng một ứng dụng J2ME đơn giản để mô phỏng quá trình biên dịch và thực thi.fcs (thư mục chứa MIDP) Sau cùng ta set hai biến môi trường PATH và CLASSPATH như sau: PATH=C:\jdk1.3fcs\classes. file lớp cơ sở này khác với file của MIDP nên J2ME có thể không sử dụng được. file lớp cơ sở của JDK sẽ được sử dụng.daihoc.1\bin. thông số -bootclasspath ra lệnh cho chương trình dich lấy các file lớp cơ sở tại thư mục c:\j2me\midp1. chúng ta giả sử thư mục chứa mã nguồn là thư mục C:\Midlets. ứng dụng có tên Welcome và file source code có tên Welcome.java • Quá trình biên dịch và Pre-verify: Để biên dịch ta chuyển đến thư mục chứa ứng dụng (C:\Midlets\Welcome\) và gọi lệnh: javac -bootclasspath c:\j2me\midp1..1.Java Mobile Thư mục J2ME có dạng: C:\J2ME j2me_cldc (thư mục chứa CLDC) midp1. Quá trình biên dịch và thực thi ứng dụng J2ME phải qua một số thao tác bằng dòng lệnh (command lines).0.3.vn . CLASSPATH=C:\j2me\midp1.com.3.) Javac là chương trình biên dịch của bộ JDK.0.C:\j2me\j2me_cldc\bin.0.0. (dấu ". Chúng ta có nhiều công cụ hỗ trợ cho quá trình biên dịch và thực thi MIDlet nhưng ban đầu chúng ta sẽ tìm hiểu cách sử dụng những công cụ cơ bản nhất và là công cụ chuẩn của J2ME.C:\j2me\midp1.fcs\classes.3fcs\classes Welcome.0..java C:\Midlets\Welcome\Welcome.3fcs\classes (Đây là file lớp cơ sở của MIDP).3fcs\bin.0." chỉ thư mục hiện hành) Lúc này ta đã đủ công cụ để xây dựng ứng dụng J2ME. Nếu không có thông số này.java hoặc javac –bootclasspath %CLASSPATH% Welcome. 23 Sưu t m b i: www.java (CLASSPATH là biến môi trường đã được định nghĩa trước thay cho c:\j2me\midp1.

Để tiết kiệm thời gian.0. Quá trình Pre-verify này là bắt buộc. Thông số -d chỉ ra thư mục output kết quả là thư mục hiện hành. Ta thực thi dòng lệnh: preverify -classpath c:\j2me\midp1. tên ứng dụng là Welcome (file Welcome.daihoc.3fcs\classes và thư mục hiện hành (dấu “. nếu không thực hiện công đoạn này thiết bị di động sẽ từ chối thực thi ứng dụng • Thực thi ứng dụng MIDlet: Ta thực thi câu lệnh: midp -classpath .vn .com. -d . Sau khi có file class ta cần thực hiện việc “pre-verify” (đã được đề cập ở phần trước của luận văn). Welcome Tương tự.. 24 Sưu t m b i: www. để sử dụng những tính năng cao hơn (tạo MIDlet Suite chứa nhiều MIDlet. tạo file Jad. ở đây là thư mục hiện hành.Java Mobile Sau quá trình này file Welcome. chúng ta thường dùng các công cụ tiện ích như Sun Wireless Toolkit. Welcome Thông số class path chỉ ra thư mục chứa file cần thực thi.0.class đã được pre – verify). file Jar) xin vui lòng xem file hướng dẫn trong đĩa CD đính kèm hoặc xem tài liệu của các bộ biên dịch. Trên đây là quá trình cơ bản nhất để biên dịch và thực thi một ứng dụng J2ME. xin xem phần phụ lục để biết cách sử dụng.class sẽ được tạo ra và mặc địch ở chung thư mục với file mã nguồn. Welcome hoặc preverify –classpath %CLASSPATH% –d . thông số classpath chỉ ra vị chí các file class tại thư mục c:\j2me\midp1.3fcs\classes.”).

Không giống như chương trình trên máy PC. Một chương trình MIDlet khi được nạp vào thiết bị có những trạng thái sau: – Paused: Một chương trình MIDlet sẽ được đưa vào trạng thái paused sau khi thực hiện phương thức khởi tạo (constructor) và trước khi được chương trình quản lý ứng dụng (application manager) trên thiết bị gọi thực thi. các chương trình MIDlet không cần hàm main() để thực thi.Java Mobile Chương 3: Các vấn đề cơ bản của chương trình MIDlet 3. Các chương trình MIDlet này đều được kế thừa từ lớp MIDlet. chương trình MIDlet cũng có thể bị đưa trở lại trạng thái paused bởi thiết bị (khi cần trả lời cuộc gọi đến …) hoặc bởi chính chương trình MIDlet.daihoc. – Active: Chương trình MIDlet đang thực thi. – Destroyed: Chương trình MIDlet đã giải phóng tất cả tài nguyên và đã được tắt bởi trình quản lý ứng dụng trên thiết bị. pauseApp() và destroyApp(). Lớp này thực chất là một interface và chúng ta phải khai báo ba hàm sau đây: startApp().com. Cấu trúc cơ bản: Chúng ta gọi chung các chương trình J2ME là MIDlet. 3. Trước hết chúng ta sẽ xem xét về “vòng đời” (lifecycle) của các ứng dụng MIDlet. Trong quá trình hoạt động.1. Đây là một ví dụ về một chương trình MIDlet đơn giản: public class Shell extends MIDlet { 25 Sưu t m b i: www.vn . Xây dựng một ứng dụng MIDlet: Chúng ta xây dựng một ứng dụng MIDlet bằng cách kế thừa (extends) lớp MIDlet.2.

microedition.daihoc.vn .midlet Sau đây là danh sách các hàm thường dùng trong lớp MIDlet: Phương thức: abstract void destroyApp (boolean unconditional) abstract void pauseApp() Mô tả: Hàm này được gọi khi có nhu cầu tắt MIDlet. Lớp MIDlet: Như đã đề cập. protected abstract void pauseApp(). Đây là nơi giải phóng các tài nguyên đã dùng.3. mọi ứng dụng của ta đều kế thừa từ lớp MIDlet. Hàm này được gọi để giải phóng các tài nguyên 26 Sưu t m b i: www. Lớp MIDlet được chứa trong package javax. Lơp này được khai báo như sau: public abstract class MIDlet { … protected abstract void startApp() throws MIDletStateChangeException.Java Mobile // phương thức khởi tạo (constructor) không bắt buộc phải có public Shell(){ … } // Được application manager gọi trước khi thực thi MIDlet public void startApp(){…} // Được gọi trước khi tạm dừng MIDlet public void pauseApp(){ …} // Được gọi trước khi kết thúc chương trình public void destroyApp(boolean unconditional){… } } 3. protected abstract void destroyApp(boolean unconditional) throws MIDletStateChangeException. } Ba hàm được nêu ở trên là ba hàm bắt buộc chúng ta phải xây dựng khi tạo ứng dụng MIDlet.com.

com. Bảng 3. final String getAppProperty (String key) Lấy các thông số của chương trình (từ file jad và file manifest). abstract void startApp() final void notifyDestroyed() Được gọi khi MIDlet sắp được đưa vào trạng thái thực thi (active state).daihoc. (Sau đó application manager sẽ gọi startApp).1 Lớp MIDlet Ở đây chúng tôi xin mô tả hai quá trình quan trọng nhất của một ứng dụng MIDlet là quá trình khởi nạp và quá trình thoát ứng dụng: – Quá trình nạp: • User chọn kích hoạt ứng dụng MIDlet • Application manager khởi tạo các biến.vn . Thực chất hàm startApp() sẽ được gọi mỗi khi ứng dụng được đưa vào trạng thái thực thi (active). khi ta tạm ngưng ứng dụng và có nhu cầu kích hoạt trở lại hàm này cũng được gọi. • Application manager gọi hàm startApp(). – Quá trình thoát: • User chọn thoát chương trình 27 Sưu t m b i: www. • Ứng dụng MIDlet sau khi được nạp vào bộ nhớ sẽ được đưa vào trạng thái paused (nhưng hàm pauseApp() sẽ không được gọi). (sau khi gọi destroyApp) final void notifyPause() Báo cho application manager biết chương trình MIDlet đã giải phóng tài nguyên và muốn vào trạng thái tạm dừng (sau khi gọi pauseApp) final void resumeRequest() Báo cho application manager ta cần đưa MIDlet vào trạng thái hoạt động trở lại. gọi phương thức khởi tạo (constructor). Báo cho application manager biết chương trình MIDlet đã giải phóng tài nguyên và cần được tắt.Java Mobile trước khi tạm dừng chương trình.

Chúng ta sẽ xem xét một số hàm quan trọng nhất của lớp Display: 28 Sưu t m b i: www. Ta xem xét hàm destroyApp(boolean condition): Tham số condition ở đây có một ý nghĩa khá thú vị. 3. nếu tham số này là true dù chúng ta có phát sinh exception MIDletStateChangeException thì ứng dụng vẫn thoát. Trong quá trình thoát.lcdui. ví dụ như khi chúng ta thoát mà chương trình đang nhận dữ liệu hết sức quan trọng từ network ta có thể phát sinh exception để dừng việc thoát. • Hàm notifyDestroyed() được gọi để báo cho application manager ứng dụng đã giải phóng hết tài nguyên và sẵn sàng bị tắt. Như chúng ta đã biết. hàm này phải bảo đảm việc giải phóng tài nguyên. Lớp MIDletStateChangeException: Khi tìm hiểu về package javax. còn một lớp quan trọng chúng ta phải chú ý đến là lớp MIDletStateChangeException.Java Mobile • Hàm destroyApp() được gọi.midlet. Nếu trong quá trình gọi hàm này dẫn đến phát sinh lỗi (thiết bị hết tài nguyên.daihoc.4. Việc này trong một ứng dụng MIDlet do một đối tượng thuộc lớp display đảm nhiệm. Lớp này nằm trong package javax. 3.5. chỉ khi nào tham số này là false thì exception MIDletStateChangeException mới có khả năng hủy việc thoát chương trình. Ứng dụng MIDlet có hai hàm có khả năng tạo ra (throw) Exception này là hàm destroyApp() và hàm startApp(). package này chứa hầu như tất cả các lớp phục vụ cho việc phát triển giao diện của ứng dụng.microedition. trước khi ứng dụng được đưa vào trạng thái active thì hàm startApp() sẽ được gọi. hàm destroyApp() cũng có thể phát sinh exception này.microedition.vn . Display Ứng dụng của chúng ta chắc chắn có nhu cầu xuất dữ liệu ra màn hình. tài nguyên cần dùng đang bị ứng dụng khác chiếm…) thì MIDletStateChangeException sẽ được tạo ra.com.

TextBox.).daihoc.Java Mobile Phương thức: static Display getDisplay(MIDlet m) Displayable getCurrent() void setCurrent (Alert alert.2 Lớp Display Một MIDlet sẽ có một và chỉ một đối tượng Display để điều khiển việc thể hiện dữ liệu.Screen… Ta xét ví dụ sau: public class Vidu extends MIDlet { Form mainForm. Tham số đầu vào là một MIDlet. Canvas. Displayable nextDisplayable) void setCurrent (Displayable nextDisplayable) boolean isColor() int numColors() Mô tả: Lấy đối tượng Display của MIDlet Lấy đối tượng Displayable hiện thời (sẽ đề cập sau) Tạo đối tượng alert (sẽ đề cập sau) Cho biết thiết bị có hỗ trợ màu hay không? Có bao nhiêu màu được hỗ trợ? Bảng 3.vn . Thực ra công dụng chính của Display là cho phép hiển thị đối tượng nào lên màn hình hiện thời. ở đây chúng ta gọi hàm từ lớp kế thừa từ MIDlet nên có thể truyền vào con trỏ this. Ví dụ: Display display=Display. Các đối tượng có thể hiển thị lên màn hình là các đối tượng thuộc lớp Displayable (sẽ được giới thiệu sau). ví dụ như form. Đối tượng Display không có phương thức khởi tạo mà được khởi tạo trực tiếp từ phương thức static của lớp. } 29 Sưu t m b i: www. Vidu{ mainForm=new Form(…….com.getDisplay(this).

trong phương thức này ta chọn Form mainForm để thể hiện lên màn hình bằng lệnh setCurrent.com. Khi ứng dụng bị tạm ngưng (paused) và phục hồi trở lại (resume) thì hàm startApp() cũng được gọi và form lại được thể hiện trên màn hình. đây là các đối tượng có khả năng hiển thị thông tin lên màn hình thiết bị.6. Cụ thể chúng được định nghĩa như sau: abstract public class Displayable. sau khi ứng dụng MIDlet được nạp vào bộ nhớ constructor được gọi để tạo form. 30 Sưu t m b i: www.getDisplay(this). Lớp Displayable: Như đã đề cập.vn . phương thức startApp() được gọi. Như tên của lớp Displayable cho chúng ta thấy. Đến đây chúng ta có thể hình dung được phần nào tác dụng của đối tượng Display.setCurrent(mainFrom). public abstract class Screen extends Displayable. Lớp Displayable bao gồm 2 lớp con là lớp Screen và lớp Canvas. ………. Display. } Ban đầu ta khởi tạo một form để thể hiện lên màn hình.Java Mobile public void startApp() { ……… Display display=Display. 3. Sau đó. một ứng dụng MIDlet chỉ có một đối tượng Display duy nhất và đối tượng Display này dùng để thể hiện các đối tượng Displayable lên màn hình. } …………………………. public abstract class Canvas extends Displayable.daihoc.

Ở những phần sau chúng ta sẽ tìm hiểu kỹ hơn về các lớp giao diện ở cấp thấp lẫn cấp cao. Để viết các ứng dụng đồ họa ta thường kế thừa từ lớp Canvas: public class GameScreen extends Canvas { draw images. shapes.vn . List.daihoc. xử lý màu sắc và chủ yếu dùng trong quá trình viết games. text … } Khi xây dựng các ứng dụng tiện ích (ít dùng đến các chức năng đồ họa) ta sẽ dùng các lớp đồ họa cấp cao như Form. Đây là những lớp giao diện cấp cao (vì phần lớn các công việc thể hiện của các lớp này đã được cài đặt sẵn). các lớp này cho phép chúng ta xử lý các giao tác đồ họa ở tầng dưới.com. Các hàm chính của lớp Displayable: Phương thức: void addCommand(Command cmd) void removeCommand (Command cmd) void setCommandListener (CommandListener l) Mô tả: Thêm một đối tượng Command vào đối tượng Displayable Xóa bỏ một đối tượng Command từ đối tượng Displayable Thêm CommandListener vào đối tượng Displayble 31 Sưu t m b i: www. Các đối tượng của lớp Canvas được gọi là những đối tượng đồ họa cấp thấp. TextBox … hoặc kế thừa từ các lớp này.Java Mobile Lớp Screen còn được chia thành những lớp con nhỏ hơn như: TextBox. Form và Alert. * Tạo một đối tượng Displayable: Thông thường chúng ta không tạo trực tiếp một đối tượng thuộc lớp Displayable mà sử dụng các lớp con của nó.

notifyDestroyed(). Ví dụ như sau: public void commandAction(Command c. Quản lý các sự kiện (event) Ngày nay.3 Lớp Displayable *Ghi chú: Các đối tượng Command và CommandListener sẽ được đề cập chi tiết ở phần sau. ứng dụng của chúng ta phải cài đặt hàm commandAction. 32 Sưu t m b i: www. Tại thời điểm này chúng ta có thể hình dung một Command như một nút ấn điều khiển trong ứng dụng của chúng ta.daihoc. Có thể nói.7. Quá trình xử lý các sự kiện phát sinh bao gồm 3 quá trình cơ bản: • Phần cứng (thiết bị di động) phải cảm nhận được khi có một sự kiện phát sinh: người dùng ấn một phím. CommandListener có tác dụng chuyển các sự kiện khi người dùng kích hoạt một Command đến lớp xử lý của ứng dụng. Để “bắt” được các sự kiện được chuyển tới khi người dùng kích hoạt một Command. do đó việc quản lý các sự kiện phát sinh là một vấn đề mà bất cứ phần mềm nào cũng phải thực hiện. } } 3. việc xử lý sự kiện là một trong những vấn đề cơ bản nhất của một chương trình. trong thế giới phần mềm ngày nay không một chương trình nào lại không có khả năng tương tác với người dùng. một cable được cắm vào hay rút ra.com. Displayable s) { if (c == cmExit) { destroyApp(true).Java Mobile boolean isShown() Kiểm tra đối tượng Displayable có được thể hiện trên thiết bị hay không? Bảng 3.vn .

bắt đầu từ đây là công việc của những lập trình viên J2ME.com. Trong J2ME hỗ trợ sẵn cho chúng ta 2 listener là CommandListener và ItemStateListener.7. khi ta chọn nút này thì sẽ phát sinh một sự kiện tương ứng.daihoc. Tùy theo các thông tin về sự kiện mà chúng ta phải đưa ra các giải pháp thích hợp Trong phần này chúng ta sẽ chỉ nghiên cứu về các sự kiện được phát sinh ở những ứng dụng sử dụng các chức năng đồ họa ở mức cao (Form. Thực chất để nhận được thông báo từ hệ điều hành về các sự kiện phát sinh lớp ứng dụng chính của chúng ta phải cài đặt (implement) các “listener”. Lớp CommandListener có hàm commandListener() và tương ứng lớp ItemStateListener có hàm itemStateChange(). Trước khi đi sâu vào xử lý các sự kiện chúng ta sẽ tìm hiểu 2 tác nhân chính phát sinh một sự kiện là Command và Item.vn .1. Nói một cách đơn giản nhất thì command như một nút ấn (button) trên ứng dụng di động. Command & CommandListener Ta định nghĩa Command là một đối tượng giữ thông tin về một sự kiện (Event). còn các sự kiện phát sinh ở những ứng dụng sử dụng các thư viện đồ họa ở mức thấp như các games sẽ được đề cập sau. 33 Sưu t m b i: www. 3.Java Mobile • Phần mềm trên thiết bị (hệ điều hành) phải nhận biết được có sự kiện phát sinh • Hệ điều hành chuyển thông tin về sự kiện cho ứng dụng. TextBox…). đây là 2 hàm chúng ta cần cài đặt để nhận biết các sự kiện xảy ra.

TextBox hay Alert… (các đối tượng displayable) • Thêm một listener vào các Form hay TextBox … trên. Nếu chúng ta xem xét các hạn chế về kích thước về màn hình và số lượng nút ấn có trên thiết bị thì vấn đề sẽ trở nên phức tạp hơn. Trước tiên. Khi phát hiện một event được kích hoạt. có những form số lượng command có thể nhiều hơn số nút ấn chức năng trên thiết bị. Việc xem một Command tương ứng với một nút ấn trên thiết bị là một quan niệm nhằm đơn giản hóa vấn đề nhưng không hoàn toàn chính xác. Sau đây là một đoạn code ví dụ: public class TestCommand extends MIDlet implements CommandListener { 34 Sưu t m b i: www.com. ta sẽ tìm hiểu các công việc phải làm để thêm một command vào ứng dụng: • Tạo một command để lưu giữ thông tin về event • Thêm command này vào Form.daihoc. lúc này các command được tổ chức theo dạng menu.vn .Java Mobile Hình 3. bộ listener sẽ gọi hàm commandListener() và truyền các thông tin về event làm thông số cho hàm.1 Command Exit Trong ví dụ trên ta thấy Command “Exit” tương ứng với một nút ấn trên điện thoại.

Khi chúng ta tạo một Command có ba thông số cần cung cấp: 35 Sưu t m b i: www. Điểm quan trọng cần chú ý là lớp ứng dụng của ta phải cài đặt một bộ listener (trong ví dụ trên ta implements CommandListener) và phải cung cấp hàm commandListener để xử lý các events. fmMain. // Tạo một form private Command cmExit.addCommand(cmExit). // Thêm bộ listener cho form .com. // Thêm command vào form fmMain. } } } Qua ví dụ trên ta thấy việc tạo một command và xử lý nó tương đối đơn giản. Displayable s) { if (c == cmExit)//nếu là command exit.. notifyDestroyed().daihoc.setCommandListener(this). fmMain = new Form("Core J2ME").. // Khởi tạo form cmExit = new Command("Exit".. 1). Command. //hàm dùng để bắt các sự kiện public void commandAction(Command c.. thoát chương trình { destroyApp(true).. // Tạo một command để thoát khỏi ứng dụng .EXIT.Java Mobile private Form fmMain..vn . // Khởi tạo command .

Như trong hình 3. Nếu thiết bị không có nút help.vn . thông số này không có ý nghĩa và command được đối xử như các command thông thường. Thông số type chỉ giúp việc ánh xạ các nút soft-button được dễ dàng. “Exit” là nhãn của command.daihoc.2 Command Label Type: Thật thuận tiện nếu ta có thể ánh xạ một command với một nút trên thiết bị (ta gọi là “soft-button”). Tuy nhiên. ta cần lưu ý khi ta tặt type là Command. Như trong hình 3. Hình 3. Thông số Type giúp chúng ta làm chuyện này: Ta chọn Command. Giả sử ta có một command tên help và ánh xạ được với HELP Button trên thiết bị thì thật trực quan và dễ dàng cho người dùng.2.3 Ánh xạ soft-button 36 Sưu t m b i: www.com.HELP.HELP thì không có nghĩa khi ta chọn command này các hướng dẫn sẽ được phát sinh mà ta cần phải làm việc này trong hàm commandAction().Java Mobile Label: Đoạn văn bản được xem như nhãn của command. Hình 3.1. ta thấy đây cũng là label của command nhưng được thể hiện ở dạng khác: dạng menu.

3). Việc thể hiện các command sẽ tùy vào từng thiết bị (sẽ có các ví dụ) STOP Dừng một công việc đang thực hiện.lcdui). các type chỉ có ý nghĩa khi thiết bị có một nút tương ứng dành riêng cho type này (như nút help của thiết bị hình 3. Bảng 3. int cmdType. Dùng để hủy công việc đang thực hiện Dùng để thoát chương trình Cung cấp thông tin trợ giúp Dùng để ánh xạ một Command với một item trên màn hình. Hình 3. khi chọn một item ta có thể gắn item này với một command để phát sinh một sự kiện nào đó. dùng để sắp xếp các command từ trên xuống dưới hay trái sang phải khi được thể hiện chung dạng menu.4 Các Command Type Như đã đề cập. Thông thường thiết bị không có các soft button tương ứng với các command dạng này. int priority) int getCommandType() bên trên Cho biết Type của Command Ý nghĩa Hàm khởi tạo.2 thể hiện command Upload có độ ưu tiên cao hơn command Download. Giá trị này càng cao thì độ ưu tiên càng thấp.Command Cú pháp Command (String label. Giả sử khi ta dùng giao diện List. OK SCREEN Xác nhận một yêu cầu nào đó hoặc thoát khỏi màn hình thông báo.daihoc.vn . Lớp javax.Java Mobile Các type được hỗ trợ: Giá trị BACK CANCEL EXIT HELP ITEM Mô tả Dùng để đi ngược lại màn hình trước đó.microedition.lcdui. Priority: Độ ưu tiên. Sau đây là các hàm chính của lớp Command và CommandListener (hai lớp này nằm trong package javax. các thông số đã được trình bày 37 Sưu t m b i: www.com.microedition.

DateField.5 Command và CommandListener 3. Hiện tại MIDP hỗ trợ các loại Items sau: ChoiceGroup. để xử lý được các sự kiện phát sinh ta phải cài đặt một Listener (ở đây là ItemStateListener).CommandListener Được gọi khi command c nằm trên đối tượng Displayable d phát sinh một sự kiện Bảng 3. Chúng ta cài đặt một listener trong lớp Form.7. Item và ItemStateListener Sự kiện (event) không chỉ được phát sinh thông qua kích hoạt commands mà còn có thể được phát sinh thông qua các items. Ở đây có một luật được đề ra: 38 Sưu t m b i: www. khác với Commands có thể được sử dụng trong Form.com. DateField.daihoc.vn . ImageItem. Khi chúng ta thêm một Item vào Form. Gauge. Sự kiện này sẽ kích hoạt hàm itemStateChanged() được chúng ta cài đặt.lcdui. Gauge và TextField là các dạng khác nhau của Item và mỗi dạng đều có thể phát sinh các sự kiện (chúng ta sẽ tìm hiểu về các items này trong phần Đồ Họa Cấp Cao). Displayable d) Cho biết Label của Command Cho biết độ ưu tiên Lớp javax. List và Canvas. StringItem và TextField.Java Mobile int getLabel() int getPriority() void commandAction(Command c. Khi có một thay đổi trên Item (ví dụ như ta chọn một mục trong ChoiceGroup hay thay đổi dữ liệu của một DateField) thì đối tượng listener sẽ được thông báo có một sự kiện phát sinh cùng các thông tin về sự kiện này. ChoiceGroup. Một item là một bộ phận có thể gắn kèm lên trên các form. Items chỉ có thể được sử dụng như một thành phần của form. TextBox. khi một Item phát sinh sẽ kích hoạt hàm itemStateChanged(). tuy nhiên không phải khi chúng ta thay đổi giá trị nhiều items cùng lúc thì itemStateChanged() sẽ được gọi đủ bấy nhiêu lần.2. Ở đây có một ngoại lệ là hai loại StringItem và ImageItem không hỗ trợ phát sinh sự kiện mặc dù chúng là lớp con của lớp Item.microedition.

Item Cú pháp String getLabel() void setLabel(String label) void itemStateChanged(Item item) Lấy nhãn của Item Đặt nhãn cho label Được gọi khi giá trị item thay đổi Ý nghĩa Lớp javax.Java Mobile • Nếu một Item bị thay đổi.ItemStateListener Bảng 3. Sau đây là các hàm quan trọng khi sử dụng Item: Lớp javax.microedition.com.lcdui. • Nếu chính bản thân MIDlet thay đổi giá trị một Item (giả sử chúng ta dùng mã lệnh để thay đổi chứ không phải do người dùng).vn .lcdui. hàm itemStateChanged() phải được gọi đối với Item này trước khi những thay đổi trên những Item sau đó được nhận biết.6 Item và ItemStateListener 39 Sưu t m b i: www. hàm itemStateChanged() không được gọi. • Nếu thiết bị nhận biết được người dùng chuyển từ Item này sang Item khác (chuyển focus) thì hàm itemStateChanged() phải được gọi trước khi chuyển sang Item kế tiếp.daihoc.microedition.

alert.. Trong đó.Java Mobile Chương 4: Giao diện đồ họa cấp cao MIDP hỗ trợ thiết kế giao diện dưới hai cấp độ: • Giao diện cấp cao (high-level interfaces): chủ yếu dùng cho các chương trình ứng dụng.. Hình 4. choicegroup. Người viết chương trình chỉ cần gọi các phương thức hiển thị đã được cung cấp mà không cần quan tâm đến các phương thức đồ hoạ đã được sử dụng bên dưới. Các lớp đồ hoạ ở cấp độ này cung cấp các phương thức vẽ trực tiếp các đối tượng đồ hoạ (như điểm.1 Sơ đồ các lớp giao diện đồ hoạ 40 Sưu t m b i: www. Ở cấp độ này. đường tròn.com. Tất cả các lớp hỗ trợ đồ hoạ được đóng gói trong package javax. • Giao diện cấp thấp (low-level interfaces): chủ yếu sử dụng trong các chương trình games. đường thẳng. MIDP cung cấp sẵn các thành phần giao diện thường dùng (như textbox.daihoc.microedition..vn .. lớp Screen và các lớp kế thừa từ nó là các thành phần giao diện cấp cao.cldui. lớp Canvas thuộc phần giao diện cấp thấp.)lên màn hình và bắt sự kiện phím bấm.) và hỗ trợ việc hiển thị các thành phần giao diện này lên màn hình thiết bị.

Java Mobile public class Display public abstract class Displayable public abstract class Screen extends Displayable public abstract class TextBox extends Screen public abstract class List extends Screen public abstract class Item public class ChoiceGroup extends Item implements Choice public class DateField extends Item public class TextField extends Item public class Gauge extends Item public class ImageItem extends Item public class StringItem extends Item pubilc abstract class Canvas extends Displayable public class Command public class Ticker public class Graphics public interface Choice 41 Sưu t m b i: www.vn .com.daihoc.

vn .daihoc. List. Các phương thức và chức năng tương ứng của lớp Screen: Lớp Screen: javax. Lớp Screen cũng định nghĩa sẵn một đối tượng Ticker kết buộc với nó. Screen: Lớp Screen không được sử dụng trực tiếp như một đối tượng trong chương trình mà các lớp con của nó (Textbox.Screen Phương thức String getTitle () void setTitle (String s) Ticker getTicker () void setTicker (Ticker ticker) Chức năng Lấy tiêu đề của Screen Gán tiêu đề cho Screen Lấy biến Ticker của Screen Gán biến Ticker cho Screen Bảng 4.lcdui.com.1 Lớp Screen 42 Sưu t m b i: www. Tại một thời điểm chỉ có duy nhất một đối tượng thuộc một trong các lớp này hiển thị trên màn hình.1. Alert.Java Mobile 4. Đối tượng này thể hiện một chuỗi ký tự tự động cuộn liên tục từ phải sang trái màn hình.microedition. Form) mới là các thành phần hiển thị trên màn hình. Đây là điểm khác biệt khi so sánh với các lớp con của lớp Item sau này.

Các phương thức và chức năng tương ứng của lớp Form: Lớp Form: javax. ImageItem. ta sẽ nhận được một giá trị trả về tương ứng với chỉ mục của thành phần đó trong Form. ChoiceGroup. Item item) Chức năng Khởi tạo một Form Khởi tạo một Form và thêm các Item vào Form Thêm một biến Image vào Form Thêm một biến Item vào Form Thêm một biến String vào Form Xoá một Item khi biết chỉ mục của nó Chèn một Item vào vị trí chỉ mục cho trước Lấy một biến Item khi biết chỉ mục của nó Thay biến Item ở chỉ mục cho trước bằng biến Item mới 43 Sưu t m b i: www.một đối tượng thuộc lớp con của Item . ta có thể tham chiếu đến thành phần này khi cần tra cứu hay thay đổi thông tin đối tượng. ta chỉ cần tạo một đối tượng thuộc lớp Form và gắn vào đối tượng này một hay nhiều đối tượng thuộc lớp con của lớp Item (TextField. StringItem).Java Mobile 4. ta chỉ có thể hiển thị một đối tượng duy nhất tại một thời điểm thì khi sử dụng Form.2. Khi gắn một đối tượng thành phần . Nếu khi sử dụng Texbox. Form: Form là lớp thông dụng nhất trong các đối tượng Displayable.lcdui. Để làm được điều này. sửa các thành phần trong Form một cách dễ dàng. Lớp Form cũng hỗ trợ sẵn chức năng cuộn màn hình nếu thiết bị không hiển thị hết tất cả các Item trong một màn hình.vào Form. Lớp Form hỗ trợ sẵn các phương thức thêm. chúng ta có thể hiển thị nhiều đối tượng có chức năng tương tự tại cùng một thời điểm. Item item) Item getItem (int ItemNum) void set (int itemNum. Gauge.com. List. Với chỉ mục này. DateField.vn .microedition.Form Phương thức Form (String title) Form (String title. xoá. Item[] items) int append (Image image) int append (Item item) int append (String string) void delete (int itemNum) void insert (int itemNum.daihoc. Alert.

2 Lớp Form 44 Sưu t m b i: www.Java Mobile void setItemStateListener( ItemStateListener iListener) int size () Thêm biến Listener vào Form Lấy số Item trong Form Bảng 4.daihoc.vn .com.

Item Phương thức String getLabel () void setLabel (String label) Chức năng Lấy nhãn của Item Gán nhãn cho Item Bảng 4.lcdui. Vd: tạo 1 DateField cho Form và gắn biến listener để bắt sự kiện: private Form fmMain. DateField.. private DateField fdToday. ta chỉ cần kết buộc Item đó với 1 biến listener thuộc lớp ItemStateListener. Item thường được dùng chung với lớp ItemStateListener.3...vn .Java Mobile 4.microedition.DATE).com.daihoc. Trong phương thức này. Các lớp con của Item gồm: ChoiceGroup. Biến listener này sẽ lắng nghe các sự kiện và tự gọi phương thức itemStateChanged() khi Item kết buộc với nó có sự thay đổi. fmMain = new Form (“Core J2ME”). dfToday = new DateField (“Today: ”.3 Lớp Item 45 Sưu t m b i: www. ImageItem và StringItem. TextField. . Gauge. Khi muốn bắt sự kiện của 1 Item. public void itemStateChanged(Item item) { if (item == dfToday) //xử lý } Các phương thức và chức năng tương ứng của lớp Item: Lớp Item: javax. Item: Một Item là một thành phần có thể thêm vào Form.. . DateField. ta có thể viết xử lý cho các sự kiện cần bắt của Item.

vn .Date Phương thức DateField (String label.1. Giao diện DateField dễ dùng.3.com.util.4 Lớp DateField Có thể chọn 1 trong 3 kiểu nhập liệu cho đối tượng DateField: • DATE: chỉ cho phép người dùng thay đổi giá trị ngày tháng • TIME: chỉ cho phép người dùng thay đổi giá trị giờ phút 46 Sưu t m b i: www. khi tạo mới một đối tượng DateField. DateField: Dùng để hiển thị một đối tượng ngày giờ (java.2 Giao diện đối tượng DateField Các phương thức và chức năng tương ứng của lớp DateField: Lớp DateField: javax.lcdui. Khởi tạo một đối tượng DateField với múi giờ cho trước Lấy giá trị ngày tháng của đối tượng Gán giá trị ngày tháng của đối tượng Lấy thông tin kiểu nhập liệu Gán kiểu nhập liệu Bảng 4. int mode) DateField (String label.daihoc. giờ phút hay cả hai : Hình 4. int TimeZone timeZone) Date getDate () void setDate (Date date) int getInputMode () void setInputMode () Chức năng Khởi tạo một đối tượng DateField mode. ta có thể lựa chọn cho phép người dùng chỉ thay đổi giá trị ngày tháng.Date) và cho phép người dùng thay đổi giá trị ngày giờ này bằng các phím bấm của thiết bị di động.Java Mobile 4.microedition.

getDate(). //gán ngày tháng hiện thời cho biến dfDate dfDate.DATE)..setDate(new Date()).Java Mobile • DATE_TIME: cho phép người dùng thay đổi giá trị cả ngày tháng lẫn giờ phút VD: //tạo 1 biến DateField cho phép người dùng nhập ngày tháng DateField dfDate = new DateField(“Ngay thang”.DATE_TIME)..setInputMode(DateField.com. 47 Sưu t m b i: www. //lấy thông tin ngày tháng của biến dfDate (thường để lấy giá trị mới mà người dùng vừa nhập ) Date dNewDate=new Date.DateField. //cho phép người dùng thay đổi thông tin ngày tháng và giờ phút dfDate. .. dNewDate=dfDate.vn .daihoc.

) hoặc cấp độ từ thấp đến cao (của âm lượng.Java Mobile 4. Hình 4. 48 Sưu t m b i: www.3.2.vn . Gauge đặc trưng bởi hai giá trị: giá trị hiện hành và giá trị cực đại cho phép. Gauge gồm hai dạng: • Chế độ tương tác (Interactive mode): Trong chế độ này. đối tượng Gauge sẽ được vẽ dạng các thanh song song có chiều cao tăng dần biểu thị các cấp độ từ thấp đến cao...). Giá trị hiện hành này luôn được duy trì giữa 0 và giá trị cực đại. Người sử dụng có thể điều chỉnh giá trị hiện thời của Gauge bằng các phím bấm. độ khó. người dùng không được phép thay đổi giá trị của nó. upload.. VD: điều chỉnh âm lượng cao thấp. Gauge: Gauge dùng để biểu diễn tiến độ hoàn thành một việc nào đó (download.com. Người lập trình sẽ lập trình cho đối tượng này tự động cập nhật giá trị theo thời gian.daihoc.3 Giao diện đối tượng Gauge chế độ tương tác • Chế độ không tương tác (Non-interactive mode): Đối tượng được biểu diễn dạng các thanh song song có chiều cao bằng nhau..

microedition.com. int initValue) int getValue () void setValue (int value) int getMaxValue () void setMaxValue (int maxValue) boolean isInteractive () Lấy giá trị hiện thời của Gauge Gán giá trị cho đối tượng Gauge Lấy giá trị cực đại cho phép của Gauge Gán giá trị cực đại cho phép cho Gauge Kiểm tra Gauge có thuộc chế độ tương tác không Bảng 4.Gauge Phương thức int maxValue.setCommandListener(this). 6.daihoc.4 Giao diện đối tượng Gauge chế độ không tương tác Các phương thức và chức năng tương ứng của lớp Gauge: Lớp Gauge: javax.Java Mobile Hình 4.lcdui.vn . fmMain. Khởi tạo một đối tượng Gauge Gauge gVolume= new Gauge (“Volume”. boolean interactive. //gắn Gauge vào Form fmMain.5 Lớp Gauge VD: //tạo 1 biến Gauge cho phép người dùng điều chỉnh âm thanh (chế độ tương tác) Chức năng Gauge (String label. 2). 49 Sưu t m b i: www. true.append(gVolume).

//cập nhật giá trị liên tục cho Gauge bằng cách sử dụng 1 biến timer //khoảng cách mỗi lần cập nhật là 1000 mili giây Timer tTimer = new Timer().com.setCommandListener(this). } } //xoá bộ định thời 50 Sưu t m b i: www. fmMain. không thì dừng lại if (gDownload. DTTask ttTimerTask = new DTTask(). false. 0.vn . //gắn Gauge vào Form fmMain.Java Mobile //tạo 1 biến Gauge biểu diễn tiến trình Download (chế độ không tương tác): Gauge gDownload = new Gauge(“Download Progress”.getMaxValue()) gDownload. 20.setValue(gDownload.daihoc. //lớp DDTask được viết bên trong MIDlet private class DTTask extends TimerTask{ public final void run () { //nếu giá trị hiện tại của gDownload < giá trị cực đại thì tiếp tục tăng. else cancel().getValue() < gDownload.append(gDownload). //class DTTask extends TimerTask tTimer.1).getValue()+1).scheduleAtFixedRate (ttTimerTask. 1000).

StringItem Phương thức StringItem (String label. setLabel(String label) của lớp Item. chỉ cần thay đổi label và text của đối tượng.microedition.append(siText). “John”).lcdui.6 Lớp StringItem Để lấy giá trị nhãn (label) hay thay đổi nội dung nhãn có thể dùng các phương thức getLabel(). siText.daihoc.. //sau đó muốn hiển thị 1 nội dung khác. //gắn vào form fmMain.. //không cần tạo 1 đối tượng StringItem mới. siText. Các phương thức và chức năng tương ứng của lớp StringItem: Lớp StringItem: javax.setLabel(“UserID: ”). VD: //tạo một đối tượng StringItem StringItem siText = new StringItem(“User: ”.setText(“12345”). Người dùng chỉ đựơc phép xem mà không được thay đổi nội dung đoạn văn bản này. 51 Sưu t m b i: www. String text) String getText () void setText (String text) Chức năng Khởi tạo một đối tượng StringItem Lấy nội dung đoạn văn bản Gán nội dung đoạn văn bản cần hiển thị Bảng 4.Java Mobile 4. .3.com.vn .3. String Item: Đối tượng StringItem dùng để hiển thị 1 đoạn văn bản lên màn hình.

daihoc. 52 Sưu t m b i: www.5 Giao diện đối tượng StringItem Đối tượng lớp String cũng có thể append() vào Form để hiển thị 1 đoạn văn bản nhưng không có hai phần nhãn và nội dung riêng biệt như StringItem.Java Mobile Hình 4.com.vn . Tuỳ yêu cầu của chương trình mà người lập trình có thể lựa chọn đối tượng phù hợp để sử dụng.

nếu muốn giới hạn các giá trị được phép nhập thì ứng dụng phải tự xử lý.daihoc. password. không được kết hợp với nhau vì có thể gây sai sót. Các ràng buộc này là các hằng lớp của lớp TextField gồm: o EMAILADDR: người dùng chỉ được phép nhập dữ liệu đúng chuẩn của một địa chỉ email.Java Mobile 4. URL: dữ liệu nhập phải có dạng 1 URL và có thể được sử dụng khi kiểm tra ràng buộc cho đối tượng TextBox. Các ràng buộc này được biểu diễn với dạng một số nguyên kiểu int.. giá trị được đề cập trong bảng sau: Tên ràng buộc ANY EMAILADDR NUMERIC PHONENUMBER URL PASSWORD CONSTRAINT_MASK 0 1 2 3 4 65536 (0x10000) 65635 (0xFFFF) Giá trị Biểu diễn nhị phân 00000000 00000000 00000000 00000000 00000000 00000001 00000000 00000000 00000010 00000000 00000000 00000011 00000000 00000000 00000100 00000001 00000000 00000000 00000000 11111111 11111111 Bảng 4. MIDP đã định nghĩa sẵn một số các ràng buộc (constraints) để đối tượng tự động kiểm tra tính hợp lệ của dữ liệu nhập vào.3. o PASSWORD: dữ liệu nhập vào sẽ đựơc hiển thị lên màn hình với dạng các dấu *.com. Không chỉ nhập dữ liệu text mà còn có thể nhập số. o o PHONENUMBER: dữ liệu nhập phải đúng chuẩn của số điện thoại. Để hỗ trợ cho người lập trình.vn . TextField: Lớp TextField được sử dụng khi ứng dụng cần người dùng nhập liệu. 53 Sưu t m b i: www. địa chỉ.4.7 Các Ràng Buộc của TextField Các giá trị của ràng buộc là các số nguyên liên tục nên các ràng buộc này phải sử dụng độc lập.. o NUMERIC: chỉ được phép nhập số (có thể là âm hay dương).

com. Vd: TextField.ANY | TextField.CONSTRAINT_MASK AND được áp ràng buộc nào.PASSWORD = OR = 00000000 00000000 00000000 00000001 00000000 00000000 -----------------------------------------00000001 00000000 00000000 MIDP cũng cung cấp sẵn giá trị CONSTRAINT_MASK để có thể dễ dàng kiểm tra lại ràng buộc nào đã được sử dụng bằng cách dùng toán tử AND giữa giá trị ràng buộc của đối tượng TextField và CONSTRAINT_MASK Vd: tfPassword.daihoc. 00000001 00000000 00000000 00000000 11111111 11111111 -----------------------------------------00000000 00000000 00000000 Sau đó lấy giá trị này so sánh với các ràng buộc để biết đối tượng TextField đó đã 54 Sưu t m b i: www.Java Mobile Vd: TextField.EMAILADDR | TextField.NUMERIC = OR = 00000000 00000000 00000001 00000000 00000000 00000010 ----------------------------------------00000000 00000000 00000011 = TextField.PHONENUMBER Ngoại trừ PASSWORD có thể kết hợp với một trong các ràng buộc còn lại bằng toán tử OR mà không gây nhầm lẫn cho chương trình.getConstraints() TextField.vn .

int pos) int length. 10. int length) void insert (String src.20.vn . TextField //gắn vào Form tfPhone = new TextField (“Phone:”. int length) void setString (String text) int getChars (char[] data) String getString () int getConstraints () int getMaxsize () void setMaxsize (int maxSize) int getCaretPosition () int size () Chức năng số ký tự tối đa người dùng có thể nhập và constraints là các ràng buộc khi nhập Xóa length ký tự từ vị trí offset Chèn chuỗi src vào TextField từ vị trí pos chuỗi data vào TextField từ vị trí position từ vị trí offset trong chuỗi data Gán giá trị text cho TextField lấy giá trị TextField ra một mảng ký tự lấy giá trị TextField Lấy giá trị ràng buộc của TextField Lấy kích thứơc tối đa của TextField Gán kích thứơc tối đa của TextField Lấy vị trí con trỏ hiện thời Lấy kích thước thật của TextField (số ký tự hiện tại của TextField) Bảng 4.PHONENUMBER). Chèn các length ký tự từ vị trí offset trong void setChars (char[] data. int Gán giá trị cho TextField bằng length ký tự void setConstraints (int constraints) Gán giá trị ràng buộc cho TextField TextField tfAddr = new TextField (“Addr:”.Java Mobile Các phương thức và chức năng tương ứng của lớp TextField: Lớp TextField: javax. int position) offset. int offset. String text.TextField.TextField Phương thức int maxSize.daihoc. TextField.microedition. ””.””.com.EMAILADDR).lcdui. 55 Sưu t m b i: www. int constraints) void delete (int offset.8 Lớp TextField VD: //tạo các đối tượng TextField để nhập địa chỉ mail. số điện thoại TextField (String label. Khởi tạo đối tượng TextField với maxSize là void insert (char[] data.

append (tfPhone).vn .Java Mobile fmMain. Hình 4.daihoc. fmMain.6 Giao diện đối tượng TextField 56 Sưu t m b i: www.append (tfAddr).com.

String[] strElements. ChoiceGroup (String label. int choiceType) Khởi tạo đối là choiceType Chức năng tượng ChoiceGroup lựa với chọn loại Choice. int choiceType. String strPart. Image iPart) int delete (int position) void insert (int position. Image iPart) Gán giá trị và biểu tượng cho phần tử ở vị trí position Khởi tạo đối tượng ChoiceGroup.daihoc.3. Các phương thức và chức năng tương ứng của lớp ChoiceGroup: Lớp ChoiceGroup: javax.5.MULTIPLE Với Exclusive ChoiceGroup phần tử đầu tiên tự động được gán là phần tử được chọn. Image iPart) void set (int position.lcdui.com. • Chỉ được phép chọn một khả năng (Exclusive ): Thể hiện danh sách các khả năng lên màn hình cùng các radio button và chỉ cho phép người dùng chọn duy nhất một khả năng. ChoiceGroup kế thừa từ interface Choice.ChoiceGroup Phương thức ChoiceGroup (String label. cho trước các khả năng lựa chọn và biểu tượng của từng khả năng Thêm một phần tử (1 khả năng) vào ChoiceGroup (vào cuối danh sách) Xoá phần tử ở vị trí position của ChoiceGroup Chèn một phần tử vào vị trí position 57 Sưu t m b i: www. ChoiceGroup: Lớp ChoiceGroup được sử dụng để biểu diễn một danh sách các khả năng cho người dùng lựa chọn.vn .EXCLUSIVE hay Choice. String strPart. gồm hai dạng: • Cho phép chọn nhiều khả năng (Multiple ): Thể hiện danh sách các khả năng lên màn hình dạng checkbox và cho phép người đánh dấu check lên các lựa chọn. Image[] iElements) int append (String strPart.Java Mobile 4.microedition.

Cách này nên dùng cho ChoiceGroup dạng chỉ cho phép chọn một khả năng hoặc một số trường hợp đặc biệt • CommandListener: Khi gắn đối tượng ChoiceGroup vào Form thì tạo thêm một Command (tên là “OK” chẳng hạn).com.9 Lớp ChoiceGroup *Bắt sự kiện cho đối tượng ChoiceGroup: Có thể dùng hai cách để bắt sự kiện cho đối tượng ChoiceGroup: • ItemStateListener: khi Form chứa đối tượng ChoiceGroup đã gọi phương thức setItemStateListener() thì khi người dùng chọn vào bất cứ khả năng nào. boolean selected) Lấy giá trị của phần tử ở vị trí position Lấy biểu tượng của phần tử ở vị trí position Lấy vị trí của phần tử được chọn MULTIPLE: gán giá trị được chọn hay không (selected) cho phần tử ở vị trí position EXCLUSIVE: gán giá trị cho phần tử ở vị trí position là được chọn (không phụ thuộc giá trị selected) int getSelectedFlags (boolean[] selectedArr) void setSelectedFlags (boolean[] selectedArr) boolean isSelected (int position) int size () Lưu thông tin kết quả lựa chọn vào mảng Gán kết quả lựa chọn cho đối tượng ChoiceGroup Kiểm tra phần tử ở vị trí position có được chọn không Lấy số phần tử của ChoiceGroup Bảng 4. Vd: 58 Sưu t m b i: www. phương thức itemStateChanged() sẽ được gọi thực hiện. Khi người dùng chọn xong thì nhấn chọn Command này và chương trình sẽ gọi phương thức commandAction() để xử lý.Java Mobile String getString (int position) Image getImage (int position) int getSelectedIndex () void setSelectedIndex (int position.vn . Cách này có thể sử dụng để bắt sự kiện cho cả hai loại ChoiceGroup cũng như các đối tượng Item khác.daihoc.

. fmMain..vn . null).7 Giao diện đối tượng ChoiceGroup chế độ một lựa chọn 59 Sưu t m b i: www..EXCLUSIVE). cgExclusive. không kèm biểu tượng cgExclusive.append(“Read”. . int iReplyIndex = cgExclusive.append(cgExclusive).. null).append(“Delete”. null).com. //bắt sự kiện public void itemStateChanged(Item item) { if (item==cgExclusive) { .daihoc.. } } Hình 4.append(“Reply”. cgExclusive.setSelectedIndex(iReplyIndex. Choice.setItemStateListener(this). //gắn vào Form fmMain. null). //gán “Reply” là phần tử được chọn cgExclusive. //lần lượt thêm các phần tử cho đối tượng.Java Mobile //Tạo một đối tượng ChoiceGroup chỉ cho phép chọn một khả năng: ChoiceGroup cgExclusive = new ChoiceGroup( “Email Options”. true).append(“Forward”.

com. fmMain.append(“Auto Indent”..Screen.. fmMain. Choice.MULTIPLE). cgMultiple. không kèm biểu tượng cgMultiple. //xử lý sự kiện public void commandAction (Command c. null).. 1).append(“Replace Tabs”. //lần lượt thêm các phần tử cho đối tượng. //tạo 1 command OK để bắt sự kiện Command cmOK = new Command (“OK”.setCommandListener(this). //gắn vào Form int iChoiceGroupIndex = fmMain.Java Mobile //tạo 1 đối tượng ChoiceGroup cho phép chọn nhiều khả năng: ChoiceGroup cgMultiple = new ChoiceGroup( “Multiple Choice”.daihoc. } } Hình 4.8 Giao diện đối tượng ChoiceGroup chế độ nhiều lựa chọn 60 Sưu t m b i: www.vn . Command.addCommand(cmOK). null).. null).append(“Wrap Text”. Displayable d) { if (c==cmOK) { . cgMultiple. ..append(cgMultiple).

Java Mobile

4.3.6. Image và ImageItem: 4.3.6.1. Image:

Chứa dữ liệu ảnh đồ hoạ, gồm hai dạng : • Cố định (Immutable): thường đựơc nạp từ resource của ứng dụng, từ file hay chuyển từ dạng Image có thể thay đổi (Mutable) sang. Dạng hình ảnh này chủ yếu được dùng làm biểu tượng cho các thành phần đồ hoạ khác như ChoiceGroup, Form, List, Alert....Một khi đã tạo đối tượng kiểu Immutable Image thì không thể thay đổi hình ảnh đựơc nữa. • Có thể thay đổi (Mutable): có thể thay đổi một cách dẽ dàng. Khi tạo đối tượng kiểu Mutable Image, một vùng nhớ trống sẽ được cấp phát dựa trên kích thước khi khai báo. Khi muốn hiển thị Image dạng này lên màn hình phải gọi phương thức paint() của lớp Canvas sẽ được đề cập trong phần đồ hoạ cấp thấp. Các phương thức và chức năng tương ứng của lớp Image: Lớp Image: javax.microedition.lcdui.Image Phương thức name) source) data, int offset, int length) resource đối tượng Image source khác dữ liệu (lấy length bytes từ vị trí offset của mảng byte data) static Image createImage (int tạo một đối tượng Mutable Image, cho trứơc width, int height) Graphics getGraphics () kích thứơc dài rộng của ảnh Lấy đối tượng Graphics tương ứng của Mutable Image Chức năng static Image createImage (String Tạo một đối tượng Immutable Image từ static Image createImage (Image Tạo một đối tượng Immutable Image từ một static Image createImage (byte[] Tạo một đối tượng Immutable Image từ mảng

61
Sưu t m b i: www.daihoc.com.vn

Java Mobile

int getHeight () int getWidth () boolean isMutable ()

Lấy chiều cao của đối tượng Image Lấy chiều rộng của đối tượng Image kiểm tra đối tượng có là Mutable Image không Bảng 4.10 Lớp Image

4.3.6.2.

ImageItem:

Lớp ImageItem cung cấp các phương thức để điều khiển và sắp xếp các đối tượng Image đựơc gắn trong Form. Lớp ImageItem đã cung cấp sẵn các định dạng vị trí sẵn cho hình ảnh, bao gồm: Định dạng LAYOUT_DEFAULT LAYOUT_LEFT LAYOUT_RIGHT LAYOUT_CENTER Giá trị nhị phân 00000000 00000000 00000000 00000001 00000000 00000010 00000000 00000011 Ý nghĩa dùng định dạng mặc định của thiết bị canh trái canh phải canh giữa xuống hàng trước khi vẽ Image LAYOUT_NEWLINE_AFTER 00000010 00000000 xuống hàng sau khi vẽ Image. Bảng 4.11 Định dạng ImageItem Các định dạng trên có thể dùng kết hợp với nhau trong một đối tượng ImageItem bằng phép toán OR . Vd: ImageItem.LAYOUT_RIGHT ImageItem.LAYOUT_NEWLINE_AFTER logical OR 00000000 00000010 00000010 00000000 00000010 00000010 --------------------------------------

LAYOUT_NEWLINE_BEFORE 00000001 00000000

62
Sưu t m b i: www.daihoc.com.vn

Java Mobile

Các phương thức và chức năng tương ứng của lớp ImageItem: Lớp ImageItem: javax.microedition.lcdui.ImageItem Phương thức img, int layout, String altText) Chức năng Image img, với định dạng layout, và chuỗi thay thế altText(chuỗi này dùng thay thế cho image khi không thể hiện được lên màn hình thiết bị) Image getImage () void setImage (Image img) int getLayout() void setLayout (int layout) String getAltText () void setAltText () Vd:
//tạo Immutable Image từ File và hiển thị trong Form

ImageItem (String label, Image Tạo một đối tượng ImageItem từ đối tượng

Lấy đối tượng Image của ImageItem Gán đối tượng Image cho ImageItem Lấy giá trị định dạng của ImageItem Gán giá trị định dạng cho ImageItem Lấy giá trị chuỗi thay thế Gán giá trị chuỗi thay thế Bảng 4.12 Lớp ImageItem

Image img = Image.createImage(“image.png”);
//.png (Portable NetWork Graphics) là định dạng file ảnh trong thiết bị di động

ImageItem

imageItem

=

new

ImageItem

(null,

img,

ImageItem.LAYOUT_CENTERImageItem.LAYOUT_NEWLINE_BEFORE,null); fmMain.append(imageItem);
//tạo đối tượng ChoiceGroup có các biểu tượng tương ứng cho các khả năng lựa chọn

Image image[] = { Image.createImage(“/up.png”), Image.createImage(“/down.png”), Image.createImage(“/help.png”)} ; String options[] = {“Upload”, “Download”, “Help”};
//Tạo đối tượng ChoiceGroup dùng mảng

ChoiceGroup cgImage = new ChoiceGroup (“Select option”, Choice.EXCLUSIVE, options, images);

63
Sưu t m b i: www.daihoc.com.vn

Java Mobile

4.4. List:
List dùng để hiển thị các danh sách các khả năng cho người dùng lựa chọn. List gồm 3 dạng: • • • Multiple: cho phép người dùng lựa chọn nhiều khả năng, tương tự Multiple ChoiceGroup. Exclusive: cho phép người dùng lựa chọn duy nhất một khả năng, tương tự Exclusive ChoiceGroup. Implicit: chỉ hiển thị danh sách các khả năng lựa chọn dạng menu. * Bắt sự kiện cho các đối tượng List: Để bắt sự kiện cho đối tượng List, phải gán đối tượng ở trạng thái lắng nghe, nghĩa là sử dụng phương thức setCommandListener() cho đối tượng List này. Sau đó bắt sự kiện và xử lý sự kiện trong phương thức commandAction(). Exclusive và multiple List không tự động gửi sự kiện. Do đó, ta phải gắn một command (vd: command Save)vào đối tượng List để lấy trạng thái của đối tượng sau khi người dùng lựa chọn. Khi người dùng chọn command Save tức người dùng đã chọn xong các khả năng, ta sẽ bắt sự kiện này và xử lý sự kiện trong phương thức commandAction(). Implicit List gửi sự kiện mỗi khi người dùng lựa chọn một phần tử trong List. Khi đó, nếu đã gán listener cho đối tượng thì sự kiện phát sinh sẽ gọi phương thức commandAction(). * So sánh giữa lớp List và lớp ChoiceGroup: Giống nhau: • • • Khác nhau: Cả hai đều kế thừa từ interface Choice Cả hai đều cho phép tạo đối tượng hỗ trợ một lựa chọn duy nhất(radio button ) hoặc nhiều lựa chọn (checkbox). Có thể thêm các đối tượng Command khác hiển thị cùng lúc trên màn hình để hỗ trợ việc bắt sự kiện.

64
Sưu t m b i: www.daihoc.com.vn

IMPLICIT. List gồm 3 dạng: MULTIPLE (check box).daihoc. String[] strElements. int listType) List List là thực thể duy nhất hiển thị trên màn hình.List Phương thức List (String title.lcdui.vn . CommandListener: gắn một Command để lắng nghe và gọi phương thức commandAction() khi có sự kiện phát sinh Bảng 4. List (String tile. Image[] Tạo một đối tượng List cho trước phần tử và biểu tượng dưới dạng mảng strElements và 65 Sưu t m b i: www.com. Choice.13 So sánh List và ChoiceGroup Các phương thức và chức năng tương ứng của lớp List: Lớp List: javax. 2 dạng List còn lại phải thêm 1 command để bắt) Chức năng Tạo một đối tượng List rỗng (chưa có các phần tử) với listType thuộc 1 trong 3 dạng: Choice. EXCLUSIVE (radio button) Bắt sự kiện 2cách: ItemStateListener: gọi phương thức itemStateChanged()) khi người dùng lựa chọn một phần tử bất kỳ.MULTIPLE.microedition. EXCLUSIVE (radio button) và IMPLICIT (menu) Chỉ có 1 cách duy nhất là dùng CommandListener. Choice. List gọi commandAction() để bắt sự kiện (Implicit List tự gọi hàm này khi người dùng chọn 1 phần tử bất kỳ. int listType. Nghĩa là có thể có các thành phần giao diện khác được hiển thị đồng thời với ChoiceGroup Phân loại ChoiceGroup gồm 2 dạng: MULTIPLE (check box).EXPLICIT.Java Mobile ChoiceGroup Hiển thị trên ChoiceGroup là 1 phần của màn hình Form.

String strPart. boolean selected) imElements.png”).daihoc.vn . Image imPart) void delete (int position) void insert (int position.Java Mobile imElements ) int append (String strPart. Image imPart) void set (int position.createImage(“/next. Image imPart) String getString (int position) Image getImage (int position) int getSelectedIndex () void setSelectedIndex (int position.14 Lớp List VD: //tạo đối tượng Implicit List với các phần tử cho trước: //tạo mảng các phần tử String options[]={“Next”. //tạo mảng các biểu tượng Image images[]={Image. 66 Sưu t m b i: www. String strPart.com. “Previous”. Thêm một phần tử vào cuối danh sách Xoá một phần tử ở vị trí position Chèn một phần tử vào vị trí position Gán giá trị (thay thế bằng phần tử mới) cho phần tử ở vị trí position Lấy giá trị phần tử ở vị trí position Lấy biểu tượng phần tử ở vị trí position Lấy vị trí phần tử được chọn MULTIPLE: gán giá trị được chọn hay không (selected) cho phần tử ở vị trí position EXCLUSIVE. IMPLICIT: gán giá trị cho phần tử ở vị trí position là được chọn (không phụ thuộc giá trị selected) int getSelectedFlags (boolean[] selectedArr) void setSelectedFlags (boolean[] selectedArr) boolean isSelected (int position) int size () Lưu thông tin kết quả lựa chọn vào mảng Gán kết quả lựa chọn cho đối tượng List Kiểm tra phần tử ở vị trí position có được chọn không Lấy số phần tử của List Bảng 4. “New”}.

Choice.com.out.Java Mobile Image. break.} List lsImplicit = new List (“Document option:”.println("Next"). images).out.createImage(“/new. //gán đối tượng vào trạng thái lắng nghe lsImplicit.createImage(“/prev.out.IMPLICIT.println("New").setCommandListener(this).daihoc. Displayable s) { if (c == List.getSelectedIndex()) { case 0: System. break.println("Previous").vn .SELECT_COMMAND) { switch (lsImplicit. } } } Hình 4. case 2: System. //bắt sự kiện và xử lý public void commandAction(Command c.png”). options.9 Giao diện đối tượng List dạng menu 67 Sưu t m b i: www.png”). break. Image. case 1: System.

SCREEN. Command. Choice. //thêm command Save để bắt sự kiện Command cmSave = new Command (“Save”.Java Mobile //tạo đối tượng Multiple hay Exclusive List: List lsMultiple = new List (“Multiple choice”.Exclusive).SetCommandListener(this). //gán đối tượng ở trạng thái lắng nghe lsMultiple.vn . //bắt sự kiện public void commandAction (Command c.MULTIPLE).addCommand(cmSave).daihoc. List lsExclusive = new List (“Exclusive choice”.10 Giao diện đối tượng List cho phép chọn nhiều lựa chọn 68 Sưu t m b i: www. Displayable d) { if (c==cmSave) { // xử lý sự kiện } } Hình 4. lsMultiple. Choice.com. 1).

TextField. tương tự TextField.PHONENUMBER. giao diện khác được hiển thị đồng thời với TextField 2 cách: CommandListener ItemStateListener Chỉ có thể thêm một Command và dùng CommandListener để lắng nghe và bắt sự kiện Bảng 4.EMAILADDR. Xóa length ký tự từ vị trí offset Chèn chuỗi source vào TextBox từ vị trí 69 Sưu t m b i: www. TextBox là thực thể duy nhất màn Nghĩa là có thể có các thành phần hiển thị trên màn hình.microedition. TextField. int Chức năng Tạo một đối tượng TextBox với maxSize là số ký tự tối đa được phép nhập và constraints là các ràng buộc nhập liệu.vn .NUMERIC.ANY.PASSWORD. int maxSize.URL) • Số ký tự nhập vào có thể nhỏ hơn hay bằng số ký tự tối đa của đối tượng được gán khi khởi tạo. TextField. * So sánh giữa lớp TextBox và lớp TextField: Giống nhau: • Cả hai lớp đều sử dụng chung các kiểu ràng buộc của lớp TextField (gồm TextField.15 So sánh TextField và TextBox Các phương thức và chức năng tương ứng của lớp TextBox: Lớp TextBox: javax. String text.daihoc. Chức năng cuộn màn hình được hỗ trợ nếu màn hình không đủ hiển thị toàn bộ nội dung nhập. int length) void insert (String source. int constraints) void delete (int offset.lcdui. TextBox: TextBox là dạng giao diện dành cho người dùng nhập liệu.Java Mobile 4.5. TextField. Khác nhau: TextField Hiển trên hình Bắt sự kiện TextBox thị TextField là 1 phần của Form. TextField.TextBox Phương thức TextBox (String title.com.

. int length.daihoc. TextField.SCREEN. 70 Sưu t m b i: www. 20.com. int position) void setChars (char[] data. Command.addCommand(cmSave). int offset. int offset. 1). null. Displayable d) { if(c==cmSave) { //xử lý sự kiện . //bắt sự kiện public void commandAction (Command c.ANY). // lắng nghe sự kiện tbName. int length) void setString (String text) int getChars (char[] data) String getString () int getConstraints () void setConstraints (int constraints) int getMaxSize () void setMaxSize (int maxSize) int getCaretPosition () int size () VD: //tạo một đối tượng TextBox: position Chèn các length ký tự từ vị trí offset trong chuỗi data vào TextBox từ vị trí position Gán giá trị cho TextBox bằng length ký tự từ vị trí offset trong chuỗi data Gán giá trị text cho TextBox lấy giá trị TextBox ra một mảng ký tự lấy giá trị TextBox Lấy giá trị ràng buộc của TextBox Gán giá trị ràng buộc cho TextBox Lấy kích thước tối đa của TextBox Gán kích thước tối đa của TextBox Lấy vị trí con trỏ hiện thời Lấy số ký tự của dữ liệu nhập vào TextBox Bảng 4..SetCommandListener(this).16 Lớp TextBox TextBox tbName = new TextBox (“Pls enter your name”.vn . //gắn command Save bắt sự kiện Command cmSave = new Command (“Save”.Java Mobile position) void insert (char[] data. tbName.

vn .com.daihoc.Java Mobile } } Hình 4.11 Giao diện đối tượng TextBox 71 Sưu t m b i: www.

vn .daihoc. AlertType atType) dung strText. Alert: Đối tượng Alert có dạng một hộp thoại hiển thị thông báo đến người dùng. Các phương thức và chức năng tương ứng của lớp Alert: Lớp Alert: javax.lcdui.6. Tạo đối tượng Alert với tiêu đề title.Alert Phương thức Alert (String title) Chức năng Tạo một đối tượng Alert với kiểu mặc định của thiết bị Alert (String title. có thể có hiển thị hình ảnh kèm theo hoặc không.com. Alert gồm hai loại: • • Không giới hạn thời gian hiển thị (Modal): Alert hiển thị trên màn hình cho đến khi người dùng bấm nút tắt. Một đối tượng Alert gồm 3 thành phần: tiêu đề.6. nội dung thông báo và hình ảnh đính kèm. hình iImage và loại atType cho trước Image getImage () void setImage () String getString () void setString (String str) int getDefaultTimeout() int getTimeout () Lấy đối tượng Image của Alert Gán đối tượng Image cho Alert Lấy nội dung thông báo của Alert Gán nội dung thông báo cho Alert Lấy thời gian Alert được phép hiển thị (timeout) mặc định của thiết bị Lấy thời gian Alert được phép hiển thị void setTimeout (int miliseconds) Gán giá trị thời gian Alert được phép hiển 72 Sưu t m b i: www. Alert và AlertType: 4. String strText.1.microedition. nội Image iImage. Giới hạn thời gian hiển thị (Timed): Alert chỉ hiển thị trên màn hình trong thời gian nhất định và tự động tắt khi đến hạn.Java Mobile 4.

VD: Alert alTest = new Alert (“Alert”). display. .setCurrent (Alert): đối tượng Displayable đang được hiển thị trước khi gọi phương thức này sẽ được gọi hiển thị lại sau khi đối tượng Alert hết hạn.vn . fmMain). display.FOREVER thì dạng mặc định là không giới hạn thời gian hiển thị (Modal) nếu không thì đó chính là thời gian hiển thị mặc định của Alert tính theo đơn vị mili giây và Alert mặc định là loại giới hạn thời gian hiển thị. • Dùng phương thức Display. 73 Sưu t m b i: www..setTimeout(Alert. Dùng phương thức getDefaultTimeout() của lớp Alert để kiểm tra. alTest.daihoc.Java Mobile thị tính theo mili giây AlertType getType() void setType(AlertType type) Lấy kiểu của Alert Gán kiểu cho Alert Bảng 4. Có hai cách để hiển thị Alert lên màn hình: • Dùng phương thức Display.. VD: Form fmMain =new Form (“Form Main”).FOREVER).setTimeout (Alert.setCurrent(alTest. Alert alTest = new Alert (“Alert”)..com.FOREVER).setCurrent (alTest). . alTest. Displayable) : Khi Modal Alert bị ngừơi dùng tắt hay Timed Alert hết thời hạn hiển thị thì đối tượng Displayable sẽ được hiển thị lên màn hình.17 Lớp Alert Mỗi thiết bị có dạng Alert cũng như thời gian hiển thị Alert mặc định. nếu giá trị trả về là Alert..setCurrent (Alert.

Âm thanh của Alert có thể được chơi bằng một trong hai cách: 74 Sưu t m b i: www. Nếu đối tượng Alert gọi các hàm này thì sẽ bị phát sinh Exception IllegalStateException.setType(AlertType.vn .WARNING). hỗ trợ âm thanh tương ứng khiAlert hiển thị. “Message”. 4. null. hay Alert alTest =new Alert (“Alert”. VD: Alert alWarning = new Alert (“Alert”. null).2. “Message”.WARNING).daihoc. null.com. Screen là lớp con của Displayable nhưng đối tượng Alert không được phép gọi trực tiếp một số hàm sau của lớp Displayable: • • • addCommand(Command) removeCommand(Command) setCommandListener(CommandListener) Điều này nghĩa là đối tượng Alert không được phép gắn thêm nút (đối tượng Command ) cũng như không xử lý và bắt sự kiện. AlertType: AlertType là lớp định nghĩa sẵn các loại Alert cho thiết bị. alTest. AlertType.Java Mobile Lớp Alert là lớp con của Screen. Đối tượng này chỉ có chức năng gửi thông báo đến người dùng chứ không thêe nhận phản hồi từ người dùng.6. Gồm năm loại: • • • • • • Báo giờ (alarm) Nhắc lại (confirmation) Báo lỗi (error) Thông báo (info) Cảnh báo (warning) Nếu đối tượng Alert được gán loại Alert trước thì âm thanh tương ứng của loại Alert này sẽ được phát khi đối tượng hiển thị lên màn hình.

INFO). …. “It’s time for coffee”. cách này có thể dùng khi chỉ cần báo cho ngưòi dùng biết về sự kiện mà không cần hiển thị thông tin trực tiếp lên màn hình.ALARM. AlertType.com.18 AlertType Lớp AlertType chỉ hỗ trợ một phương thức duy nhất là boolean playSound (Display display) để gọi thực hiện chức năng play sound của đối tượng AlertType. 75 Sưu t m b i: www. //gán kiểu Modal Alert alAlert.vn .createImage(“/coffee.playSound(fmMain).playSound(fmMain). Hay AlertType.daihoc.Java Mobile • Phát âm thanh Alert trực tiếp mà không cần tạo một đối tượng Alert nghĩa là chỉ phát âm thanh thông báo mà không hiển thị lên màn hình. VD: AlertType. Các loại AlertType được định nghĩa trước: Giá trị ALARM CONFIRMATION ERROR INFO WARNING Ý nghĩa Báo giờ hoặc nhắc nhở Thông báo hoàn tất 1 công việc nào đó Báo lỗi Thông báo chung Khuyến cáo Bảng 4. Các sự kiện khác nhau có thể được thông báo bằng các âm thanh khác nhau.png”). Alert alAlert= new Alert (“Hello”. bằng cách dùng phương thức: AlertType.<Type>.playSound (Display). img.FOREVER).CONFIRMATION. VD: //tạo một đối tượng Alert có kèm hình ảnh và âm thanh dạng thông báo khi hiển thị Image img = Image.setTimeout(Alert.

fmMain).setCurrent(alAlert.vn .12 Giao diện đối tượng Alert 76 Sưu t m b i: www.Java Mobile //gọi hiển thị Alert display.daihoc.com. Hình 4.

19 Lớp Ticker Hình 4. Các phương thức và chức năng tương ứng của lớp Ticker: Lớp Ticker: javax.setTicker(tkMessage). Đối tượng Ticker có thể được gắn vào bất kỳ đối tượng Screen nào.Java Mobile 4. have a nice day!!!”).Ticker Phương thức Ticker (String strText) String getString () void setString (String strText) VD: //tạo đối tượng Ticker Ticker tkMessage = new Ticker (“Wellcome to J2ME.lcdui. //gắn vào form fmMain.daihoc. kể cả Alert.com. Chức năng Tạo một đối tượng Ticker với nội dung chuỗi cuộn strText cho trước Lấy chuỗi ký tự của Ticker Gán chuỗi ký tự cho Ticker Bảng 4. Vị trí chuỗi ký tự ở trên hay dưới màn hình.7. Ticker: Ticker là lớp hỗ trợ hiển thị chuỗi ký tự cuộn liên tục trên màn hình.microedition.13 Giao diện Ticker 77 Sưu t m b i: www.vn . cũng như tốc độ cuộn phụ thuộc vào đặc tả MIDP.

Java Mobile Chương 5: Giao diện đồ họa cấp thấp Đồ hoạ cấp thấp trong J2ME được hỗ trợ chủ yếu qua hai lớp chính là Canvas và Graphics.com. Lớp Canvas cũng hỗ trợ các phương thức bắt sự kiện ở cấp thấp Lớp Graphics cung cấp những đối tượng để vẽ lên Canvas (hay được gọi là những ngữ cảnh đồ họa (graphics context)). Lớp Canvas có dạng một phông có kích thước cố định và những gì vẽ lên phông này sẽ được hiển thị cho người dùng.EXIT. Lớp Graphics hỗ trợ vẽ các đối tượng đường thẳng.1. … } MyFirstCanvas mfcCanvas = new MyFisrtCanvas(this).vn . 78 Sưu t m b i: www.setCurrent(mfcCanvas). không tạo trực tiếp một đối tượng Canvas mà xây dựng một lớp kế thừa lớp này và xử lý các chức năng đồ hoạ của chương trình bên trong lớp con này. display.daihoc. hình chữ nhật. Canvas: Canvas là lớp con của lớp Displayable (ngang cấp với lớp Screen). Command. 5. VD: class MyFirstCanvas extends Canvas implements CommandListener{ … Command cmdExit =new Command(“Exit”. addCommand(cmdExit). text… cũng như các phương thức chọn màu và font chữ. nghĩa là có thể gắn thêm các đối tượng Command vào Canvas để bắt sự kiện như Form. đừơng tròn. setCommandListener(this). Khi sử dụng. 1).

hoành độ x tăng dần theo chiều từ trái sang phải. Trong khi phương thức paint() trong lớp Screen và các lớp con của nó đã được dựng sẵn để vẽ các đối tượng đồ hoạ cấp cao(title.com.Java Mobile 5. abstract public class Displayable { abstract void paint(Graphics g). Hệ toạ độ: Tương tự hệ toạ độ trong lập trình Windows. list.lcdui. Đối tượng Canvas đặc trưng bởi 2 giá trị là chiều dài và chiều rộng. } 79 Sưu t m b i: www. Độ dày mặc định của các đối tượng đồ hoạ trong J2ME là 1 pixel.daihoc.1. gốc toạ độ (0. Tung độ y tăng dần theo chiều dọc từ trên xuống.0) nằm ở góc trái trên của màn hình.Canvas Phương thức int getWidth () int getHeight () Chức năng Lấy giá trị độ rộng đối tượng Canvas Lấy giá trị độ dài đối tượng Canvas Bảng 5.1 Truy vấn kích thước Canvas 5.vn . ticker.1. Các phương thức của lớp Canvas để truy vấn các giá trị này: Lớp Canvas: javax. form. nghĩa là phải viết xử lý cho phương thức này ở lớp con của Canvas (lớp kế thừa mà ta xây dựng để vẽ lên màn hình). Vẽ trên đối tượng Canvas: Canvas và Screen là hai lớp con của lớp Displayable nên cùng kế thừa phương thức abstract paint() của lớp cha.1.microedition. textbox. phương thức này vẫn được khai báo với từ khoá abstract. Hai giá trị này là cố định cho các đối tượng Canvas khác nhau đựơc tạo lập trong cùng một thiết bị và phụ thuộc vào loại thiết bị di động. alert…) lên màn hình thì trong lớp Canvas.2.

paint(Graphics g){ // gắn tiêu đề //gắn đối tượng Ticker … paintContent(g).vn . } } public class Form extends Screen { void paintContent(Graphics g){… } } public class TextBox extends Screen { void paintContent(Graphics g) {… } } public class List extends Screen implements Choice { void paintContent(Graphics g){… } } public class Alert extends Screen{ void paintContent(Graphics g){… } } 80 Sưu t m b i: www.com. } public abstract class Screen extends Displayable { abstract void paintContent(Graphics g).Java Mobile public abstract class Canvas extends Displayable { protected abstract void paint(Graphics g).daihoc.

height là kích thước vùng cần vẽ lại) xử lý các yêu cầu vẽ còn treo kiểm tra thiết bị có hỗ trợ hai buffer không Bảng 5.microedition. int y.daihoc.vn .Canvas Phương thức void showNotify () void hideNotify () Chức năng Được gọi trước khi application manager vẽ đối tượng canvas lên màn hình Được gọi sau khi application manager xoá đối tượng canvas khỏi màn hình Bảng 5.lcdui.microedition. int yêu cấu vẽ một vùng của Canvas ((x. int height) final void serviceRepaints() boolean isDoubleBuffered () Chức năng vẽ đối tượng g lên Canvas yêu cấu vẽ Canvas toạ độ góc trái trên. Nhưng khi cần yêu cầu thiết bị vẽ lại màn hình thì không gọi trực tiếp phương thức này mà gọi phương thức repaint().y) là 81 Sưu t m b i: www. Các phương thức hỗ trợ giao tiếp với Application Manager: Lớp Canvas: javax. width.com. Phương thức serviceRepaint() yêu cầu tất cả các yêu cầu vẽ trước đó phải được thực hiện ngay.Java Mobile Các phương thức hỗ trợ vẽ của lớp Canvas: Lớp Canvas: javax. khi gọi phương thức này các tiến trình khác sẽ bị block cho đến khi tất cả các phương thức vẽ được thực hiện.Canvas Phương thức abstract void paint (Graphic g) final void repaint () width.3 Giao tiếp với Application Manager Các phương thức này đựơc khai báo trong lớp Canvas với kiểu protected final void repaint (int x.2 Lớp Canvas Phương thức paint() được dùng để xử lý các sự kiện vẽ trong đối tượng Canvas. Phương thức repaint() này sẽ gọi hàm paint() để vẽ lại toàn bộ hay một phần màn hình.lcdui. Do đó.

1. Mà chỉ nên viết code trong các phương thức này để cấp phát.1 Bắt sự kiện cấp cao: Lớp Canvas cũng là lớp con của Displayable như lớp Screen do đó cũng kế thừa các phương thức hỗ trợ Command như lớp Screen. Command. setCommandListener(this). addCommand(cmExit). gồm: • addCommand(Command) • isShown() • removeCommand(Command) • setCommandListener(CommandListener) VD: class TestCanvas extends Canvas implements CommandListener { private Command cmExit.daihoc.. protected void hideNotify(){ }.vn . khởi tạo các biến cũng như tạo lập hay hủy các tiến trình xử lý cho việc vẽ các đối tượng lên Canvas. Do đó.Java Mobile protected void showNotify(){ }.3. sự kiện trong game… 5. không gọi trực tiếp các phương thức này trong chương trình. // Exit MIDlet 82 Sưu t m b i: www.. Bắt sự kiện trong các đối tượng Canvas: Đối tượng canvas có thể hỗ trợ bắt sự kiện dưới hai cấp độ: • bắt sự kiện cấp cao: thêm một hay nhiều đối tượng Command vào đối tượng Canvas và bắt sự kiện thông qua các Command này (dùng CommandListener) • bắt sự kiện cấp thấp: bắt sự kiện các phím số trên thiết bị cũng như các sự kiện con trỏ. . và được gọi bởi application manager trước khi vẽ và sau khi xoá đối tượng canvas lên màn hình. 5.com.1.3.EXIT. cmExit = new Command("Exit". 1).

2 Bắt sự kiện cấp thấp: Sử dụng mã phím(key code) Mã phím là các giá trị nguyên gán cho các phím tương ứng trong thiết bị di động.4 Mã Phím Giá trị 48 49 50 51 52 53 54 55 56 57 42 35 83 Sưu t m b i: www.daihoc. Các mã phím này được gán với các tên tương ứng cho dễ nhớ như: public static final int KEY_NUM0 = 48.1.lcdui.. public void commandAction(Command c.vn .microedition. Displayable d) { if (c == cmExit) {.com.Canvas Tên KEY_NUM0 KEY_NUM1 KEY_NUM2 KEY_NUM3 KEY_NUM4 KEY_NUM5 KEY_NUM6 KEY_NUM7 KEY_NUM8 KEY_NUM9 KEY_STAR KEY_POUND Bảng 5. … Bảng mã phím các phím bàn phím ITU-T (0-9. public static final int KEY_NUM1 = 49.} } } 5.. *.3..Java Mobile .. #) Lớp Canvas: javax.

lcdui. protected void keyReleased (int keyCode){ }. protected void keyPressed (int keyCode){ }.microedition. Vd: protected void keyPressed(int keyCode) { switch (keyCode) { KEY_NUM1: break. protected void keyRepeated (int keyCode){ }.com.5 Sự kiện keyPressed Các phương thức keyPressed(). muốn bắt sự kiện nào thì ta chỉ cần khai báo phương thức tương ứng trong lớp kế thừa Canvas và viết code xử lý cho phương thức đó.Canvas Phương thức void keyPressed (int keyCode) void keyReleased (int keyCode) void keyRepeated (int keyCode) Chức năng được gọi khi người dùng nhấn phím được gọi khi người dùng nhả phím được gọi khi người dùng nhấn 1 phím nhiều lần (một số thiết bị không hỗ trợ phương thức này) boolean hasRepeatEvents () String getKeyName () kiểm tra thiết bị có hỗ trợ nhấn 1 phím nhiếu lần không lấy tên phím tương ứng của mã phím Bảng 5.Java Mobile Lớp Canvas hỗ trợ việc bắt sự kiện các phím này bằng các phương thức: Lớp Canvas: javax.vn . keyReleased() và keyRepeated() được khai báo trong lớp Canvas với thuộc tính protected. KEY_NUM2: break. … } } … … 84 Sưu t m b i: www.daihoc. Do đó.

sang phải.6 Sự kiện Game Action 85 Sưu t m b i: www. Với các loại điện thoại có hỗ trợ các phím di chuyển thì các sự kiện này sẽ được gán trực tiếp cho các phím đó. 4.com. Game action: MIDP cũng hỗ trợ lập trình game bằng cách định nghĩ sẵn một bộ các phím bấm xử lý sự kiện game.daihoc.1. Lớp Canvas: javax. 6. có thể gán các sự kiện này với các phím số 2. 8.microedition. Các sự kiện chính bao gồm các sự kiện sang trái. lên. xuống và bắn. 5.lcdui.4.Canvas Tên sự kiện UP DOWN LEFT RIGHT FIRE GAME_A GAME_B GAME_C GAME_D Mô tả di chuyển lên trên di chuyển sang trái di chuyển sang phải bắn Tuỳ chọn Tuỳ chọn Tuỳ chọn Tuỳ chọn 1 2 5 8 9 10 11 12 Giá trị di chuyển xuống dưới 6 Bảng 5.Java Mobile 5. Mỗi sự kiện game cũng được gán bởi một số nguyên như sự kiện phím bấm.vn . Nếu không.

FIRE: … break. Khi đó.LEFT:… break. chẳng hạn gán cho cả phím chức năng (trái. … //lấy loại hành động game để xử lý protected void keyRepeated (int keyCode) { switch (getGameAction (keyCode)) { case Canvas.vn . case Canvas. xuống) lẫn các phím số. lên.daihoc. người dùng có thể bấm phím chức năng sang trái hay phím số 4 đều phát sinh sự kiện game LEFT như nhau.7 Bắt sự kiện trong Game Action VD: //lấy mã phím tương ứng cho các hành động trong game: Chức năng lấy mã phím tương ứng với hành động game int keyFire = getKeyCode(FIRE).Java Mobile Các phương thức sử dụng cho lập trình game: Lớp Canvas: javax.lcdui. } } Một hành động game có thể gán cho nhiều phím bấm.microedition.com.Canvas Phương thức int getKeyCode (int gameAction) int getGameAction xác định hành động game tương ứng với mã phím cho trước (int keyCode) Bảng 5. 86 Sưu t m b i: www. phải. int keyRight = getKeyCode(RIGHT).

(x. int y) void pointerReleased(int x. Sự kiện con trỏ: MIDP cũng hỗ trợ các phương thức để lập trình trên thiết bị di động có sử dụng con trỏ như chuột hay màn hình cảm ứng. được gọi khi người dùng nhấn nút con trỏ được gọi khi người dùng nhả con trỏ Bảng 5. pointerReleased() cũng được khai báo trong lớp Canvas với thuộc tính protected nên nếu muốn xử lý sự kiện con trỏ cho chương trình phải khai báo hàm với tên tương ứng trong lớp con của chương trình và viết xử lý bên trong VD: protected void pointerPressed(int x.1.Canvas Phương thức boolean hasPointerEvents() Chức năng kiểm tra thiết bị có hỗ trợ con trỏ không chuyển động của con trỏ không void pointerDragged(int x.lcdui.Java Mobile 5.8 Sự kiện con trỏ Các sự kiện con trỏ cũng được xử lý tương tự các sự kiện phím bấm. pointerPressed(). pointerReleased() sẽ được gọi khi người dùng rê.daihoc. int y) được gọi khi người dùng rê con trỏ.com. nhấn nút hay nhả con trỏ. pointerPressed(). starty = y. } protected void pointerDragged(int x. int y) void pointerPressed(int x.y) là toạ độ con trỏ. int y) { // xác định vị trí điểm đầu boolean hasPointerMotionEvents() kiểm tra thiết bị có khả năng nhận các startx = x.vn . Lớp Canvas: javax. int y) { // xác định vị trí điểm hiện tại 87 Sưu t m b i: www.5. các phương thức pointerDragged().microedition. Các phương thức pointerDragged(). Nếu thiết bị có hỗ trợ xử lý sự kiện con trỏ.

com. currenty = y.Java Mobile currentx = x.vn .daihoc. } protected void pointerReleased (int x. endy = y. repaint(). int y) { //xác định vị trí điểm cuối endx = x. repaint(). } 88 Sưu t m b i: www.

Đối tượng Graphics được tạo theo cách này có giá trị cùng với đối tượng Image. VD: Image iImage=Image. 89 Sưu t m b i: www. Graphics: Đối tượng Graphics dùng để vẽ lên màn hình Canvas.Java Mobile 5. text. • Trong các đối tượng mutable image: Các immutable image thường được tạo từ file hay resource. không thay đổi. Do đó. người ta thường dùng immutable image làm biểu tượng cho các thành phần trong ChoiceGroup. đối tượng mutable image chỉ là một vùng nhớ có kích thước cố định được cấp khi khởi tạo.2. Graphics gGraphics=iImage. đường tròn. Ngược lại.com. Form. hình chữ nhật…).vn . List hay Alert. có tính cố định.getGraphics().createImage(80. Lớp Graphics cung cấp sẵn trên 30 phương thức hỗ trợ vẽ các đối tượng hình học cơ bản (đường thẳng. phông chữ… Có thể sử dụng lớp Graphics trong hai trường hợp: • Trong phương thức paint() của lớp Canvas: protected void paint(Graphics g){ … } đối tượng Graphics này chỉ có giá trị bên trong phương thức paint(). Khi đối tượng Image bị huỷ thì đối tượng Graphics tương ứng cũng bi huỷ theo. cũng như điều khiển màu sắc. ra khỏi phương thức này thì không còn dùng để vẽ lên Canvas được nữa.daihoc.20).

lcdui. style có thề mang 1 trong 2 giá trị Graphics.Java Mobile Các phương thức và chức năng của lớp Graphics: Lớp Graphics: javax.2.vn . mỗi màu chiếm 8 bit.DOTTED hay Graphics. kết hợp các giá trị 3 màu cơ bản (đỏ.microedition. xanh dương) trong một số nguyên void setColor (int red. Màu sắc: Màu sắc trong đối tượng Graphics được tạo từ 3 màu cơ bản là đỏ.1. Gán giá trị màu sắc theo các thành phần int blue) int getColor () int getBlueComponent() int getGreenComponent() int getRedComponent() void setGrayScale (int value) int getGrayScale () int getStrokeStyle () void setStrokeStyle (int style) riêng biệt Lấy giá trị màu Lấy giá trị thành phần màu xanh dương trong đối tượng Lấy giá trị thành phần màu xanh lục trong đối tượng Lấy giá trị thành phần màu đỏ trong đối tượng Gán giá trị grayscale Lấy giá trị grayscale hiện tại Lấy kiểu nét vẽ Gán kiểu nét vẽ. xanh lục và xanh dương(RGB) được biểu diễn bởi 24 bit màu.Canvas Phương thức void setColor (int RGB) Chức năng Gán giá trị màu sắc.SOLID Bảng 5.9 Lớp Graphics (Grayscale là một số nguyên kiểu int có giá trị từ 0 đến 255 biểu thị độ sáng của màu xám (shade of gray) ) 5. int green.daihoc. Nếu thiết bị không hỗ trợ hiển thị màu hay chỉ hỗ trợ với số màu ít hơn thì thiết bị sẽ tự chuyển 90 Sưu t m b i: www.com. lục.

xanh dương và xanh lục) trong một số nguyên kiểu int hay biểu diễn từng thành phần trong từng số int. int reen=127. R R R R R R R R G G G G G G G G GREEN B B B B B B B B RED BLUE Do đó. xanh lục và xanh dương. 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 RED g.vn . GREEN BLUE 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 //g là đối tượng kiểu Graphics //Gán giá trị cho từng màu cơ bản riêng biệt: 91 Sưu t m b i: www. int red=0. blue).Java Mobile đổi để hiển thị ra màu gần nhất so với yêu cầu. int blue=255.setcolor(red. g.daihoc. int green=127. green. Grayscale dùng để hiển thị các sắc độ màu khác nhau trên màn hình trắng đen. int blue=255.com. để kết hợp 3 giá trị màu này vào một số nguyên kiểu int. ta phải dịch bit để có kết quả chính xác. giá trị màu xanh lục dịch trái 8 bits và giá trị màu xanh dương chiếm 8 bit thấp nhất. có thể dùng một trong 2 cách: • Kết hợp 3 màu (đỏ. VD: int red=0.setColor(color). Khi kết hợp 3 màu với nhau. mỗi màu được biểu diễn bởi 8 bit và xếp theo thứ tự từ cao xuống thấp là đỏ. int color=(red<<16) | (green<<8) | blue. Giá trị màu đỏ sẽ dịch trái 16bits. Khi gán màu cho đối tượng Graphics.

92 Sưu t m b i: www. red. green. color= g.numColors().Display.microedition.Display. Ngoài ra có thể lấy số màu thiết bị có hỗ trợ bằng phương thức javax.lcdui. khi lấy giá trị màu. Có thể kiểm tra thiết bị di động có màn hình màu không bằng phương thức: javax.Java Mobile Tương tự. để có được giá trị màu cho từng màu cơ bản cần phải bỏ đi các bit không thích hợp. blue=color & 0xFF. Vd: int color. .getColor().microedition. Nếu lấy giá trị màu dưới dạng kết hợp. nếu thiết bị chỉ có màn hình trắng đen thì giá trị trả về là giá trị grayscale mặc định.com. //g là đối tượng kiểu Graphics red=(color & 0xFF0000)>>16. ta cũng có thể lấy ra dưới dạng kết hợp hay từng màu riêng biệt.isColor(). green=(color & 0xFF00)>>8. blue.vn .lcdui.daihoc.

void drawRect (int x. height và arcH là kích thước của hình chữ nhật ngoại tiếp góc cong void fillRect (int x.Canvas Phương thức int y2) int height. int height. int vẽ đường cong góc arcAngle bắt đầu từ height. int startAngle. int arcW. height void fillArc (int x.lcdui. Nét liền là giá trị mặc định của các kiểu vẽ. y1) đến void drawArc (int x.y) và chiều dài hai cạnh width. vẽ đường cong góc arcAngle bắt đầu từ 93 Sưu t m b i: www. int height. int y.vn .daihoc.2. int y. int arcH) chiều dài hai cạnh width.SOLID) hay cách khoảng (Graphics. int acrAngle) góc startAngle nội tiếp hình chữ nhật xác định bởi góc trái trên (x. int width. int y. vẽ hình chữ nhật với góc trái trên (x. int y.y) và int height) width. height và tô màu bên trong đường cong vừa vẽ. Vẽ đường thẳng từ điểm (x1.com. int arcH) Bảng 5.DOTTED). Các phương thức vẽ: Lớp Graphics: javax. int acrAngle) điểm (x2.10 Các phương thức vẽ void drawRoundRect (int x. int y. đường tròn. int tô hình chữ nhật height) void fillRoundRect (int x. int tô hình chữ nhật góc tròn width. hay hình chữ nhật.y) và chiều dài hai cạnh width.Java Mobile 5. ta có thể lựa chọn kiểu nét vẽ là nét liền (Graphics. int arcW. int vẽ hình chữ nhật với các góc tròn. Nét vẽ: Kiểu nét vẽ (stroke style): Khi vẽ đường thẳng. y2) góc startAngle nội tiếp hình chữ nhật xác định bởi góc trái trên (x. int width. int width. int x2. int y1. int y. int startAngle. int width.microedition.2. arcW Chức năng void drawLine (int x1.

không tô Hình chữ nhật thường.fillArc(5. 90. 5.1 Các phương thức vẽ đường cong Hình chữ nhật gồm 4 loại: • • • • Hình chữ nhật thường. 75. tô đặc Hình chữ nhật góc tròn. 75. 75.drawArc(5. không tô Hình chữ nhật góc cong. 360).drawArc(80. g.com. 90. g.fillArc(75.vn . 100. 225). 0. g. Hình 5.daihoc. 100. 300). tô đặc Hình chữ nhật góc tròn là hình chữ nhật trong đó các góc được vẽ theo dạng đường cong chứ không phải là góc vuông như hình chữ nhật thông thường. 100. 75. 5. 50. Trong đó các góc cong là ¼ đường cong nội tiếp hình chữ nhật kích thước rộng dài tương ứng là arcW và arcH. 70. VD: 94 Sưu t m b i: www. 0.Java Mobile VD: g. 75. 225).

int x. 40).2 Các phương thức vẽ hình chữ nhật Các phương thức hỗ trợ vẽ text : Lớp Graphics: javax.daihoc.microedition. 30. int x. vẽ ký tự character lên màn hình 95 Sưu t m b i: www.Graphics Phương thức int y. 60. 40. g.lcdui. int anchor) void drawChars (char[] data.fillRect(1. 60. g.fillRoundRect(70. 30.com. 50. int vẽ chuỗi str lên màn hình y. 40).drawRect(1. g. int x. int vẽ chuỗi ký tự data với chiều dài length offset. 1.vn . int anchor) Chức năng void drawChar (char character. Hình 5. int từ vị trí offset lên màn hình anchor) void drawString (String str. int length.drawRoundRect(70. 60. 1. 40. int y. 60.Java Mobile g. 40). 40). 50.

y và anchor.microedition. nghĩa là điểm giữa trùng với điểm giữa của màn hình g.HCENTER ).12 Giá trị Anchor Khi sử dụng. 0.lcdui.LEFT).TOP| Graphics. bất kể đó là một ký tự hay một chuỗi ký tự. Graphics. //vẽ chuỗi “Hello J2ME” ngay giữa màn hình.drawString (str.com. và anchor là vị trí tương đối của điểm gốc so với đoạn text sẽ được hiển thị. y) là toạ độ điểm gốc.drawString (str. Graphics. getHeight()/2. gồm: Lớp Graphics: javax. int x.daihoc. Các vị trí tương đối của anchor đã được định nghĩa sẵn trong lớp Graphics. VD: //vẽ chuỗi “Hello J2ME” với góc trái trên trùng góc trái trên của màn hình Vị trí chiều ngang chiều ngang chiều ngang chiều dọc chiều dọc chiều dọc g. biến anchor thường được kết hợp bởi hai kiểu định vị theo chiều ngang và chiều dọc để được vị trí tương đối của điểm gốc.vn . 96 Sưu t m b i: www. int len. từ vị trí offset. Trong đó. int anchor) Font getFont() void setFont () offset của chuỗi str lên màn hình lấy đối tượng Font hiện tại gán Font cho đối tượng Graphics Bảng 5. ta phải cung cấp đủ ba tham số: x. 0. getWidth()/2. (x.11 Xử lý Text Khi vẽ text lên màn hình.Graphics Tên anchor LEFT HCENTER RIGHT TOP BASELINE BOTTOM Mô tả lề trái của ký tự / chuỗi điểm giữa của ký tự / chuỗi lề phải của ký tự / chuỗi điểm cao nhất của ký tự / chuỗi dòng chuẩn của ký tự / chuỗi điểm cao nhất của ký tự/ chuổi Bảng 5.Java Mobile void drawSubstring (String str. int vẽ chuỗi con có chiều dài len . int y.BASELINE| Graphics.

daihoc.BOTTOM | Graphics.com.RIGHT). getWidth().4 Các định dạng trong Text Graphic 97 Sưu t m b i: www. Hình 5.Java Mobile //vẽ chuỗi “Hello J2ME” với phải dưới trên trùng góc phải dưới của màn hình g. Graphics.vn . getHeight().3 Các phương thức hỗ trợ vẽ Text Hình 5.drawString (str.

microedition. int length) int stringWidth (String str) str.daihoc. Font chữ: Lớp Font: Lớp Font: javax.Java Mobile 5.13 Xử lý Font chữ int substringWidth (String lấy độ rộng chuỗi con của chuỗi ký tự ch dạng tạo đối tượng Font mặc định lấy face hiện tại lấy kiểu chữ (đậm. int length) lấy độ rộng chuỗi ký tự ch dạng String String bắt đầu từ vị trí offset với độ dài length Bảng 5.3.com.lcdui. int lấy độ rộng của chuỗi ký tự ch dạng mảng char 98 Sưu t m b i: www. int offset.vn . int size) static Font getDefaultFont () int getFace () int getStyle () int getSize () boolean isPlain () boolean isBold () boolean isItalic () boolean isUnderlined () int getHeight () int getBaselinePosition () int charWidth (char ch) offset. in nghiêng.2. gạch dưới) lấy cỡ chữ kiểm tra có đang dùng kiểu chữ thường không kiểm tra có đang dùng kiểu chữ đậm không kiểm tra có đang dùng kiểu chữ in nghiêng không kiểm tra có đang dùng kiểu chữ gạch dưới không lấy kích thước font (khoảng cách giữa 2 dòng chữ) lấy độ cao chữ lấy độ rộng của ký tự ch Chức năng static Font getFont (int face. tạo đối tượng Font int charsWidth (char[] ch.Font Phương thức int style.

có thể kết hợp các định dạng trong cùng một đối tượng Font bằng toán tử OR. thuộc tính face và cỡ chữ của font chỉ được sử dụng duy nhất một loại định dạng cho một đối tượng. VD: 0 32 64 0 1 2 4 8 0 16 Tên thuộc tính Mô tả Giá trị 99 Sưu t m b i: www.lcdui. Các định dạng của mỗi loại thuộc tính đã được định nghĩa sẵn trong lớp Font với. kiểu chữ (style) và kích thước.com.14 Các giá trị Font Trong đó.Font Loại thuộc tính FACE_SYSTEM Face FACE_MONOSPACE FACE_PROPORTIONAL STYLE_PLAIN Style STYLE_BOLD STYLE_ITALIC STYLE_UNDERLINED SIZE_SMALL Size SIZE_MEDIUM SIZE_LARGE chữ thường in đậm in nghiêng gạch dưới cỡ chữ nhỏ cỡ chữ trung bình cỡ chữ lớn Bảng 5.Java Mobile Lớp Font không có phương thức khởi tạo nghĩa là không cần “new” để tạo đối tượng mới. Các thuộc tính cần quan tâm khi tạo mớo một font gồm: face.microedition. ta gọi thực hiện một trong hai phương thức getFont() hay getDefaultFont() để tạo đối tượng Font. gồm: Lớp Font: javax.vn .daihoc. Riêng với thuộc tính kiểu chữ. thay vào đó.

Java Mobile //tạo đối tượng Font có thuộc tính Face kiểu system. isBold().getSize(). int size = font.getFont( Font.com.SIZE_MEDIUM). Hình 5.STYLE_ITALIC | Font. cỡ chữ của đối tượng Font int face = font.5 Các phương thức tạo font //lấy thuộc tính face.STYLE_BOLD | Font.IsItalic()) … 100 Sưu t m b i: www.getStyle(). Font. if (style== (Font.IsBold() && font. isItalic() và isUnderlined() if (font.vn .getFace().STYLE_ITALIC)) … //cách 2: sử dụng các phương thức kiểm tra isPlain(). cỡ chữ trung bình và có kiểu chữ in nghiêng và đậm: Font font= Font.daihoc.FACE_SYSTEM.STYLE_BOLD | Font. Font. //kiểm tra kiểu chữ đối tượng Font: //cách 1: int style = font.STYLE_UNDERLINED.

int vẽ đối tượng Image img lên màn hình g. Đối tượng Image gồm hai loại: có thể thay đổi hình ảnh (Mutable Image) và hình ảnh cố định (Immutable Image).TOP). 2. Tạo đối tượng hình ảnh (thường là load trực tiếp từ file): Image img= Image.drawImage(img.Java Mobile 5.LEFT | Graphics.15 Vẽ hình ảnh Đây chỉ là bước cuối cùng để vẽ một hình ảnh lên màn hình.microedition. Vẽ các đối tượng hình ảnh (image): Lớp Graphics hỗ trợ một phương thức duy nhất để vẽ hình ảnh lên màn hình.com. 10. Graphics. int anchor) Bảng 5.Graphics Phương thức y. } Hình 5.png”).daihoc.4. Hiển thị đối tượng lên màn hình: protected void paint (Graphics g) { … Mô tả void drawImage (Image img. đó là: Lớp Graphics: javax. Các bước để vẽ đối tượng Image lên màn hình: • Immutable Image: 1. 10.6 Vẽ bằng đối tượng Immutable Image 101 Sưu t m b i: www.createImage (“\imageTest.vn . int x.2. các bước trước đó dùng để tạo đối tượng Image cũng như load hình ảnh lên đối tượng đó.lcdui.

7 Vẽ bằng đối tượng Mutable Image Khi gọi phương thức vẽ đối tượng Image lên màn hình.vn . 0.100).Java Mobile • Mutable Image: Khởi tạo đối tượng. anchor như khi vẽ text. đó là không sử dụng anchor BASELINE(đường chẩn của ký tự / chuỗi) mà thay vào đó là VCENTER để chỉ điểm giữa theo chiều dọc của hình ảnh Lớp Graphics: javax. 20). y. Tuy nhiên.HCENTER). Graphics.Graphics Tên anchor LEFT HCENTER RIGHT TOP Mô tả lề trái của hình ảnh điểm giữa của hình ảnh lề phải của hình ảnh điểm cao nhất của hình ảnh Vị trí chiều ngang chiều ngang chiều ngang chiều dọc 102 Sưu t m b i: www. Hình 5. //dùng đối tượng Graphics vừa lấy vẽ các hình ảnh lên đối tượng Image: g. 20. yêu cầu chương trình cấp một vùng nhớ với kích thước cho trước của hình ảnh: Image img = Image. Vẽ hình ảnh lên đối tượng : //lấy đối tượng Graphics tương ứng của đối tượng Image: Graphics g = img.getGraphics().lcdui. ta cũng phải truyền các tham số x. 10. 50. 50.createImage(80.com. các loại anchor của hình ảnh tương đối khác với text.drawImage(img. } 10.daihoc.fillRoundRect (0.VCENTER | Graphics. … Hiển thị hình vừa vẽ lên màn hình: protected void paint (Graphics g) { … g.microedition.

và cũng chỉ có ý nghĩa trong lần gọi hàm đó.Graphics Phương thức void translate(int x. VD: //khi người dùng nhấn phím mũi tên xuống thì tịnh tiến hình ảnh xuống một pixel: Mô tả tịnh tiến điểm gốc (0. Các phương thức tịnh tiến đối tượng: Để đơn giản khi biểu diễn sự tịnh tiến của các đối tượng hình ảnh trên màn hình. Lớp Graphics: javax. 0) của đối tượng Graphics 103 Sưu t m b i: www. Nếu gọi thực hiện phương thức repaint() mà không gọi translate() lần nữa thì toạ độ gốc sẽ trở về vị trí (0.0) ban đầu.com.5.8 Các định dạng vị trí trong Graphics 5.17 Các phương thức tịnh tiến Khi gọi thực hiện phương thức translate() để tịnh tiến hình ảnh trên màn hình thì chỉ có gốc tọa độ bị thay đổi vị trí.16 Giá trị Image Anchor Hình 5. Khi cần tịnh tiến các đối tượng trên màn hình thì chỉ cần tịnh tiến gốc toạ độ đến vị trí mới.vn .daihoc.y) lấy khoảng cách trên trục hoành đã bị tịnh tiến lấy khoảng cách trên trục tung đã bị tịnh tiến Bảng 5.Java Mobile VCENTER BOTTOM điểm giữa của hình ảnh điểm cao nhất của hình ảnh chiều dọc chiều dọc Bảng 5.2. lớp Graphics cho phép người lập trình vẽ các đối tượng ở vị trí cố định. int y) int getTranslateX() int getTranslateY() đến vị trí (x.microedition.lcdui. các hình ảnh của đối tượng Graphics sẽ tịnh tiến theo.

0. break.LEFT | Graphics. //tịnh tiến gốc toạ độ g. } protected void paint(Graphics g){ if (im != null){ //xoá màn hình g. translatey). getHeight()).vn ..0 g. getWidth(). 0.translate(translatex. } repaint().fillRect(0.TOP). g.com. // luôn vẽ ở vị trí 0. else translatey ++. . } } 104 Sưu t m b i: www. 255).daihoc. 255. case DOWN: if ((translatey + img.getHeight() + 1) > getHeight()) translatey = 0..drawImage(im.setColor(255..Java Mobile protected void keyPressed(int keyCode) { switch (getGameAction(keyCode)) { . 0.. Graphics.

width.Graphics Phương thức width. int vùng xén là phần giao của vùng xén hiện tại 105 Sưu t m b i: www. int y.daihoc.com. làm giảm thời gian cần để vẽ lại màn hình. Vùng xén (Clipping regions): Mỗi lần gọi phương thức paint(). Canvas. int y.microedition. int xác định vùng xén (hình chữ nhật góc trái trên void clipRect (int x.0. height) Lấy toạ độ x góc trái trên của vùng xén Lấy toạ độ y góc trái trên của vùng xén Lấy độ dài vùng xén Lấy độ rộng vùng xén Bảng 5. int height) int getClipX () int getClipY () int getClipHeight () int getClipWidth () Mô tả (x. toàn bộ màn hình sẽ được vẽ lại. nếu không tạo vùng xén thì vùng xén mặc định sẽ là hình chữ nhật bao của màn hình (tức là hình chữ nhật (0.getHeight()) ) Các phương thức hỗ trợ xén: Lớp Graphics: javax.lcdui. y) kích thước hai cạnh là width và height) với hình chữ nhật (x.6.2.vn .getWidth(). y. int height) width.18 Vùng xén void setClip (int x. Bình thường.Canvas.Java Mobile 5. Vùng xén được dùng để giới hạn lại vùng cần vẽ lại.

Môi trường MIDP không hề đặt ra bất kỳ một đặc tả nào qui định về hệ thống file (file system) trên các thiết bị di động. do đó trên các thiết bị này chúng ta không hề có khái niệm file hay directory. CLDC/MIDP có một công cụ riêng phục vụ cho công việc này. Với các chương trình viết cho máy tính để bàn. đó là RMS (Record Management System). sắp xếp thông tin. Giới thiệu RMS Việc lưu trữ và truy xuất thông tin có thể xem là một yêu cầu bắt buộc với các ứng dụng ngày nay.Java Mobile Chương 6: Lưu trữ thông tin với RMS 6.1. công việc lưu trữ thông tin trên môi trường di động có nhiều khác biệt.vn . đĩa CD. Lưu trữ thông tin thông qua các Record Store 106 Sưu t m b i: www. Điều này gây nhiều ngạc nhiên cho những lập trình viên bắt đầu nghiên cứu về J2ME.daihoc. Ghi chú: Khái niệm lưu trữ thông tin ở phần này đề cập đến việc lưu trữ lâu dài. không bị mất khi ngắt nguồn điện (persistent storage) chứ không đề cập đến việc lưu trữ lên bộ nhớ trong (RAM). các đĩa trên môi trường mạng… Tuy nhiên. chúng ta còn được hỗ trợ các công cụ để lọc thông tin. tìm kiếm thông tin trên các records. tuy nhiên nếu chúng ta biết rằng MIDP hướng đến việc lập trình trên các môi trường có tài nguyên hạn chế như các đầu thu tín hiệu truyền hình số. Chúng ta có thể lưu trữ thông tin vào đĩa cứng.com. công việc này được các ngôn ngữ lập trình hỗ trợ rất tốt. Việc lưu trữ sẽ được thực hiện thông qua các record. máy nhắn tin pagers… thì việc qui định các chuẩn về hệ thống tập tin là không cần thiết và bất khả thi. Điều này không có nghĩa rằng chúng ta không thể lưu trữ thông tin trên các thiết bị di động.

mỗi record store được phân biệt bởi tên định danh duy nhất. Mỗi dòng record có một số ID và gồm một mảng các bytes. Tên của record store có thể chứa đến 32 ký tự Unicode (16 bits) và tên này phân biệt hoa thường. thiết bị MIDP lưu trữ thông tin qua các record stores. các Record Stores của các ứng dụng MIDlet cùng chung một bộ (suite) thì cũng phải có tên phân biệt. Các ứng dụng MIDlet không những truy xuất được các record stores do nó tạo ra mà còn truy xuất được các record stores do các ứng dụng khác trong cùng một bộ (MIDlet Suite) tạo ra. Một tập hợp các record này được gọi là một record store (tương ứng với một bảng dữ liệu).vn . Bảng 6. Record ID 1 2 3 …………….Java Mobile Thay thế cho hệ thống file.com. Một record store quản lý hai thông số để quản lý việc truy cập dữ liệu. hai thông số này tự động được cập nhật khi có record được thêm. Người ta thường xem record store như một cấu trúc file phẳng (flat-file). Đây là một hạn chế của Record Store khi so sánh với hệ thống file trên các thiết bị khác. xóa hay sửa: 107 Sưu t m b i: www. Data Mảng các bytes Mảng các bytes Mảng các bytes …………………. Mở rộng ra.daihoc. Chúng ta có thể xem các record store này như một bảng dữ liệu gồm nhiều dòng record. Một ứng dụng MIDlet có thể có bao nhiêu record store tùy ý (kể cả không có).1 Mô hình Record Store Mỗi record có một trường Record ID có kiểu dữ liệu integer. tuy nhiên các MIDlet không cùng một suite không thể truy xuất Record Suite của nhau. đóng vai trò như khóa chính trong bảng dữ liệu và một trường “Data” là một mảng các bytes để chứa dữ liệu. Đây là một lý do khiến các nhà phát triển đặt ra khái niệm MIDlet Suite.

int numBytes) void deleteRecord(int RecordID) byte[] getRecord(int RecordID) Xóa một record khỏi record store Lấy mảng byte chứa nội dung record Thay đổi nội dung một record. có một điều không may là giá trị khởi điểm của version không được định nghĩa bởi API.daihoc.Java Mobile • Số Version : đây là một giá trị integer. ngay sau khi tạo record mới ta có thể gọi hàm getVersion().rms. int numBytes) void setRecord(int recordID. tùy chọn tạo mới nếu record store chưa tồn tại.microedition. Các hàm xử lý Record Store thông dụng: Lớp javax.int offset. Chúng ta có thể lấy ra thông số này bằng hàm getLastModified().byte[] newData. Nếu chúng ta cần biết giá trị ban đầu này. boolean createIfNeccessary) void closeRecordStore() static void deleteRecordStore(String rcdStoreName) static String[] listRecordStore() int addRecord(byte[] data. Liệt kê các record stores trong MIDlet Suite Thêm một record Đóng record store Xóa record store Mô tả Mở một record store. Constructor: Không có phương thức khởi tạo 108 Sưu t m b i: www. Tuy nhiên.RecordStore Phương thức static RecordStore openRecordStore(String recordStoreName. int offset. thể hiện số millisecond tính từ nửa đêm ngày 1/1/1970.com. Các yêu cầu xử lý record store được thiết bị đồng bộ hóa tự động: khi có hai hay nhiều yêu cầu xử lý thì yêu cầu đến trước được xử lý trước và các yêu cầu xử lý khác sẽ được đặt vào hàng đợi.vn . • Ngày tháng: là một số long.

2 Lớp RecordStore Ghi chú: Record ID được tính bắt đầu từ 1 chứ không phải từ 0 như chỉ số mảng.Java Mobile int getRecord(int RecordID.*. Ví dụ đã được tinh giản và chỉ trình bày những phân đoạn chính.microedition. 109 Sưu t m b i: www. RecordComparator comparator.midlet. import javax. boolean keepUpdate) listener) void removeRecordListener (RecordListener listener) Lấy nội dung record từ vị trí offset đưa vào mảng byte.vn .io. Sau đây là một ví dụ về việc nhập xuất dữ liệu thông qua record store bằng kỹ thuật stream.daihoc. byte[] buffer. (sẽ được đề cập sau) Store (sẽ được đề cập sau) Gỡ bỏ bộ nghe (sẽ được đề cập sau) void addRecordListener(RecordListener Thêm một bộ lắng nghe trên Record Bảng 6.com. Bổ sung chức năng duyệt các record dưới dạng một tập hợp. //Import các thư viện cần thiết import java. int offset) int getRecordSize(int RecordID) int getNextRecordID() int getNumRecords() long getLastModified() int getVersion() String getName() int getSize() int getSizeAvailable() RecordEnumeration enumerateRecords (RecordFilter filter.*. Lấy kích thước của record Lấy ID của record tiếp theo Lấy số lượng Record trong Record Store Thời điểm thay đổi cuối cùng của Record Store Lấy version của Record Store Lấy tên của Record Store Tổng số bytes được sử dụng bởi Record Store Lấy dung lượng còn lại (bytes) được phép dùng bởi Record Store.

110 Sưu t m b i: www. notifyDestroyed(). chương trình sẽ ghi. // Hàm ghi dữ liệu readStream(). true ).daihoc. // Record Store static final String REC_STORE = "db_1".com.rms. // Tên của Record Store public ReadWriteStreams() { openRecStore(). // Hàm đọc dữ liệu closeRecStore(). // Hàm tạo Record Store writeTestData(). } public void openRecStore() { try { // Tạo record store mới nếu chưa tồn tại rs = RecordStore.*. đọc dữ liệu và thoát destroyApp(false).microedition. // Xóa Record Store } … public void startApp() { // Không có giao diện.closeRecordStore().Java Mobile import javax.openRecordStore(REC_STORE. // Đóng Record Store deleteRecStore(). public class ReadWriteStreams extends MIDlet { private RecordStore rs = null. } catch (Exception e) { //Xuất thông báo lỗi } } public void closeRecStore() { try { rs.vn .

boolean[] bData. true}.listRecordStores() != null){ try{ RecordStore.daihoc.com.deleteRecordStore(REC_STORE). writeStream(strings. boolean[] booleans = {false. integers).Java Mobile } catch (Exception e) { //Xuất thông báo lỗi } } public void deleteRecStore(){ if (RecordStore. booleans. } /*-------------------------------------------------* Viết vào record store dùng stream *-------------------------------------------------*/ public void writeStream(String[] sData. "String 2"}.vn . 2}. int[] integers = {1 . int[] iData) { try{ 111 Sưu t m b i: www. } catch (Exception e){ //Xuất thông báo lỗi } } } /*-------------------------------------------------* Tạo 3 mảng để mô phỏng việc ghi dữ liệu *-------------------------------------------------*/ public void writeTestData() { String[] strings = {"String 1".

//Ba mảng có kích thước bằng nhau for (int i = 0. strmDataType.reset().daihoc. strmDataType. // Biến dữ liệu trong stream thành dạng mảng để ghi vào //record. byte[] record. ở đây ta tạo ra 2 streams. strmDataType.vn .close(). i < sData.flush().close(). DataOutputStream strmDataType = new DataOutputStream(strmBytes).length). đóng các stream strmBytes.writeBoolean(bData[i]).toByteArray().length.writeUTF(sData[i]). strmDataType. } //Sau khi hoàn tất việc ghi các mảng. rs.Java Mobile /* Tạo stream để viết dữ liệu. stream còn lại để ghi dữ liệu vào Record*/ //Buffer ByteArrayOutputStream strmBytes = new ByteArrayOutputStream(). // Xóa hết dữ liệu trong buffer để tiếp tục ghi các phần //tử tiếp theo của mảng strmBytes. i++) { // Ghi dữ liệu strmDataType. record.com. } 112 Sưu t m b i: www. một stream có tác dụng như buffer.addRecord(record.writeInt(iData[i]). 0. vì các record chỉ chấp nhận dữ liệu dạng mảng record = strmBytes.

0). i <= rs.out. System.println("--------------------"). System.readUTF()).println("Int: " + strmDataType.readInt()).daihoc.println("UTF:" + strmDataType.getRecord(i. for (int i = 1.Java Mobile catch (Exception e){ //Xuất các thông báo lỗi } } /*-------------------------------------------------* Đọc lại dữ liệu đã được ghi *-------------------------------------------------*/ public void readStream(){ try{ // Tạo một mảng có kích thước đủ lớn // Trong thực tế nên kiểm tra và cấp phát lại kích thước nếu cần byte[] recData = new byte[50]. // Tạo một stream làm buffer lấy dữ liệu từ mảng recData ByteArrayInputStream strmBytes = new ByteArrayInputStream(recData).out. System. // Tạo stream để xuất dữ liệu theo đúng khuôn dạng đã ghi DataInputStream strmDataType = new DataInputStream(strmBytes).com.getNumRecords().readBoolean()).out.reset().out.println("Record #" + i). // Xóa dữ liệu buffer để bắt đầu ghi các phần tử tiếp theo strmBytes. System.out. i++){ // Lấy dữ liệu đưa vào mảng rs.vn . 113 Sưu t m b i: www. recData.println("Boolean: " + strmDataType. // Đọc lại theo đúng thứ tự đã ghi System.

Tương tự như các hàm truy xuất I/O khác của Java. strmDataType. Ví dụ đã được tinh giản và chỉ nêu các hàm thật cần thiết. các hàm liên quan đến Record Store cần phải được đưa vào trong khối try – catch vì các hàm này có thể phát sinh các exceptions. 114 Sưu t m b i: www. Nếu ta cố gắng truy xuất phần tử số 0 sẽ phát sinh lỗi. do đó khi chúng ghi theo trình tự nào thì xuất cũng phải theo trình tự đó.Java Mobile } strmBytes. đọc record.close(). Việc mở.vn . Trong ví dụ trên có một số điểm ta cần chú ý: Chỉ số RecordID bắt đầu từ 1 chứ không phải từ 0 như chỉ số của các phần tử trong mảng.close(). ghi record.com. } catch (Exception e){ //Xuất các thông báo lỗi } } … } Ví dụ trên đã nêu một cách cơ bản nhất các bước cần thiết để ghi dữ liệu và truy xuất dữ liệu bằng record store.daihoc. Trong ví dụ trên chúng ta dùng stream để ghi và xuất dữ liệu có khuôn dạng. đóng và xóa record được thể hiện thành từng hàm riêng biệt để tiện theo dõi.

Vậy khi ta duyệt bằng vòng lặp. Giả sử chúng ta có 3 record đánh số từ 1 đến 3.false). Lớp RecordEnumeration không có phương thức khởi tạo (constructor).Java Mobile 6. Ngoài ra. chúng ta bắt buộc phải duyệt bằng công cụ enumeration.nextRecord()). Tuy nhiên. Duyệt danh sách Record với RecordEnumeration Ngay trên ví dụ vừa rồi.hasNextElement()) { // lấy thông tin record tiếp theo ra buffer String str = new String(re. Khi đó. vì lý do nào đó chúng ta xóa record số 2 bằng phương thức deleteRecord(int RecordID) thì số 2 không bao giờ được sử dụng để gán làm RecordID cho một record khác.enumerateRecords(null.com. khi chúng ta sử dụng các chức năng lọc (filter) và sắp xếp (sort) các record. khi giá trị i=2 sẽ gây ra một lỗi exception. chúng ta duyệt qua danh sách các records trong record store bằng dòng lặp. Chúng ta đề cập đến khái niệm “chính xác hơn” ở đây vì lý do khi duyệt bằng vòng lặp thực chất có thể gây nên một exception trong chương trình. Đây là các tiếp cận được những lập trình viên nghĩ đến ban đầu vì chúng ta đã nhận định các record như các dòng trong một bảng của CSDL.2. ta tạo ra RecordEnumeration bằng phương thức enumerateRecord(…) của lớp RecordStore Ví dụ: RecordEnumeration re = rs.daihoc. chỉ tốn một vài dòng lệnh. giả sử i từ 1 đến 3. giá trị trả về sẽ là một RecordEnumeration vì các RecordID lúc này không tuân theo bất kỳ một thứ tự nào cả. Việc tạo ra một RecordEnumeration là một công việc đơn giản. while (re.null.vn . MIDP cung cấp cho chúng ta một công cụ thuận tiện và chính xác hơn để duyệt qua các record trong một record store. //xử lý tùy theo yêu cầu } 115 Sưu t m b i: www.

daihoc. duyệt theo thứ tự lùi (backward) Lấy RecordID của record trước đó Kiểm tra còn record để tiếp tục duyệt tiến (forward) hay không? Kiểm tra còn record để tiếp tục duyệt lùi (backward) hay không? Bật. nếu là false chúng ta phải tự cập nhật bằng hàm rebuild().com. xóa hay sửa) biến RecordEnumeration sẽ tự cập nhật. • Tham số cuối cùng là một biến boolean bUpdate. tắt chế độ tự cập nhật của enum 116 Sưu t m b i: www.Java Mobile Hàm enumerateRecord nhận vào ba tham số: • Tham số đầu là bộ lọc (filter). Nếu cả hai tham số trên đều là null thì các record được lấy ra và sắp xếp theo thứ tự bất kỳ.RecordEnumeration Phương thức Construtor int numRecords() byte[] nextRecord() int nextRecordId() byte[] previousRecord() int previousRecordId() boolean hasNextElement() bolean hasPrevioussElement() void keepUpdate(boolean keepUpdate) boolean isKeptUpdate() Kiểm tra xem enum có chức năng tự cập nhật hay không? Chức năng Không có constructor.vn . nếu bUpdate là true thì khi danh sách các record có sự thay đổi (bị thêm. duyệt theo thứ tự tiến (forward) Lấy RecordID của record kế tiếp Lấy record trước đó. nếu không muốn lọc record ta để null • Tham số thứ nhì là bộ sắp xếp (sort). nếu không muốn sắp xếp ta cũng để null. Sau đây là các hàm thông dụng nhất của lớp RecordEnumeration Lớp javax.microedition. tạo từ lớp RecordStore Số lượng records trong tập hợp Lấy record kế tiếp.rms.

khi có nhu cầu sắp xếp dữ liệu thì ứng dụng của ta phải cài đặt (implements) interface này. đó là RecordComparator. if (result == 0) return RecordComparator. Sau đây là một ví dụ của lớp có cài đặt interface RecordComparator: public class Comparator implements RecordComparator { public int compare(byte[] rec1.3.PRECEDES.daihoc. byte[] rec2) { String str1 = new String(rec1). RecordComparator là một Java interface. str2 = new String(rec2). Hàm này trả về 3 giá trị đặc biệt đã được định nghĩa trước là: 117 Sưu t m b i: www.compareTo(str2).byte[]). Sắp xếp bằng RecordComparator Yêu cầu sắp xếp dữ liệu là một yêu cầu thường được đặt ra cho các ứng dụng tiện ích. lúc vừa khởi tạo Trả lại hết tài nguyên giữ bởi biến enum này. Công việc này trên các máy desktop thường được thực hiện thông qua các hệ quản trị cơ sở dữ liệu. Bảng 6.EQUIVALENT.Java Mobile void rebuild() void reset() void destroy() Tự cập nhật lại enumeration Đưa enumeration về trạng thái ban đầu.3 Lớp RecordEnumeration 6. else return RecordComparator.com.FOLLOWS. } } Chúng ta cài đặt interface này bằng cách cung cấp hàm int compare(byte[]. else if (result < 0) return RecordComparator.vn . trên môi trường J2ME chúng ta cũng có một công cụ khá hiệu quả để sắp xếp dữ liệu trên Record Store. int result = str1.

// Tạo đối tượng enum.enumerateRecords(null. // Duyệt danh sách thông qua enum while (re. byte[] r2) Tùy theo giá trị trả về của hàm mà record r1 sẽ được xếp trước record r2. int compare (byte[] r1.4 Các giá trị hằng để sắp xếp record 118 Sưu t m b i: www. Record r1 được xem là “nhỏ hơn” r2 và sẽ xếp trước.FOLLOWS Khi đó. thực chất lúc này r1 được xếp trên r2 vì không có sự thay đổi thứ tự Record r1 được xem là “lớn hơn” r2 và sẽ xếp sau..Java Mobile • RecordComparator. Hàm này nhận vào hai tham số là hai mảng byte (là 2 record dùng để so sánh).daihoc.nextRecord()).hasNextElement()) { String str = new String(re. } Lúc này hàm compare trong lớp Comparator sẽ được dùng làm cơ sở để sắp xếp các record. để bắt đầu quá trình sắp xếp và xử lý dữ liệu ta tạo ra một đối tượng Comparator (lớp có cài đặt RecordComparator) và một RecordEnumeration: // Tạo đối tượng Comparator để sắp xếp Comparator comp = new Comparator().com.comp. Giá trị EQUIVALENT FOLLOWS PRECEDES Ý nghĩa Record r1 và r2 được xem là bằng nhau.false). tham số thứ nhì là comparator RecordEnumeration re = rs. ..EQUIVALENT • RecordComparator. xếp sau r2 hay 2 records được xem là “bằng nhau”.PRECEDES • RecordComparator.vn . Bảng 6.

J2ME còn hỗ trợ chúng ta công cụ lọc các record. RecordFilter là một interface. Bài toán được giải quyết như sau: public class YearFilter implements RecordFilter{ private int Year=1990. khi ta có nhu cầu lọc record thì ta phải cài đặt (implements) interface này qua hàm boolean matches(byte[] candidate).Java Mobile Lúc này. quá trình này ứng dụng sẽ sắp xếp tất cả các records có trong record store. Phần vừa rồi chúng ta đề cập đến việc sắp xếp các record và đưa vào tập hợp.vn . Lọc record với RecordFilter Ngoài chức năng sắp xếp các record. 6.4. Ta cần lấy ra danh sách những người sinh trước năm 1990.com. Sau đó việc so sánh 2 records trên thực chất là việc so sánh 2 biến trung gian. Tùy theo nhu cầu sort ta sẽ gán giá trị trả về cho hàm compare của lớp Comparator một cách tương ứng. 119 Sưu t m b i: www. trường HoTen được lưu dưới dạng String UTF8 và trường năm sinh lưu dưới dạng integer. Nếu chúng ta chỉ có nhu cầu lấy ra và sắp xếp các record thỏa mãn một yêu cầu nhất định nào đó (ví dụ trường năm sinh trong record phải nhỏ hơn 1990) thì ta phải dùng thêm công cụ RecordFilter. kết quả trả về sẽ là một tập hợp (enum) đã được sắp thứ tự và ta có thể thao tác trên tập hợp này một cách bình thường. Giả sử ta có bài toán lọc theo năm sinh như sau: Trong một record sẽ có hai trường. khi ta dùng hàm enumerateRecords(…) của lớp RecordStore. Hàm matches(byte[] candidate) này nếu trả về giá trị true thì record candidate sẽ có mặt trong RecordEnumeration. ngược lại nếu trả về giá trị false thì record sẽ bị loại.daihoc. Nguyên lý sort thực chất cũng khá đơn giản: đối với những record gồm nhiều trường (compound record). khi chúng ta có nhu cầu chỉ search trên một trường bất kỳ thì trước nhất phải đọc trường đó của 2 record cần so sánh ra 2 biến trung gian. Cũng giống như RecordComparator.

} } public class MIDletApp extends MIDlet { … MIDletApp{ YearFilter filter=new YearFilter. Hoten=dataStrm.Java Mobile public boolean matches(byte[] candidate) { String HoTen.daihoc. DataInputStream dataStrm=new DataInputStream(strm).readUTF().true). while (enum.com.vn . NamSinh=dataStrm.enumerateRecords(filter. ByteArrayInputStream strm=new ByteArrayInputStream(candidate). return (NamSinh<Year) ? true:false.hasNextElement()) { //Xuất danh sách các cá nhân thỏa yêu cầu } } 120 Sưu t m b i: www.readInt().null. RecordEnumeration enum=rs. Int NamSinh.

J2ME cung cấp cho chúng ta interface RecordListener. Được gọi khi một record bị xóa khỏi record store. Phương thức void recordAdded(RecordStore recordStore. Khi lớp ứng dụng của ta cài đặt interface này. Bảng 6.5 Lớp RecordListener Các hàm sự kiện trên đều có hai tham số: • RecordStore recordStore: cho biết record store nào bị thay đổi.5. nếu có sự biến đổi nào trên các records của bộ record store chúng ta sẽ nhận được thông điệp thông qua các hàm recordAdded().com. Nhận thông điệp khi Record Store thay đổi Đôi khi chúng ta có nhu cầu cần được thông báo mỗi khi các records trong record store bị thay đổi. Interface này hoạt động tương tự các interface chúng ta đã đề cập đến trong phần RMS này.vn .daihoc. int recordId) recordId) void recordDeleted(RecordStore recordStore.Java Mobile 6. • int recordID: cho biết ID của record bị thay đổi void recordChanged(RecordStore recordStore. xóa hay được thêm vào. Để phục vụ cho nhu cầu này.int Được gọi khi có một record bị 121 Sưu t m b i: www. int recordId) Ý nghĩa Được gọi khi có một record được thêm vào record store thay đổi nội dung. recordChanged() và recordDeleted().

lang. sau đây là danh sách các exception trên và ý nghĩa của chúng: InvalidRecordIDException: Được dùng để thông báo người dùng truy xuất đến RecordID không hợp lệ.daihoc.int. được phát sinh khi có lỗi xảy ra do truy xuất record store. Constructor: public InvalidRecordIDException(String message) public InvalidRecordIDException() RecordStoreException: Một exception dạng “chung chung”.Throwable.add Record(byte[].Java Mobile 6.int) để thêm một record. Ví dụ như khi hàm RecordStore.getRecord(int ID) được gọi và tham số ID bằng 0 thì exception này sẽ phát sinh.vn . Tất cả các exception này đều kế thừa từ lớp java. nếu record này đã đạt đến dung lượng tối đa sẽ phát sinh exception dạng này. Xử lý lỗi khi thao tác với Record Store Hãng Sun đã đặt ra tổng cộng 5 exceptions dành riêng cho việc xử lý RMS.com. Constructor public RecordStoreFullException() public RecordStoreFullException(String message) 122 Sưu t m b i: www.6. Constructor: public RecordStoreException() public RecordStoreException(String message) RecordStoreFullException Thông báo record store đã đầy: ví dụ khi gọi hàm RecordStore.

com.Java Mobile RecordStoreNotFoundException Thông báo tên của record store không tồn tại. Constuctor: public RecordStoreNotFoundException() public RecordStoreNotFoundException(String message) RecordStoreNotOpenException Được phát sinh khi ta thực hiện một số công việc truy vấn trên record store như thêm record.vn . đếm số record mà record store chưa được mở trước đó Consturctor public RecordStoreNotOpenException() public RecordStoreNotFoundOpen(String message) 123 Sưu t m b i: www. xóa record. Ví dụ khi ta gọi hàm RecordStore.daihoc.deleteRecordStore (String) với một tên không tồn tại thì exception này sẽ phát sinh.

Open("socket://someaddress:1234").com. Lớp này sẽ có khả năng tạo các loại kết nối khác nhau: http.1.Java Mobile Chương 7: Kết nối mạng với Generic Connection Framework (GCF) 7.txt"). Lược đồ lớp Mục tiêu chung đươc đề ra là chúng ta cần có một lớp chính: lớp Connector.vn . Các nhà phát triển không đưa ra mục tiêu phát triển một bộ thư viện cung cấp các lớp.daihoc. file… Phương thức mở kết nối sẽ có dạng: Connector.io và java. Connector. Với kích thước hơn 200 kbytes và bao gồm hơn 100 lớp và interfaces.Open("http://www. datagram.some_web_address.com"). 124 Sưu t m b i: www. Giới thiệu GFC Trong bộ J2SE và J2EE chúng ta thực hiện các công việc liên quan đến truy xuất tài nguyên mạng qua hai packages chính là: java. trong bộ J2EE và J2SE này. Vì các lý do trên. nhà phát triển còn chú trọng nhiều đến các phương thức mạng và hệ thống file system trong khi thiết bị J2ME lại không quan tâm nhiều đến các vấn đề này.parameters").Open("protocol:address. Ví dụ: Connector. Bộ thư viện con này sẽ có một số thay đổi nhỏ để thích ứng với các hạn chế trên thiết bị di động cài đặt MIDP. Ngoài ra. bộ thư viện Generic Connection Framework (GCF) đã được phát triển và nhắm đến các thiết bị di động J2ME. 7. cách thức truy xuất thông qua hai gói io và net này vượt quá khả năng của thiết bị J2ME.Open("file://testdata.net. Connector.2. phương thức hoàn toàn mới mà họ muốn đưa ra một bộ thư viện con của các thư viện đã được phát triển khá tốt trên môi trướng J2SE và J2EE.

Tùy theo các protocol khác nhau mà một kết nối loại tương ứng sẽ được mở và trả lại cho người dùng. Ví dụ.sun.Java Mobile Lúc này GCF cho thấy khả năng linh hoạt của mình.Protocol”).1.io.0 lớp HTTPConnection sẽ cài đặt (chỉ một phần) bộ giao thức HTTP 1.midp. Ví dụ khi có một yêu cầu mở kết nối HTTP.forName(“com. lớp Connector sẽ thực thi hàm: Class. trong MIDP 1.daihoc. Quá trình cài đặt (implement) các protocols được thực hiện trong Profiles.com.forName(). Sau khi kiểm tra.j2me.1 Lược đồ các lớp trong thư viện GCF Thực chất CLDC chỉ cung cấp các định nghĩa cho các interface. nếu lớp này tồn tại thì người dùng sẽ được trả lại một đối tượng cài đặt (implements) interface Connection và các thao tác truy cập sẽ được thực hiện thông qua đối tượng này. việc này được thực hiện thông qua phương thức Class. Lược đồ các lớp trong thư viện: Hình 7. Lớp Connector sẽ tìm kiếm các lớp cài đặt cho loại protocol được yêu cầu. Lớp Connector và interface Connection được định nghĩa trong CLDC.vn .http. Lớp 125 Sưu t m b i: www.

Tuy nhiên.vn .0. Trong MIDP 2.interfaces và hàm chính trong bộ GCF: Connection (public abstract interface Connection) public void close() InputConnection (public abstract interface InputConnection extends Connection) public InputStream openInputStream() public DataInputStream openDataInputStream() OutputConnection (public abstract interface OutputConnection extends Connection) public OutputStream openOutputStream() public DataOutputStream openDataOutputStream() StreamConnection ContentConnection StreamConnection) public long getLength() public String getEncoding() public String getType() HttpConnection (public interface HttpConnection extends ContentConnection) //Hơn 20 phương thức hỗ trợ truy cập HTTP Connector (public class Connector) (public (public abstract abstract interface interface StreamConnection ContentConnection extends extends InputConnection. ở phần này chúng ta chú trọng đến việc kết nối thông qua HTTP. Sau đây là danh sách các lớp.com. Mặc dù DatagramConnection được biểu diển trên lược đồ nhưng MIDP 1. Các nhà phát triển có thể hỗ trợ thêm các giao thức khác nhưng điều này không bắt buộc. chúng ta được hỗ trợ các phương thức kết nối thông qua TCP và UDP. OutputConnection) 126 Sưu t m b i: www. đây là yêu cầu bắt buộc với các thiết bị MIDP.Java Mobile HTTPConnection cài đặt interface ContentConnection và có hơn 20 phương thức để hỗ trợ người dùng tương tác với giao thức HTTP.daihoc.0 chỉ yêu cầu bắt buộc hỗ trợ giao thức HTTP.

Tạo connection với mode được chỉ định. boolean timeouts) Mô tả Tạo connection dạng READ_WRITE. xử lý exception timeouts (được đề cập ở phần sau) 127 Sưu t m b i: www.Java Mobile public static Connection open(String name) public static Connection open(String name. Thông qua lớp HttpConnection chúng ta có thể liên lạc với web server hoặc một thiết bị có hỗ trợ HTTP. boolean timeouts) public static DataInputStream openDataInputStream(String name) public static DataOutputStream openDataOutputStream(String name) public static InputStream openInputStream(String name) public static OutputStream openOutputStream(String name) 7. Tạo connection với mode được chỉ định rõ (được đề cập ở bảng sau). 7.io.com. int mode. int mode) static Connection open(String name. int mode) public static Connection open(String name.1.microedition. int mode. Đây cũng chính là cách thức liên lạc giữa các trình duyệt web và web server.3. HTTP được xem như một giao thức dạng yêu cầu/phản hồi.0. Kết nối HTTP: Trong MIDP 1.vn . phương thức duy nhất bảo đảm được cài đặt là HTTP. Khởi tạo kết nối: Lớp Connector có 7 phương thức để khởi tạo kết nối với server.Connector Phương thức static Connection open(String name) static Connection open(String name. Lớp: javax.daihoc.3. Máy client sẽ gửi một yêu cầu đến server (địa chỉ server được định nghĩa theo đặc tả Uniform Resource Locator (URL)) và một phản hồi sẽ được phát sinh từ phía server gửi trả cho client.

phương thức thứ hai cho phép người dùng chọn kiểu connection có hỗ trợ reading/writing. Sau đây là đoạn lệnh dùng để thiết lập một kết nối kiểu ContentConnetion (đây là interface cài đặt interface Connection và chứa các định nghĩa cho lớp HttpConnection.io.2 Mode Kết Nối Trong 7 phương thức trên có 3 phương thức open() khác nhau: Phương thức đầu tiên chỉ đòi hỏi địa chỉ của server.mydomain. Các phương thức còn lại dùng để mở các dòng dữ liệu đọc/ghi.open(url).vn .1 Lớp Connector Có 3 modes được hỗ trợ khi ta tạo mới một connection: javax. Phương thức cuối cùng cho phép người dùng tùy chọn có xử lý timeouts exception hay không.microedition.com. Bảng 7. xin xem lại lược đồ bên trên): String url = "http://www.daihoc. 128 Sưu t m b i: www.Java Mobile static InputStream openInputStream (String name) static OutputStream openOutputStream (String name) static DataInputStream openDataInputStream (String name) static DataOutputStream (String name) Tạo một input stream cho connection Tạo một output stream cho connection Tạo một data input stream cho connection Tạo một data output stream cho connection Bảng 7.Connector Mode READ_WRITE READ WRITE Ý nghĩa Connection hỗ trợ cả đọc lẫn ghi dữ liệu Connection chỉ cho phép đọc dữ liệu xuống Connection chỉ hỗ trợ việc ghi dữ liệu.com" ContentConnection connection = (ContentConnection) Connector.

vn . } 129 Sưu t m b i: www. Cấu trúc và phong cách thiết kế hướng đối tượng của Java hỗ trợ cho các nhà phát triển ứng dụng rất nhiều.com.Java Mobile Chúng ta không thiết lập một đối tượng kiểu Connector mà dùng hàm static open() để tạo một connection.getLength().com/picture. // Đọc dữ liệu vào mảng iStrm. // ContentConnection hỗ trợ phương thức getLength int length = (int) connection. try { byte imageData[] = new byte[2500].mydomain.read(imageData). Kết quả trả về là một đối tượng Connection.read(imageData). ta có thể “ép kiểu” về dạng Connection chúng ta mong muốn (ở đây là ContentConnection).openInputStream(). Interface ContentConnection còn hỗ trợ cả phương thức getLenght() cho biết chiều dài dữ liệu hiện hành. if (length > 0) { byte imageData[] = new byte[length]. Thậm chí chúng ta còn có thể lấy ra dòng dữ liệu Input mà không cần tạo đối tượng connection như sau: // Tạo một InputStream connection String url = "http://www. // Đọc dữ liệu vào mảng int length = iStrm. } Sau khi tạo thành công connection. ta có tạo các dòng dữ liệu đọc/ghi dựa trên connection này.daihoc.openInputStream(url).png" InputStream iStrm = (InputStream) Connector. Sau đó ta có thể tạo một InputStream từ connection này để phục vụ việc đọc dữ liệu: InputStream iStrm = connection.

http. Tiếp theo chúng ta sẽ nghiên cứu những chức năng hỗ trợ giao thức HTTP.open(url).2. HEAD.GET). http = (HttpConnection) Connector. Phương thức GET và POST khác nhau ở cách thông tin truy vấn được gửi lên server.Java Mobile Tuy nhiên.io.daihoc. Các đặc điểm của kết nối HTTP bằng J2ME: Các phương thức Yêu Cầu (Request): Một yêu cầu từ phía client gồm 3 phần: phương thức request. 7. header và phần thân (body). ghi dữ liệu mà chưa tận dụng các tính năng liên quan đến giao thức HTTP.microediton.3 Các Request Method chính Cả ba phương thức trên thông báo cho server biết client cần truy vấn một thông tin. Bảng 7. Đến thời điểm này chúng ta chỉ mới khởi tạo kết nối và đọc. Gói tin yêu cầu truy vấn thông tin về một tài nguyên.com. HTTP là một giao thức dạng yêu cầu / phản hồi: client gửi một yêu cầu (request). server sẽ gửi lại một thông điệp phản hồi.3. Chúng ta có thể chỉ định rõ phương thức sử dụng trong HttpConnection bằng hàm setRequestMethod(): HttpConnection http = null. HttpConnection hỗ trợ ba phương thức request: GET. javax.vn . ở cách tiếp cận vừa nêu chúng ta không tận dụng được phương thức getLength() của interface ContentConnection.HttpConnection Phương thức GET POST HEAD Mô tả Thông tin yêu cầu được gửi kèm URL Thông tin yêu cầu được gửi theo một stream riêng biệt. 130 Sưu t m b i: www. POST.setRequestMethod(HttpConnection. Việc chọn lựa cách tiếp cận nào là tùy thuộc vào hoàn cảnh và sở thích của người lập trình.

ngược lại phương thức GET do gửi dữ liệu dạng gắn kèm vào URL nên không thể gửi kèm dữ liệu quá lớn. Với phương thức POST. Mô tả Đặt phương thức request là Get.HttpConnection Phương thức void setRequestMethod (String method) hay Head void setRequestProperty (String key.4 Các phương thức set/get Request Method Sử dụng GET. chúng ta có một web form gồm 2 trường color và font. trang web trên server sẽ dùng các hàm riêng để tách vùng thông tin yêu cầu và thực hiện xử lý. phần thân của yêu cầu được đưa vào chung trong URL. • POST gửi dữ liệu theo một dòng riêng (trong phần BODY) nên không thể hiện thông tin cho người dùng thấy trong URL. giả sử lần lượt là userColor = blue và userFont = courier và submit lên trang web http://www.mydomain.daihoc. Phương thức POST có hai ưu điểm so với phương thức GET: • Phương thức POST không giới hạn kích thước vùng dữ liệu request gửi lên server. Post 131 Sưu t m b i: www.com/formscript thì URL thực chất có dạng như sau: http://www.vn . Ví dụ. sau đó sẽ trả kết quả cho client.com. Điều này được gọi là URL encoding.io. Tên của hai trường này được đặt là userColor và userFont. Đặt một thuộc tính request (thông tin ở String value) String getRequestMethod () String getRequestProperty (String key) phần header) Lấy phương thức request đang sử dụng Lấy giá trị hiện thời của một thuộc tính request (thuộc phần header) Bảng 7.Java Mobile javax.mydomain. thông tin truy vấn không được ghép thêm vào vùng URL mà được chuyển lên server trong vùng BODY của gói tin HTTP.com/formscript?userColor=blue&userFont=courier (dấu ? dùng để phân cách vùng địa chỉ trang và phần thông tin yêu cầu gửi lên server).microediton. Sau đó. Khi user chọn giá trị cho hai trường này.

HttpConnection http = null.GET). If-Modified-Since và User-Agent Header được đặt giá trị bằng hàm setRequestProperty() đã được đề cập bên trên.setRequestProperty("If-Modified-Since". Một số trường thông dụng như Accept.open(url). Expires. Nếu người đọc muốn tìm hiểu hơn về HTTP có thể tìm đọc RFC 2616 về HTTP 1. trong gói tin trả lời chúng ta thực chất không cần nội dung của file trên (gói tin không có vùng BODY). Client gửi dữ liệu lên server và đính kèm nó với URL.1 Thông tin Header: Phần thứ hai của một gói tin yêu cầu từ client là phần header. HEAD được dùng chủ yếu để lấy thông tin về một tài nguyên nào đó trên server.vn .com. Content-Type. Phần thân (Body): Dữ liệu được chuyển từ client lên server thông qua phần body của gói tin request. Giao thức HTTP định nghĩa hơn 40 trường header. "Mon. trong gói tin hồi đáp của server cho gói tin dạng HEAD này sẽ không có vùng BODY. http. Như đã đề cập.setRequestMethod(HttpConnection.daihoc. http. GET gộp phần body vào URL còn POST gửi phần body trong một stream riêng biệt. do đó phần lý thuyết giới thiệu về HTTP sẽ rất hạn chế. 16 Jul 2001 22:54:26 GMT"). Ví dụ.Java Mobile HEAD là một phương thức gần giống với GET. http = (HttpConnection) Connector. chúng ta muốn lấy thông tin về lần cập nhật mới nhất của một tập tin trên server. Tuy nhiên. Gói tin trả lời của Server: 132 Sưu t m b i: www. do đó. Cache-Control. Ghi chú: Luận văn không có mục tiêu trình bày về giao thức HTTP mà chỉ giới thiệu HTTP như một phương thức kết nối được J2ME hỗ trợ.

phần header. Trong HttpConnection. chúng ta có hơn 35 mã status hồi đáp. HTTP chia các mã hồi đáp này thành 5 mục lớn: 1xx – Thông tin 2xx – Mã báo thành công 3xx – Chuyển hướng (redirection) 4xx – Lỗi từ phía client 5xx – Lỗi tại server Ví dụ. gói tin trả về của server cũng bao gồm phần header.getResponseMessage( ). Phần hồi đáp của server cũng gồm 3 phần: status line. server thường gửi cả version của giao thức kèm theo status line. phần body và gửi đến server. server có trách nhiệm phân tích gói tin. Header: Cũng tương tự như client.1 500 Internal Server Error Khi đọc mã status. http. Khi gửi gói tin hồi đáp (response).1 400 Bad Request HTTP/1. ta có hai lựa chọn: lấy về mã hay câu thông báo: http.Java Mobile Khi client đã đóng gói một gói tin gồm phương thức yêu cầu.getResponseCode( ). header và phần body. Đây là một số ví dụ về status line: HTTP/1. Phần header bao gồm nhiều cặp Key – Giá trị có thể được truy xuất thông qua nhiều cách: 133 Sưu t m b i: www. Status Line: Phần status line cho biết kết quả của gói tin yêu cầu từ phía client.vn .com. xử lý và hồi đáp client. HTTP_OK (mã 200) thông báo yêu cầu từ phía client đã được xử lý thành công.daihoc.1 200 OK HTTP/1.

// "content-type" Phần thân (Body): Phần thân là dữ liệu gửi từ server trả về cho client. trả về giá trị kiểu int Lấy tên trường dựa theo chỉ số của trường Lấy trường date Lấy trường expires Lấy trường last-modifed Bảng 7.getHeaderFieldKey(0).5 Các phương thức truy vấn HTTP Header Xét một ví dụ.io. Chúng ta xét một ví dụ download một file text từ server: 134 Sưu t m b i: www. Để lấy giá trị của trường này ta có những cách sau: http.getHeaderField("content-type").com.microedition.HttpConnection Phương thức String getHeaderField(int n) String getHeaderField(String name) long getHeaderFieldDate(String name.getHeaderField(0). // "text-plain" http. trả về giá trị kiểu long Lấy trường có thên “name”.long def) int getHeaderFieldInt (String name. giả sử trong vùng header ta có một cặp khóa/giá trị như sau: content-type=text/plain (“content-type” là một trường được HTTP định nghĩa.Java Mobile javax. // "text-plain" http. “text-plain” để chỉ giá trị trả về có dạng text đơn thuần). Chúng ta không có một phương thức đặc biệt nào để đọc phần body mà cách thông dụng nhất là đọc phần body này thông qua một stream. int def) String getHeaderFieldKey (int n) long getDate( ) long getExpiration( ) long getLastModified( ) Mô tả Lấy giá trị 1 trường header theo index Lấy giá trị 1 trường header theo tên Lấy trường có tên “name”.daihoc. Chúng ta giả sử thêm trường content-type này là trường đầu tiên (index=0) trong vùng header.vn .

out. .getHeaderFieldKey(0)).GET).. //2) Gửi các thông tin header (không bắt buộc phải có) http.vn .println("field 0: " + http.out. . vì dùng Get nên không có phần body – data Sau đó chúng ta phải xử lý phần thông tin trả về của server để lấy ra nội dung file //Thông tin trả về của server //1) Lấy status line: System..open(url).0").0 Configuration/CLDC1.println("Msg: " + http.getResponseCode()).setRequestMethod(HttpConnection.println("Code: " + http. // 2) Lấy thông tin header: if (http.getHeaderField("content-type")). chúng ta sẽ tạo một MIDlet yêu cầu nội dung một file từ phía server. “Profile/MIDP-1.getResponseCode() == HttpConnection. Đầu tiên chúng ta cũng sẽ khởi tạo kết nối: HttpConnection http = null.setRequestProperty(“User-Agent”. System.txt”. Ứng dụng Client sẽ trải qua một số bước: //Gửi yêu cầu lên server: //1) Xác định phương thức yêu cầu là GET http.getResponseMessage()). //3) Gửi dữ liệu.out.HTTP_OK) { System.com. .getHeaderField(0)).Java Mobile Trong ví dụ này..println("key 0: " + http.println("content: " + http.out. …………………………….. System..out.. //Tạo kết nối http= (HttpConnection) Connector. System. URL cùa file trên có dạng: url= “http://localhost/getHeaderInfo. } 135 Sưu t m b i: www.daihoc.

close().read()) != -1) bStrm. } // Nếu không có length.read(serverData).out.Java Mobile // 3) Lấy dữ liệu (nội dung file) String str. int length = (int) http.getLength(). while ((ch = iStrm. iStrm.write(ch).daihoc.openInputStream().println("File Contents: " + str). str = new String(serverData).vn . iStrm = http.toByteArray()). đọc từng byte else { ByteArrayOutputStream bStrm = new ByteArrayOutputStream(). // Mỗi lần đọc chỉ đọc một ký tự int ch. 136 Sưu t m b i: www.com. if (length != -1) { // Đọc dữ liệu vào mảng nếu có giá trị length byte serverData[] = new byte[length]. nếu là ví dụ trên điện thoại thật ta có thể dùng các thành phần đồ họa cấp cao để xuất nội dung. Sau khi đọc được nội dung file ta xuất ra màn hình console. } System. bStrm. str = new String(bStrm.

getResponseCode()). 7.com.HttpConnection Phương thức String getFile( ) String getHost( ) int getPort( ) String getQuery( ) String getRef( ) String getURL( ) Lấy tên file từ URL Lấy host từ URL Lấy port từ URL Lấy về chuỗi truy vấn (QueryString). http.open(url) thì kết nối chưa được xác lập.setRequestProperty(“User-Agent”.3.Java Mobile Ghi chú: Ở đây có một vấn đề có thể gây khó hiểu cho người đọc. Như vậy điều này có hợp lý hay không vì kết nối đã được khởi tạo rồi. System. Lấy thành phần tham chiếu (reference portion) từ URL (RFC 2396) Lấy về toàn bộ địa chỉ URL Bảng 7.daihoc.3.0"). nhưng sau đó ta mới đặt các thông số về phương thức yêu cầu (ở đây là GET) và đặt các giá trị headers. đúng ra các thông số này phải được đặt trước khi tạo kết nối! Thật ra với interface HttpConnection.setRequestMethod(HttpConnection.6 Lấy thông số kết nối Mô tả String getProtocol( ) Lấy giao thức (protocol) từ URL 137 Sưu t m b i: www. “Profile/MIDP-1.0 Configuration/CLDC-1. do đó ta đặt các thông số sau khi gọi hàm open( ) vẫn hợp lý. chỉ hỗ trợ trong phương thức GET.open(url).println("Code: " + http.GET).vn . Ban đầu chúng ta dùng hàm Connector. chỉ khi nào các hàm như getResponseCode( ) hay getResponseMessage( ) được gọi thì kết nối mới thật sự được thiết lập.microedition. javax.out. chúng ta được hỗ trợ một số hàm để lấy các thông tin về kết nối.open(url) để tạo ra một đối tượng kiểu HttpConnection vì không có phương thức khởi tạo trực tiếp đối tượng HttpConnection. System.out. khi ta gọi hàm Connector. http.println("Msg: " + http. xin hãy theo dõi đoạn code sau: http= (HttpConnection) Connector.getResponseMessage()). Thông số kết nối: Khi một kết nối đã được thiết lập. Theo như ý nghĩa của hàm open(url) thì lúc này một kết nối lên server đã được khởi tạo.io.

DatagramConnection= (DatagramConnection) Connector. 138 Sưu t m b i: www. //tạo một socket UDP client kết nối đến socket server vừa tạo: String connectionString=”datagram://123.open(connectionString).4.789.daihoc. DatagramConnection= (DatagramConnection) Connector.com.open(connectionString).456.2 Kết nối UDP Để tạo lập kết nối Datagram ta sử dụng hai lớp chính là DatagramConnection (Tạo kết nối) và Datagram (Chứa dữ liệu). Chuỗi kết nối: {protocol}://[{host}]:[{port}] Ví dụ: //tạo một socket UDP server lắng nghe trên port 1234: String connectionString=”datagram://:1234”.12:1234”. Kết nối socket Datagram (UDP) Hình 7.vn .Java Mobile 7.

String addr) Datagram newDatagram ( int size) Datagram newDatagram ( int size. Lấy về Offset của buffer của gói tin (internal buffer). int size) Datagram newDatagram ( byte[] buf. Lớp datagram implements hai interfaces là DataInput và DataOutput nên ta có thể sử dụng các phương thức đọc/ghi thông thường trên lớp này.lcdui.lcdui.daihoc.com.vn . Lớp Datagram: javax. String addr) void receive (Datagram dgram) void send (Datagram dgram) Mô tả: Lấy về kích thước tối đa của một Datagram Lấy về kích thước tối thiểu của một Datagram Tạo mới 1 datagram Tạo mới 1 datagram Tạo mới 1 datagram Tạo mới 1 datagram Nhận datagram Gửi datagram Bảng 7.7 Lớp DatagramConnection Lớp Datagram: Một datagram tượng trưng cho một UDP packet trong quá trình gửi/nhận thông qua UDP sockets. 139 Sưu t m b i: www.microedition. Lấy về kích thước gói tin.microedition. Lấy về nội dung gói tin.Datagram Phương thức: String getAddress() byte[] getData() int getLength() int getOffset() Mô tả: Lấy về địa chỉ IP của gói tin. int size.Java Mobile Lớp DatagramConnection: javax.DatagramConnection Phương thức: int getMaximumLength() int getNominalLength() Datagram newDatagram( byte[] buf.

Bảng 7.8 Lớp Datagram void setAddress (Datagram ref) Đặt địa chỉ IP của gói tin theo 1 gói tin khác. int offset. Đưa nội dung vào gói tin. int len) void setLength (int len) Đặt con trỏ đọc/ghi về đầu buffer của gói tin.daihoc.com.vn . Đặt kích thước gói tin.Java Mobile void reset() void setAddress (String addr) void setData (byte[] buffer. Đặt trực tiếp địa chỉ IP của gói tin. 140 Sưu t m b i: www.

open(connectionString). 141 Sưu t m b i: www.com. Hoặc String connectionString="serversocket://:98765".open(connectionString). Kết nối TCP socket Hình 7. Tạo lập socket server: sử dụng lớp StreamConnectionNotifier. StreamConnectionNotifier wellKnown = Connector.Java Mobile 7. Sau khi đã khởi tạo socket server ta có thể sử dụng hàm StreamConnection acceptAndOpen() (tương tự như hàm accept() trong lập trình WinSock) để tạo một socket giao tiếp với client kết nối tới. String connectionString="socket://:98765".3 Kết Nối TCP Để tạo lập kết nối TCP ta phải sử dụng 2 interfaces StreamConnectionNotifier và StreamConnection. StreamConnectionNotifier wellKnown = Connector.5.daihoc.vn .

vn . Interface StreamConnection implements hai interface InputConnection và Interface dễ dàng.foo. Lấy địa chỉ IP máy nội bộ.lcdui.Java Mobile Tạo lập socket Client: String connectionString="socket://server.microedition. Thời gian cách nhau của các gói tin KeepAlive Thời gian timeout để gửi các gói tin còn đọng lại khi đã gọi hàm close() Kích thước Receive Buffer.SocketConnection Phương thức: String getAddress() String getLocalAddress() int getLocalPort() Mô tả: Lấy địa chỉ IP của máy đang kết nối đến. J2ME còn cung cấp lớp SocketConnection kế thừa từ lớp StreamConnection để phục vụ thêm cho kết nối TCP.microedition. OutputConnection do đó ta có thể sử dụng các hàm openDataInputStream() và openDataOutputStream() để đọc và ghi dữ liệu một các Bảng 7. StreamConnection conn=Connector. Kích thước Send Buffer.9 Thuộc tính của SocketConnection Lớp SocketConnection: javax.com.open(connectionString). 142 Sưu t m b i: www.lcdui.SocketConnection Mode: static byte DELAY static byte KEEPALIVE static byte LINGER static byte RCVBUF static byte SNDBUF Mô tả: Thời gian delay trước khi gửi gói tin.com:98765".daihoc. Lấy port của máy nội bộ. Lớp SocketConnection: Lớp SocketConnection: javax.

int value) Lấy port của máy đang kết nối đến.daihoc.com.10 Lớp SocketConnection 143 Sưu t m b i: www. Bảng 7.vn . Lấy các tùy chọn của socket. Đặt các tùy chọn cho socket.Java Mobile int getPort() int getSocketOption(byte option) void setSocketOption(byte option.

MessageConnection Interface này tượng trưng cho một kết nối để gửi/nhận message. MessageListener Có chức năng tương tự như CommandListener. Chúng ta có thể khai thác thư viện WMA qua ba interfaces chính được định nghĩa sẵn: Interface Message Mô tả Interface này tượng trưng cho một tin nhắn. receive() để nhận tin nhắn gửi đến. Gửi và nhận SMS Để gửi và nhận tin nhắn SMS trong J2ME ta sử dụng bộ thư viện Wireless Messaging API .6.com. SMS (Short Message Service) là một dịch vụ vô cùng quan trọng trong hệ thống thông tin di động. Việc thông báo sẽ được thực hiện thông qua hàm notifyIncomingMessage(). một đặc điểm rất tiện lợi của WMA là nó cho phép biến thiết bị di động thành một SMS server: chúng ta có thể viết chương trình nhận và tự động xử lý tin nhắn (tự động reply hoặc chuyển tiếp đến một máy khác). hai lớp kế thừa từ interface này là TextMessage và BinaryMessage. Bảng 7. Ở Châu Âu.vn .11 Các interfaces chính của WMA 144 Sưu t m b i: www. Interface này định nghĩa sẵn các hàm rất hữu ích như newMessage() để tạo một tin nhắn mới sẵn sàng được gửi đi.ký mã hiệu JSR 205 (xêm thêm về JSR trong phần phụ lục).daihoc.Java Mobile 7. Tính năng SMS không được hỗ trợ trong các thư viện gốc của J2ME mà thông qua Wireless Messaging API (WMA). ước tính 40% cước phí dịch vụ di động do SMS mang lại. MIDlet sẽ implements interface này để được thông báo khi nào có tin nhắn gửi đến.

Trong thư viện WMA. Chúng ta hoàn toàn có thể dùng một kết nối SMS server để gửi tin nhắn.daihoc. • Nếu URL có dạng sms://+18005555555. • Nếu URL có dạng sms://:1234.4 Lược đồ lớp thư viện WMA Khởi tạo kết nối SMS: Để khởi tạo kết nối SMS ta cũng sử dụng phương thức Connector. chúng ta có thể thiết lập port cho mỗi tin nhắn chúng ta gửi đi. lời gọi hàm sẽ tạo một kết nối SMS gửi tin nhắn đến máy 1-800-555-5555.Java Mobile Hình 7. lời gọi hàm sẽ tạo một kết nối SMS gửi tin nhắn đến số máy 1-800-555-5555 tại port 1234. • Nếu URL có dạng sms://+18005555555:1234. Nếu 145 Sưu t m b i: www. Ghi chú: Ở đây chúng ta gặp một khái niêm tương đối lạ lẫm là SMS port.vn . lời gọi hàm sẽ tạo một kết nối SMS server để lắng nghe các tin nhắn gửi đến tại port 1234.com.Open(String URL).

setPayloadText( "Hello World" ).open(addr). 146 Sưu t m b i: www.open("sms://:3333"). msg. Gửi tin nhắn: Để gửi tin nhắn chúng ta sử dụng kết nối MessageConnection: String addr = "sms://+123456789".com. • Tin nhắn gửi đi sẽ có kèm số điện thoại và port của người gửi Nhận tin nhắn: Chúng ta có thể nhận tin nhắn theo hai mô hình: blocking (phải tạo thread) và mô hình non-blocking (mô hình bất đồng bộ). msg. Không có một SMS server nào tạo bởi thư viện WMA tiếp nhận các tin nhắn loại này. các tin nhắn xử lý bởi WMA thường là các tin nhắn gửi vào các port được qui định trước.TEXT_MESSAGE). MessageConnection conn = (MessageConnection) Connector.newMessage( MessageConnection. conn.setPayloadText( "Hello World" ). Việc sử dụng SMS server để gửi tin nhắn có một số lợi điểm sau: • Chúng ta có thể sử dụng lại kết nối này nhiều lần.vn .Java Mobile một tin nhắn SMS gửi đến một máy khác mà trên máy này không có port tương ứng thì tin nhắn sẽ được xem như một "inbox message" và sẽ do chương trình xử lý tin nhắn mặc định trên thiết bị tiếp nhận. sconn.newMessage( MessageConnection. msg.TEXT_MESSAGE).send(msg).setAddress("sms://+123456789:1234").daihoc. TextMessage msg = (TextMessage) conn.send(msg). TextMessage msg = (TextMessage) sconn. //Hoặcr: String addr = "sms://+123456789:1234". Chúng ta cũng có thể gửi tin nhắn từ kết nối SMS server như sau: MessageConnection sconn = (MessageConnection) Connector.

.vn .open("sms://:3333"). sconn. rmsg.receive(). } catch (Exception e) {/* process error*/} } // .open("sms://:"+serverPort).. String msgText = tmsg. while (true) { Message msg = sconn. public void startApp() { try { displayBlankForm ().send(rmsg). sconn = (MessageConnection) Connector.com.Java Mobile Với mô hình một chúng ta sẽ phải tạo một thread dành riêng cho SMS server. ví dụ như sau: MessageConnection sconn = (MessageConnection) Connector.newMessage( MessageConnection. } else { // process the non-text message // maybe a BinaryMessage? } } Với mô hình bất đồng bộ chúng ta phải implements MessageListener và sử dụng hàm notifyIncomingMessage() như sau: // Implements the MessageListener IF public class WMAasync extends MIDlet implements CommandListener. rmsg.setPayloadText( "Thanks!" ). // Construct the return message TextMessage rmsg = (TextMessage) sconn. sconn.daihoc. if (msg instanceof TextMessage) { TextMessage tmsg = (TextMessage) msg.. MessageListener { // Init a server connection and assign // a listener for it.setMessageListener(this).setAddress ( tmsg.getAddress() ).TEXT_MESSAGE).. . // Implement the message handler // method required in the MessageListener 147 Sưu t m b i: www.getPayloadText().

if (msg instanceof TextMessage) { TextMessage tmsg = (TextMessage) msg. sconn.vn . rmsg. String msgText = tmsg.setAddress ( tmsg.send(rmsg). // Construct the return message TextMessage rmsg = (TextMessage) sconn.Java Mobile // interface. rmsg.com.TEXT_MESSAGE). } class SMSHandler implements Runnable { public void run () { try { Message msg = sconn.getAddress() ).newMessage( MessageConnection.getPayloadText(). // Display mesgText } else {/* not a text mesg */} } catch (Exception e) {/* handle error */} } } } 148 Sưu t m b i: www. public void notifyIncomingMessage( MessageConnection c) { new Thread(new SMSHandler()).start().daihoc.receive().setPayloadText( "Message " + msgText + " is received" ). return.

Ứng dụng phân tán (Distributed Application) 8. • Độ an toàn: Đối với hầu hết thông tin. Ngày nay. • Sở hữu thông tin: Thông tin có thể ở nhiều dạng. do đó việc phân tán thông tin là nhu cầu nhưng đôi khi cũng là bắt buộc. Giới thiệu Ứng dụng phân tán (Distributed Application) là một hướng nghiên cứu đang được chú trọng trong nghành công nghiệp phần mềm.1.1.1.vn .com. dữ liệu chủ yêu được chia nhỏ thành nhiều phần chứ không được lưu trữ tập trung tại một nơi. Việc gom hết tất cả các thông tin quy về một nơi là bất khả thi. 149 Sưu t m b i: www. Tuy nhiên. để đáp ứng đồng thời hai nhu cầu trên. nhu cầu bảo mật thông tin lại được đưa lên hàng đầu. đối với những dữ liệu quan trọng và nhạy cảm. ngoài ra việc tập trung tất cả thông tin tại một nơi là một nguy cơ tiểm tàng về việc mất dữ liệu nếu xảy ra sự cố. Nhu cầu cần hình thành nên những hệ thống phân tán xuất phát từ một số lý do: • Chi phí: Việc đầu tư cho những hệ thống xử lý lớn rất tốn kém và vượt quá khả năng của nhiều tổ chức.daihoc. yêu cầu đầu tiên là phải truy xuất được dễ dàng. nhiều nguồn và thuộc sở hữu của nhiểu tổ chức khác nhau. Từ hai yếu tố trên đã hình thành nhu cầu phân tán dữ liệu để giảm rủi ro và tiết kiệm chi phí.Java Mobile Phần 2 : Web Service và Ứng dụng "Đăng Ký Học Phần" Chương 8: Giới thiệu Web Service 8.

đơn đặt hàng đã được ghi nhận nhưng gói tin phản hồi bị mất. các kiểu dữ liệu không tương thích 100% với nhau trên các nền tảng HĐH khác nhau.com. cho phép chương trình giao tiếp với nhiều nguồn DL khác nhau • Tận dụng khả năng tính toán của những hệ thống lớn (Grid computing) • Tăng khả năng liên kết giữa các hệ thống phần mềm để hình thành những ứng dụng lớn. Các hệ thống phần mềm phân tán ra đời đã mang lại nhiều lợi ích: • Tăng khả năng linh hoạt của chương trình. khi client bị ngừng đột ngột chúng ta phải có biện pháp thông báo cho server và thu hồi những tài nguyên bị chiếm giữ. • Nếu server của chúng ta lưu trạng thái của client.Java Mobile Từ những nhu cầu trên đã làm xuất hiện một quan niệm thiết kế phần mềm mới và hình thành nên những hệ thống phần mềm phân tán.2. Đôi khi. 8. Chúng ta 150 Sưu t m b i: www.daihoc. Các vấn đề nảy sinh trong hệ thống ứng dụng phân tán • Các HĐH khác nhau sẽ hỗ trợ những kiểu dữ liệu khác nhau. ta không thể đơn thuần gửi lại một đơn đặt hàng khác. Khi phát sinh lỗi có thể làm toàn bộ ứng dụng ngưng hoạt động. do đó chúng ta cần phải chú ý đến việc phát sinh lỗi và mất gói tin trong quá trình hoạt động. chúng ta cần chú ý đến việc hòa hợp dữ liệu trên các môi trường. hàm đã được xử lý nhưng gói tin phản hồi bị mất trong một số trường hợp chúng ta không thể gửi lại lời gọi hàm một lần nữa: ví dụ khi ta đặt mua một đơn đặt hàng. • Dữ liệu của ứng dụng phân tán thường được gửi qua lại nhiều node trên mạng do đó bảo mật là một trong những vấn đề hàng đầu cần giải quyết. • Khi một hàm được gọi từ xa.1. Khi phát triển các ứng dụng phân tán. • Các thành phần của một ứng dụng phân tán thường ở nhiều nơi khác nhau trên mạng do đó khả năng phát sinh lỗi thường cao hơn bình thường.vn .

151 Sưu t m b i: www. Chúng ta có thể xây dựng các chương trình chuyển đổi qua lại giữa các mô hình này nhưng chắc chắn sẽ dẫn đến việc thất thoát thông tin trong quá trình chuyển đổi. Ví dụ như một thông báo đã đặt hàng thành công không thể phát sinh trước khi đơn đặt hàng được phát sinh. Sự ra đời của Web Service. Denial of service.com.daihoc. tuy nhiên hầu hết các hình thức này đều tồn tại một số nhược điểm: Firewalls: Các ứng dụng này khi hoạt động ở những hệ thống mạng được che chắn bởi firewall đều phải được sự cho phép của những người quản trị firewall để được ra ngoài. authorization. Các hệ thống ứng dụng phân tán có thể đi theo các “trường phái” khác nhau dẫn đến việc không thể làm việc chung.3.Java Mobile phải xem xét những vấn đề về authentication. Do đó. Java Remote Method Invocation (RMI). replay attacks… • Rất nhiều ứng dụng phụ thuộc vào sự đồng bộ thời gian của client và server. Common Object Request Broker Architecture (CORBA).vn . Hạn chế của những mô hình ứng dụng phân tán trước đây Trước đây đã có nhiều hình thức ứng dụng phân tán được đề ra như: Distributed Component Object Model (DCOM). Sự phối hợp của các giao thức: Các mô hình này đều có những đặc điểm và dựa trên những giao thức tầng dưới khác nhau. một đặc tả sử dụng hệ thống HTTP đã được chuẩn hóa làm nền tảng.1. đã phần nào giải quyết được nhu cầu nói trên. nhu cầu hình thành một chuẩn chung cho các hệ thống ứng dụng phân tán trở nên một nhu cầu thiết yếu. vấn đề về đồng bộ thời gian trên clients và server cũng phải được quan tâm. 8. Với những lý do trên. Đây là một trong những lỗ hổng bảo mật tiềm tàng và khó được chấp nhận bởi nhiều tổ chức.

Java Mobile

8.2. Web Service
8.2.1. Định nghĩa

Một Web service được định nghĩa là một tập các phương thức có thể được định vị thông qua địa chỉ URL, các phương thức này được công bố trên hệ thống mạng và được dùng như những khối cơ bản để xây dựng một ứng dụng phân tán (Trích sách: Developing XML Web service using Microsoft Visual Studio .NET). Nói một cách đơn giản hơn, web service là tập hợp các phương thức có thể được các ứng dụng khác triệu gọi từ xa (RPC- Remote Procedure Call) để hình thành nên một hệ ứng dụng phân tán.

8.2.2.

Thành phần cơ bản của Web service:

Các thành phần cơ bản nhất của web service bao gồm HTTP, XML và SOAP (Simple Object Access Protocol). Việc phát triển những kỹ thuật này được điều hành bởi tổ chức W3C (World Wide Web Consortium). Chúng ta sẽ đề cập đến những kỹ thuật này ở những phần sau.

8.2.3.

Hoạt động của Web service

Hình 8.1 Hoạt động của Web Service

152
Sưu t m b i: www.daihoc.com.vn

Java Mobile

Một ứng dụng web service thường gồm 2 phần: client và server. Client và server sẽ giao tiếp với nhau theo giao thức HTTP: Ứng dụng client sẽ gửi những lời gọi hàm đến server thông qua các gói tin HTTP request và kết quả thực thi hàm sẽ được server hồi đáp thông qua các gói tin HTTP response. SOAP: Các thông điệp sẽ được định dạng theo chuẩn giao thức SOAP (Simple Object Access Protocol). Đây thực chất cũng chỉ là một ngôn ngữ được định nghĩa bên trên ngôn ngữ XML có sẵn. WSDL (Web Service Definition Language): Đây là file XML chứa các định nghĩa về các hàm trong Web service tương ứng. Các nhà phát triển ứng dụng sẽ phải dựa vào nội dung file này để biết Web service hỗ trợ những hàm này và nhận những tham số tương ứng, kết quả trả về như thế nào. Nếu chúng ta phát triển Web service trong môi trường J2ME thì không nhất thiết phải hiểu rõ cấu trúc về file WSDL, vì trong bộ công cụ Wireless Toolkit của Sun đã cung cấp sẵn công cụ Stub Generator. Chức năng của bộ công cụ này là đọc file WSDL và phát sinh thành những lớp java tương ứng cho nhà phát triển ứng dụng. UDDI(Universal Description, Discovery, and Integration): Đây là công cụ giúp cho những nhà phát triển Web Service công bố những thông tin về web service của mình cho cộng đồng các nhà phát triển ứng dụng. Người dùng sẽ dựa vào những thông tin này để sử dụng web service trong ứng dụng riêng của mình tạo thành một hệ ứng dụng phân tán. Mối quan hệ giữa các thành phần SOAP,WSDL,UDDI có thể được mô tả như sau: Một ứng dụng web service client cần sử dụng một web service được đặt tại một nơi nào đó trên hệ thống mạng. Trước tiên, client sẽ truy vấn đến các mẫu tin UDDI, có thể theo tên, loại hay một thông tin riêng biệt nào đó. Khi đã xác định được web service cần tìm, client có thể lấy thông tin về địa chỉ của tài liệu WSDL của web service này dựa trên mẫu tin UDDI. Tài liệu WSDL sẽ mô tả cách thức liên lạc với web service, định dạng của gói tin truy vấn và phản hồi theo cũng được

153
Sưu t m b i: www.daihoc.com.vn

Java Mobile

mô tả bằng XML schema. Dựa vào những thông tin này client có thể tạo những gói tin SOAP tương ứng để liên lạc với server. Ứng dụng web service có thể được cài đặt ở những mức độ cao hơn như những mô hình sau:

Hình 8.2 Một client truy xuất đến nhiều web services cùng lúc

154
Sưu t m b i: www.daihoc.com.vn

Java Mobile

Hình 8.3 Một web service có thể triệu tập đến các web services khác 8.2.4. Ưu điểm của web service

Web service có nhiều ưu điểm hơn so với những mô hình ứng dụng phân tán ra đời trước nó. Ưu điểm này được cấu thành bởi chính những thành phần tạo nên web service. • Khả năng vượt firewall: Web Service hoạt động trên nền giao thức HTTP nên cũng sử dụng luôn port 80 dành cho web. Đây là một ưu thế rất lớn của web service đối với các phương thức gọi hàm từ xa (RPC) khác; với các hình thức cũ hơn chúng ta thường phải dùng các port tự qui định (lớn hơn 1024) dẫn đến không thể hoạt động ở một số tổ chức vì quản trị mạng không cho phép vượt qua firewall. Web service sử dụng port "well-known" 80, đây là port hầu như tất cả các firewall đều cho phép đi qua nên web service có thể hoạt động ở mọi nơi. • Hoạt động trên đa môi trường: Web service dựa trên nền công nghệ XML, tài liệu XML hiện nay được hỗ trợ bởi tất cả các Hệ Điều Hành, kể cả trên môi trường di động (vì chỉ là những file text đơn thuần). Do đó web service có thể hoạt động trên mọi môi trường, được hỗ trợ bởi hầu như mọi ngôn ngữ lập trình. Tuy nhiên chúng ta cũng phải trả giá cho điều này: do truyền dữ liệu dưới dạng

155
Sưu t m b i: www.daihoc.com.vn

Ngoài ra việc không truyền đi các dữ liệu định dạng làm giảm đi chi phí đáng kể trên đường truyền so với trang web.daihoc. chúng ta không phải xây dựng lại giao diện như với trang web. Đây là ưu điểm của web service so với các trang web thông thường.vn . Các client khi nhận được tín hiệu sẽ tùy vào năng lực của mình mà thể hiện thông tin hợp lý. dễ chuyển đổi: Web service chỉ đơn thuần chuyển dữ liệu mà không kèm những tag định dạng như ngôn ngữ HTML.com. • Tính linh hoạt. 156 Sưu t m b i: www.Java Mobile text nên độ trễ của web service sẽ cao và chiếm dụng băng thông cũng nhiều hơn so với các hình thức chuyển dữ liệu nhị phân. Khi cần thêm hay bớt một chức năng của web service đó đơn thuần là thêm hay bớt một hàm. điều này làm web service thực sự linh hoạt hơn trang web.

SOAP (Simple Object Access Protocol) SOAP là một giao thức đơn giản nhằm mục đích trao đổi thông tin trong môi trường ứng dụng phân tán.FTP… Tuy nhiên hiện nay chỉ mới có HTTP/HTTPS được xem như giao thức chuẩn để trao đổi gói tin SOAP.NET. Việc trình bày này chỉ nhằm mục đích cung cấp cho người đọc cái nhìn khái quát hơn về web service.3. Gói tin SOAP được gửi bên trong một gói tin HTTP request hoặc gói tin HTTP response. SOAP có thể được sử dụng kết hợp với các giao thức chuẩn khác như SMTP.HTTP/HTTPS. Gói tin SOAP gồm 4 phần chính: 157 Sưu t m b i: www. • Một chuẩn mã hóa quy định cách thể hiện thông tin trong envelope. Luận văn không có tham vọng trình bày cặn kẽ về tất cả các công nghệ trên mà chỉ xin giới thiệu những nét cơ bản và sơ lược về các công nghệ chính. Các thành phần chính của Web Service Web service dựa vào khá nhiều công nghệ bên dưới như HTTP.1.3. … Mỗi công nghệ nêu trên đều có phạm vi ứng dụng khá sâu rộng và đòi hỏi nhiều thời gian tìm hiểu cũng như trình bày. tuy nhiên quá trình phát triển ứng dụng web service thông thường không đòi hỏi kiến thức sâu về lãnh vực này vì đã có rất nhiều công cụ hỗ trợ và lập trình viên đã được “che” đi những công việc phức tạp bên dưới.… Gói tin SOAP: Gói tin SOAP là một phương tiện giao tiếp một chiều từ nơi gửi đến nơi nhận. 8.vn . SOAP. .daihoc. XML. SOAP dựa trên nền công nghệ XML và bao gồm 2 thành phần: • Một “bì thư” (envelope) để quản lý các thông tin mở rộng và mang tính điều khiển.Java Mobile 8. Việc sử dụng SOAP như một giao thức trao đổi dữ liệu chuẩn khiến web service có khả năng hoạt động trên nhiều môi trường lập trình khác nhau như Java.com.

• Qui luật mô tả cách thức sử dụng gói tin SOAP với các protocol tầng dưới (hiện nay là HTTP). Cấu trúc gói tin SOAP: một gói tin SOAP gồm một Envelope như một node gốc trong văn bản XML.org/1999/XMLSchema"> .Java Mobile • Phần bì thư SOAP envelope: định nghĩa thông điệp chứa những gì.xmlsoap. Đây là một ví dụ về Envelope: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.com. ai nên xử lý thông điệp.org/soap/envelope/" xmlns:xsi="http://www.daihoc.. thông điệp này bắt buộc phải xử lý (mandatory) hay mang tính tùy chọn (optional). Phần Envelope có thể có hoặc không có phần Header nhưng chắc chắn phải chứa phần Body. • Luật mã hóa: Quy định cách thức chuyển đổi thông tin. các kiểu dữ liệu trong ứng dụng.w3. nút gốc này sẽ chứa node con Body và có thể có hoặc không chứa node con Header. SOAP Envelope: Phần Envelope là node gốc của gói tin SOAP dưới dạng tài liệu XML.. Nó chỉ đơn thuần báo hiệu sự bắt đầu của một gói tin và định nghĩa các NameSpace cần thiết sẽ được sử dụng ở các phần sau. SOAP Header: 158 Sưu t m b i: www. • Phần SOAP RPC: mô tả những qui luật về cách thức gọi hàm từ xa cũng như cách thức phản hồi.vn . phần Envelope không mang nhiều ý nghĩa. </SOAP-ENV:Envelope> Trong các gói tin SOAP thông thường.

com/GetAccount" <?xml version="1. Các thông tin thường được thêm vào phần Header là authentication.com. SOAP Body: Nếu trong gói tin SOAP không có node Header thì node Body phải là node con đầu tiên của SOAP Envelope. Phần Header thường là nơi được dùng để thêm các thông tin bổ sung phục vụ cho mục đích riêng của chương trình.w3. Gói tin SOAP được đặt trong gói tin HTTP Request có dạng như sau: POST /dummy/service1. charset=utf-8 Content-Length: 215 SOAPAction: "http://woodgrovebank.com"> <acctNumber>1234</acctNumber> </GetAccount> 159 Sưu t m b i: www. Đây là một ví dụ hoàn chỉnh và đơn giản về việc sử dụng SOAP để gọi hàm GetAccount(int accNumber) với tham số truyền vào accNumber=1234. ví dụ như tên hàm cần gọi.0.168.daihoc.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.1 Host: 192. Phần Body chứa các thông tin về lời gọi hàm.Java Mobile Phần SOAP Header sẽ là node con đầu tiên của SOAP Envelope. được gọi chung là mẫu tin Body. authorization. các tham số đầu vào.xmlsoap.asmx HTTP/1.vn .org/2001/XMLSchema" xmlns:soap="http://schemas. giá trị trả về … để phục vụ cho việc gọi hàm từ xa.org/2001/XMLSchema-instance" xmlns:xsd="http://www. quản lý transaction… Phần Header không bắt buộc phải có trong mọi gói tin SOAP.80 Content-Type: text/xml.org/soap/envelope/"> <soap:Body> <GetAccount xmlns="http://woodgrovebank. Trong mục Body có thể có nhiều node con.

charset=utf-8 Content-Length: 247 <?xml version="1.w3.00 HTTP/1. Việc hiểu cấu trúc SOAP chủ yếu phục vụ cho việc debug ứng dụng hoặc xây dựng các ứng dụng cần sự can thiệp ở mức sâu đến các protocol bên dưới.com"> <savingsAcct> <balance>5250.org/2001/XMLSchema" xmlns:soap="http://schemas. trong gói tin này chứa lời gọi đến hàm GetAccount(int accNumber) dưới dạng một gói tin SOAP. Đây là nội dung gói tin SOAP phản hồi cho lời gọi hàm trên.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.com.1 200 OK Content-Type: text/xml.Java Mobile </soap:Body> </soap:Envelope> Phần trên là nội dung gói tin HTTP Request dạng POST. Đối với các chương trình thông thường hiếm khi chúng ta phải thao tác với gói tin SOAP.org/soap/envelope/"> <soap:Body> <GetAccountResponse xmlns="http://woodgrovebank.w3.xmlsoap. chỉ ra kết quả lời gọi hàm là 5250.00</balance> </savingsAcct> </GetAccountResponse> </soap:Body> </soap:Envelope> SOAP Fault: 160 Sưu t m b i: www.org/2001/XMLSchema-instance" xmlns:xsd="http://www.daihoc.vn .

Trong những môi trường lập trình cao cấp như Java. faultdetail để cung cấp những thông tin chi tiết khi có lỗi phát sinh. faultstring. faultactor. khi soap fault phát sinh thì một ngoại lệ (Exception) cũng được phát sinh để báo cho lập trình viên có xử lý tương ứng.com.org/soap/envelope/”> <soap:Body> <soap:Fault> <faultcode>123XYZ</faultcode> <faultstring>Server Error</faultstring> <detail> <bank:faultdetails xmlns:bank="urn:OnlineBank"> <message>Your account is overdrawn</message> <errorcode>1234</errorcode> </bank:faultdetails> </detail> </soap:Fault> </soap:Body> </soap:Envelope> Soap Fault có những phần con như faultcode.daihoc. một trong những vấn đề đặt ra trong môi trường ứng dụng phân tán là khả năng xảy ra lỗi cao.0 500 Internal Server Error Content-Length: 460 Content-Type: text/xml.NET.vn . charset="utf-8" <soap:Envelope xmlns:soap="http://schemas.Java Mobile Như đã đề cập.xmlsoap. 161 Sưu t m b i: www. . do đó khái niệm SOAP Fault được đề ra để vận chuyển các thông báo lỗi trong quá trình hoạt động. HTTP/1.

4 Web Service Endpoint 162 Sưu t m b i: www. WSDL (Web Service Definition Language) Khi chúng ta đã xây dựng hoàn thành web service cần phải cung cấp tài liệu mô tả để các nhà phát triển client có thể sử dụng được web service trên. các hàm nó cung cấp. Trong tài liệu WSDL.Java Mobile 8.2. float … đã được hỗ trợ sẵn. Hình 8. chúng ta gộp chung các định nghĩa này kết hợp với các giao thức mạng bên dưới để hình thành một end-point (tạm dịch là một đầu cuối). string. tham số kèm theo… Tài liệu WSDL là một tài liệu thỏa mãn các nhu cầu trên. mảng các lớp … còn các kiểu dữ liệu cơ bản như int.3. Chúng ta chỉ phải định nghĩa các kiểu dữ liệu phức tạp như mảng.com. WSDL (Web Service Definition Language) là một ngôn ngữ dựa trên cú pháp XML dùng để định nghĩa một web service.vn . các kiểu dữ liệu được xử dụng trong các phương thức cùng các thông điệp được trao đổi giữa client và server ứng với mỗi phương thức.daihoc. một file WSDL như một người trung gian đứng giữa web service và ứng dụng web service client. chúng ta sẽ định nghĩa các phương thức được web service hỗ trợ. Nói cách khác. Sau đó. các lớp được khai báo thêm trong chương trình. Tài liệu mô tả web service cần mô tả được vị trí web service.

Như vậy ứng với web service trên.4 chúng ta thấy có 3 binding khác nhau. Cấu trúc file WSDL: Một tài liệu WSDL thực chất chỉ là một danh sách các định nghĩa. Sự kết hợp của web service với một giao thức mạng như thế được gọi là một binding.com. class…). • Phần tử "service": Có tác dụng gom các ports đã định nghĩa thành từng nhóm. như trong hình 8. phần tử gốc được đặt tên là "definitions". Port 2 sử dụng SOAP/HTTPS binding.vn . 163 Sưu t m b i: www. Port 1 sử dụng SOAP/HTTP binding. Thứ tự xuất hiện của các phần tử con này: • Phần tử "types": định nghĩa các kiểu dữ liệu dùng để trao đổi giữa client và server (chỉ định nghĩa các kiểu dữ liệu phức tạp như structure. Trong một file WSDL.Java Mobile Một endpoint interface (gọi tắt là một enpoint) gồm có nhiều ports. nếu hiểu cấu trúc file WSDL sẽ cung cấp cho chúng ta thêm nhiều tùy biến cũng như khả năng sửa lỗi (debug) tốt hơn. Các hình thức binding thông dụng nhất hiện nay vẫn là SOAP/HTTP POST và SOAP/HTTPS (hỗ trợ bảo mật thông qua SSL). Phần tử binding sẽ đảm nhiệm chức năng này (sẽ được đề cập kỹ hơn ở phần sau). Tuy nhiên.daihoc. Port 3 sử dụng các dạng binding khác. • Phần tử "binding": Sau khi đã định nghĩa các port. mỗi port quy định một cách liên lạc với web service khác nhau ứng với mỗi giao thức bên dưới khác nhau. Phần tử này chứa năm phần tử con chính để định nghĩa web service. Việc phát sinh file WSDL sẽ được tự động thực hiện bởi các bộ công cụ (như Visual Studio .NET) do đó chúng ta không nhất thiết phải hiểu rõ cấu trúc file WSDL. ta có đến 3 phương tiện khác nhau để triệu gọi các hàm. • Phần tử "message": định nghĩa các thông điệp được trao đổi. ta cần chỉ rõ ràng buộc giữa các ports này và các giao thức tầng dưới. • Phần tử "portType": định nghĩa một tập các chức năng web service hỗ trợ và thông điệp tương ứng đối với mỗi chức năng đó.

a.balance=10000.NET */ public Acct GetAccount(string acctNumber) { Acct a = new Acct(). public string number. a. Điều này sẽ được trình bày rõ hơn ở phần xây dựng web service bằng Visual Studio .type="SV".description = "Adam's savings acct".*/ public string status.0M.NET): public class Acct { public string description. a. 164 Sưu t m b i: www.com.daihoc. } public class TheBank { [WebMethod] /* Phần [WebMethod] báo hiệu đây là hàm được export bởi web service để cho phép truy cập từ xa.number="1234-XX".status="active". a. [XmlAttribute("status")] /*chỉ rõ status là một attr chứ không phải node con. a. public decimal balance.Java Mobile Để hiểu rõ hơn về file WSDL chúng ta sẽ cùng tìm hiểu một ví dụ chính thức của hãng Microsoft (ebook Developing XML Web Service Using Microsoft Studio . public string type.vn .

Chúng ta sẽ xem xét qua cấu trúc các phần tử vừa nêu đối với web service trên. <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="acctNumber" nillable="true" type="s:string" /> </s:sequence> </s:complexType> .. Phấn tử types: Các quy tắc định nghĩa trong phần tử types đều tuân theo chuẩn XML Schema Definition Language (XSD).Java Mobile return a.com.. Tham số acctNumber được định nghĩa như sau: . <types> .. tham số truyền vào có kiểu string.3.1. </types> Phần định nghĩa lớp Acct (kết quả trả về của hàm GetAccount) sẽ phức tạp hơn: <s:complexType name="Acct"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="description" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" 165 Sưu t m b i: www.daihoc... } } Đây là một đoạn code khá đơn giản.2..vn . 8. ta định nghĩa một lớp Acct và cung cấp một phương thức để lấy về một Account.

vn . cấu trúc gói tin response sẽ có tên là tên hàm cộng với Response ở cuối.0" encoding="utf-8"?> <account status="active"> <description>Adam's savings acct</description> <number>1234-XX</number> <type>SV</type> <balance>10000</balance> </account> Sau đó chúng ta phải định nghĩa cấu trúc các thông điệp được trao đổi trong quá trình gọi hàm và nhận kết quả.daihoc.Java Mobile name="number" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="type" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="balance" type="s:decimal" /> </s:sequence> <s:attribute name="status" type="s:string" /> </s:complexType> Dựa vào định nghĩa trên. một đối tượng thuộc lớp Acct có thể được thể hiện như sau: <?xml version="1. <s:element name="GetAccount"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="acctNumber" nillable="true" 166 Sưu t m b i: www. Ta tuân theo một quy tắc: cấu trúc gói tin request (lời gọi hàm) sẽ có tên trùng với tên hàm.com.

Một phần tử "part" tượng trưng cho một tham số được truyền trong hàm. Bởi và các thông điệp không phụ thuộc vào các giao thức tầng dưới nên các thông điệp có thể được định nghĩa dưới dạng HTTP-GET/POST.3. SOAP hay bất kỳ một protocol nào hỗ trợ Web Service.vn .Java Mobile type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetAccountResponse"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="account" type="s0:Acct" /> </s:sequence> </s:complexType> </s:element> Trên đây là toàn bộ nội dung phần types. Chúng ta có thể đặt tên bất kỳ cho thông điệp vì web service không đưa ra một ràng buộc cũng như quy tắc đặt tên nào cả.com. Phần tử message: Bên cạnh việc định nghĩa các kiểu dữ liệu được truyền giữa client và server ta cần phải định nghĩa các thông điệp được truyền đi và hồi đáp.2. Các phần tử message có thể chứa nhiều phần tử con "part" (cũng có khi không chứa phần tử con nào).2. Một phần tử part phải có một tên và kiểu dữ liệu tương ứng đã được định nghĩa. Đối với ví dụ trên thì phần tử message có dạng như sau: <message name="GetAccountIn"> <part name="parameters" element="s0:GetAccount" /> </message> 167 Sưu t m b i: www. 8.daihoc.

8.3. cả hai kiểu này đã được định nghĩa ở phần tử types trước đó. đối với hàm GetAccount ( ) sẽ có hai thông điệp: • Thông điệp input: Lời gọi hàm từ client gửi lên server. các từ khóa input và output được dùng để chỉ rõ gói tin request và gói tin response.3. ta sẽ thấy thông điệp 168 Sưu t m b i: www. Nếu đọc ngược lên phần tử message.com.vn .2. <portType name="BankService"> <operation name="GetAccount"> <input message="s0:GetAccountIn" /> <output message="s0:GetAccountOut" /> </operation> </portType> Chúng ta có thể nhận thấy.daihoc. Phần định nghĩa portType trên cũng khá đơn giản. có tên GetAccountIn. Phần tử portType: Ta có thể nói một cách đơn giản như sau: phần tử “types” định nghĩa các kiểu dữ liệu. Theo như định nghĩa trên. phần tử “message” định nghĩa tất cả các thông điệp (hay cũng có thể gọi là gói tin) vào/ra nhưng lại chưa thể hiện được “thông điệp nào là của phương thức nào”. vai trò này do portType đảm nhận. thông điệp đầu vào GetAccountIn nhận một tham số có kiểu GetAccount và thông điệp đầu ra GetAccountOut trả về một kết quả có kiểu GetAccountResponse. Các message được định nghĩa này sẽ được dùng ở phần sau.Java Mobile <message name="GetAccountOut"> <part name="parameters" element="s0:GetAccountResponse" /> </message> Ở đây ta gập lại cấu trúc GetAccout và GetAccountResponse đã định nghĩa ở phần types.

các thông tin kèm theo như tham số truyền vào. <binding name="BankService" type="s0:BankService"> <soap:binding transport = "http://schemas. và kiểu dữ liệu GetAccount được định nghĩa trong phần tử types.3.4. • Thông điệp output: Kết quả trả về được gửi từ server đến client. với những thông tin trên chúng ta chưa xác định được sẽ phải dùng công cụ nào để truy xuất đến web service này: ta sẽ dùng SOAP kết hợp với HTTP hay SOAP/HTTPS hay công cụ nào khác? Phần tử binding sẽ định nghĩa cách thức truy cập web service thông qua các protocols bên dưới.org/soap/http" style="document" /> <operation name="GetAccount"> <soap:operation <input> <soap:body use="literal" /> </input> soapAction = “http://woodgrovebank. Tương tự. có tên GetAccountOut.daihoc. kết quả trả về của mỗi phương thức.vn . 8. Nếu web service của chúng ta hỗ trợ nhiêu protocol thì phải tạo cho mỗi protocol một phần tử binding. Mỗi phần tử binding sẽ mô tả cách thức liên kết một portType vào một protocol nhất định.com.com/GetAccount” style="document" /> 169 Sưu t m b i: www. Phần tử binding Các phần tử chúng ta đã xem xét qua có trách nhiệm định nghĩa web service một cách trừu tượng: chúng cho biết các phương thức được web service hỗ trợ.2.xmlsoap.Java Mobile GetAccountIn sẽ có kiểu GetAccount. Tuy nhiên. phần tử message đã cho chúng ta biết thông điệp GetAccountOut sẽ có kiểu GetAccountResponse và kiểu này đã được định nghĩa trong phần types.

Node 170 Sưu t m b i: www. <service name="BankService"> <port name="BankService" binding="s0:BankService"> <soap:address location = "http://www. chúng ta có thể sử dụng nhiều công cụ khác để truy xuất đến các hàm của web service nhưng SOAP hiện nay là thông dụng nhất.2.com/Bank/BankService.3. 8.daihoc.Java Mobile <output> <soap:body use="literal" /> </output> </operation> </binding> Đoạn ví dụ trên cho biết web service sử dụng SOAP là protocol trao đổi thông tin và gói tin soap sẽ được vận chuyển bằng HTTP.com. Phần tử service: Phần cuối cùng của file WSDL chứa định nghĩa các thông số vật lý cụ thể dùng để truy xuất đến web service. Phần tử “binding” cho biết cách thức ánh xạ các phương thức trong phần tử “portType” thành các gói tin SOAP (hoặc gói tin của các protocols khác) nhưng không cho biết làm thế nào để tạo được một đối tượng portType.asmx"/> </port> </service> Giá trị location trong phần tử port chỉ rõ vị trí đặt web service.woodgrovebank. phần tử port sẽ ánh xạ một phần tử portType sang một địa chỉ URI cụ thể. Đoạn định nghĩa trên còn chỉ rõ “document/encoding style” được sử dụng là dạng document/literal (còn có một dạng khác khá phổ biến là rpc/encoded.vn . hiện tại j2me chỉ hỗ trợ web service dạng document/literal). Đấy là nhiệm vụ của phần tử port.5.

NET đều hỗ trợ công cụ đọc file WSDL để phát sinh các lớp tương ứng phục vụ cho việc truy xuất hàm từ xa. có khá nhiều điểm phức tạp. Nếu web service có thể được truy xuất đến bởi nhiều protocol thì sẽ có nhiều phần tử port được định nghĩa. với vai trò là người sử dụng web service cũng như người xây dựng web service đơn thuần chúng ta không cần nắm rõ cấu trúc file này vì đã có các công cụ hỗ trợ.vn . Tuy nhiên. mọi công việc phức tạp bên dưới đã được giấu đi với nhà phát triển ứng dụng. Cả J2ME và Visual .com.Java Mobile service sẽ gom nhóm các port liên quan đến nhau.daihoc. Trên đây là toàn bộ nội dung của một file WSDL. 171 Sưu t m b i: www.

password của hệ thống SMS. người dùng có thể truy cập hệ thống và sử dụng các chức năng sau của chương trình. 9. Chương trình được thực hiện với mục tiêu mô phỏng lập trình trên thiết bị di động bằng J2ME nên chỉ sử dụng cơ sở dữ liệu tự xây dựng. 9.com.2.1 Đặc tả chương trình: 9.vn . xem điểm thi… chạy trên môi trường điện thoại di động. chương trình còn sử dụng công nghệ WebService trong kết nối mạng.1 Tổng quan: Chương trình hỗ trợ các chức năng đăng ký học phần.Java Mobile Chương 9: Ứng dụng đăng ký học phần 9. Việc ứng dụng thực tế trên cơ sở dữ liệu chính của hệ thống SMS là hướng mở rộng trong tương lai của chương trình. người dùng có thể sử dụng hầu hết các tiện ích tương tự hệ thống SMS mà không cần có máy tính kết nối Internet như hiện nay.daihoc.1. Nếu đăng nhập không hợp lệ người dùng phải nhập lại account/password để đăng nhập lại. Sau khi cài đặt chương trình lên điện thoại và đăng ký dịch vụ truy cập Internet từ điện thoại. Ngoài J2ME. chương trình yêu cầu người dùng đăng nhập với account.1. xem thời khoá biểu.1. Nếu đăng nhập hợp lệ.1 Xem thời khoá biểu: Người dùng nhập tên và số thứ tự lớp (vd:Lớp TH2001 STT:1) để xem thời khoá biểu của học kỳ hiện tại của lớp tương ứng. chỉ sử dụng trong quá trình gửi password khi đăng nhập nhằm tránh việc đánh cắp password. 172 Sưu t m b i: www.2 Các chức năng chính: Khi người dùng khởi động ứng dụng client. Vấn đề bảo mật trong chương trình tương đối không cần thiết.

com.1.3 Xem phiếu đăng ký: Xem lại các học phần lý thuyết và thực hành mà người dùng đã thực hiện đăng ký. 9.2. người dùng có thể đăng ký các học phần lý thuyết cũng như học phần thực hành mà trường mở trong học kỳ này.1. 173 Sưu t m b i: www.4 Xem điểm thi: Xem kết quả học tập của sinh viên . 9.2. 9.2.vn .2.Java Mobile 9.1.2 Đăng ký học phần: Trong thời gian được đăng ký.daihoc.5 Xem thông báo: Xem thông báo của giáo vụ khoa.1.

NET chạy trên HTTP server. Server là chương trình viết bằng .NET Web Server Store Procedures J2ME / JSR172 Client SQL Server DB Server Hình 9. Server sẽ trao đổi thông tin với Database server thông qua các Store procedure.daihoc. Mô hình hoạt động: 174 Sưu t m b i: www.jar và DKHP.1 Mô hình kết nối: HTTP request/ response Gateway GPRS Internet . Client được viết bằng J2ME đóng gói thành DKHP.com. Client này sau khi đăng ký sử dụng dịch vụ internet cho điện thoại sẽ có khả năng kết nối đến server.2 Kiến trúc chương trình: 9. Cơ sở dữ liệu xây dựng trên SQL Server.1 Kiến trúc chương trình ứng dụng Ứng dụng MIDlet chạy trên điện thoại di động đóng vai trò 1 client.vn .2.jad.Java Mobile 9. không có giao diện.

trách nhiệm của nhà cung cấp điện thoại sẽ phải chuyển tín hiệu từ dạng sóng GPRS sang dạng tín hiệu truyền trong đường truyền hữu tuyến internet. Yêu cầu duy nhất của thiết bị phần cứng là điện thoại phải hỗ trợ GPRS và thư viện JSR 172. • Gói tin được điện thoại di động gửi đến web server là những gói tin HTTP request và ngược lại web server sẽ hồi đáp bằng những gói tin HTTP response. nếu không có thư viện này chúng ta không thể tạo các lời gọi hàm cũng như lấy các kết quả trả về từ hồi đáp của server.com. • Các gói tin HTTP response này sẽ đến nhà cung cấp dịch vụ di động.daihoc. Thông tin sau khi được sử lý sẽ được gửi trả cho client thông qua các HTTP response. Gói tin sẽ được gửi dưới dạng sóng GPRS đến trạm điện thoại.Java Mobile • Điện thoại sẽ chủ động kết nối và gửi gói tin đến web server. Thư viện JSR 172 có chức năng tạo các thông điệp SOAP và phân tích nội dung các thông điệp này. Trên đây là mô hình khái quát hoạt động của ứng dụng trong bối cảnh mạng điện thoại di động.vn . • Khi web server nhận được yêu cầu xử lý từ điện thoại (thể hiện qua các lời gọi hàm) sẽ truy xuất và giao tiếp với SQL Server qua các store procedure để thực hiện các xử lý nghiệp vụ của chương trình. tham số truyền đi. • Lúc này nhà cung cấp dịch vụ di động sẽ hoạt động như một gateway. 175 Sưu t m b i: www. các thông điệp SOAP này sẽ chứa các lời gọi hàm. Các gói tin SOAP chính là trung tâm của kỹ thuật web service. làm trung gian liên lạc cho thiết bị di động và web server. Các gói tin HTTP request và HTTP response này sẽ chứa bên trong các thông điệp SOAP request và SOAP response tương ứng. các tham số trả về… tạo thành mô hình truy xuất hàm từ xa RPC (Remote Procedure Call). chuyển thành dạng tín hiệu GPRS và về đến client.

2 Mô hình bảo mật (mã hoá password): Sử dụng thuật toán DES. dùng khoá đối xứng để mã hoá password trong chương trình.com.vn .2 Mô hình mã hoá password 176 Sưu t m b i: www. Same Private Key Encrypted Session Key Encrypted Data Same Session Key Same Session Key Hình 9.2.Java Mobile 9.daihoc.

3.3 Lược đồ use case 9.3.1 Lược đồ chính: Hình 9.2 STT 1 2 Dang nhap Dang ky ly thuyet Danh sách các use case: Use case Ý nghĩa Đăng nhập hệ thống Đăng ký các học phần lý thuyết 177 Sưu t m b i: www.3.vn .daihoc.1 Mô hình use case: 9.3 Phân tích .Java Mobile 9.com.1.1.thiết kế: 9.

Java Mobile

3 4 5 6 7

Dang ky thuc hanh Xem phieu dang ky Xem ket qua hoc tap Xem thoi khoa bieu Xem thong bao

Đăng ký các học phần thực hành Xem phiếu đăng ký học phần Xem kết quả học tập của sinh viên Xem thời khoá biểu của lớp học Xem thông báo của giáo vụ khoa

Bảng 9.1 Danh sách các Use Case 9.3.2 Đặc tả một số use case chính: 9.3.2.1 Đăng nhập:

Mô tả: Hỗ trợ người dùng đăng nhập vào hệ thống. Tác nhân kích hoạt: người dùng. Luồng sự kiện chính: o Chương trình client yêu cầu người dùng nhập account (MSSV), password. o Người dùng nhập thông tin theo yêu cầu. o Client gửi yêu cầu đến server. o Server phát sinh một số ngẫu nhiên (8 bytes), sau đó mã hoá bằng mật mã (khoá đối xứng mà server và client đã chọn từ trước) bằng thuật toán DES thành session key và gửi về cho client. o Client dùng khoá bí mật giải mã session key này để tạo lại số ngẫu nhiên tương ứng mà server đã tạo. Sau đó, client dùng số ngẫu nhiên vừa tìm được để mã hoá password gửi kèm account đến server. o Server nhận hai giá trị này từ client, truy cập cơ sở dữ liệu để lấy password của account tương ứng. Sau đó, dùng session key mã hoá password trong cơ sở dữ liệu và so sánh kết quả với password đã được mã hoá nhận từ client. Nếu hợp lệ, trả về client giá trị “true”, nếu không, trả về “false”. o Client nhận kết quả từ server. Điều kiện sau: tuỳ theo kết quả trả về từ server,

178
Sưu t m b i: www.daihoc.com.vn

Java Mobile

o nếu là “false”, thông báo đăng nhập không hợp lệ, người dùng phải đăng nhập lại để sử dụng chương trình. o nếu là “true”, người dùng đăng nhập hợp lệ, hiển thị menu chức năng chương trình cho người dùng sử dụng.

9.3.2.2

Đăng ký lý thuyết:

Mô tả: Cho phép người dùng đăng ký các học phần lý thuyết có mở trong học kỳ này. Tác nhân kích hoạt: ngừơi dùng Luồng sự kiện chính: o Người dùng chọn chức năng đăng ký lý thuyết. o Client gửi yêu cầu đến cho server. o Server lấy danh sách tất cả các học phần có mở trong học kỳ này, có đánh dấu các học phần người dùng đã đăng ký trước đó, trả về cho client. o Client hiển thị danh sách lên cho người dùng, người dùng chọn các môn muốn đăng ký hoặc hiệu chỉnh lại đăng ký cũ. o Người dùng nhấn nút đăng ký, client lấy danh sách các môn mới được đăng ký và các môn vừa được người dùng gỡ bỏ gửi cho server. o Server truy cập cơ sở dữ liệu, xoá các đăng ký thực hành đã đăng ký trong học kỳ này. Sau đó xoá các đăng ký lý thuyết cũ đã được gỡ bỏ và ghi các đăng ký lý thuyết mới. Luồng sự kiện phụ: Sau khi hết use case đăng ký lý thuyết, use case xem phiếu đăng ký lý thuyết sẽ được gọi. Điều kiện trước: Người dùng phải đăng nhập thành công vào hệ thống.

179
Sưu t m b i: www.daihoc.com.vn

Java Mobile

9.3.2.3

Đăng ký thực hành:

Mô tả: Cho phép người dùng đăng ký các học phần thực hành trong học kỳ này Tác nhân kích hoạt: Người dùng. Luồng sự kiện chính: o Người dùng chọn chức năng đăng ký thực hành. o Client gửi yêu cầu lên server. o Server lấy từ cơ sở dữ liệu tất cả các học phần thực hành có mở tương ứng với các học phần lý thuyết mà người dùng đã đăng ký. Các học phần thực hành đã được người dùng đăng ký trước được đánh dấu riêng o Client nhận thông tin từ server, hiển thị danh sách các học phần thực hành để người dùng đăng ký. o Sau khi người dùng nhấn nút đăng ký, client sẽ lấy danh sách các lớp người dùng mới đăng ký và danh sách các lớp người dùng bỏ đăng ký gửi lên server. o Server truy cập cơ sở dữ liệu, thực hiện đăng ký và huỷ đăng ký theo yêu cầu của client. Luồng sự kiện phụ: Sau khi hết use case đăng ký lý thuyết, use case xem phiếu đăng ký lý thuyết sẽ được gọi. Điều kiện trước: Người dùng phải đăng nhập thành công vào hệ thống.

9.3.2.4

Xem phiếu đăng ký:

Mô tả: Cho phép người dùng xem lại danh sách các học phần lý thuyết hay thực hành mà người dùng đã đăng ký trong học kỳ này. Tác nhân kích hoạt: người dùng, hệ thống. Luồng sự kiện chính:

180
Sưu t m b i: www.daihoc.com.vn

Java Mobile

o Người dùng chọn một trong hai chức năng xem phiếu đăng ký học phần lý thuyết hay phiếu đăng ký học phần thực hành. o Client gửi yêu cầu lên server. o Server truy cập cơ sở dữ liệu, lấy danh sách các học phần lý thuyết hay thực hành theo yêu cầu client mà người dùng đã đăng ký thành công, trả về cho client. o Client hiển thị kết quả cho người dùng. Điều kiện trước: Người dùng phải đăng nhập thành công vào hệ thống.

9.3.2.5

Xem kết quả học tập:

Mô tả: Cho phép người dùng xem kết quả các học phần người dùng có học và đã có điểm trong một học kỳ cụ thể. Tác nhân kích hoạt: Người dùng. Luồng sự kiện chính: o Người dùng chọn chức năng xem kết quả học tập. o Client yêu cầu người dùng chọn học kỳ, năm học muốn xem điểm thi. o Người dùng nhập thông tin yêu cầu, nhấn nút xem điểm. Client gửi yêu cầu đến server. o Server truy cập cơ sở dữ liệu, lấy danh sách điểm thi các môn học thoả yêu cầu (các học phần trong học kỳ yêu cầu và đã có điểm thi) gửi cho client. o Client hiển thị kết quả cho người dùng. Điều kiện trước: Người dùng phải đăng nhập thành công vào hệ thống.

9.3.2.6

Xem thời khoá biểu:

Mô tả: Cho phép người dùng xem thời khoá biểu các học phần của lớp trong học kỳ hiện tại. Tác nhân kích hoạt: Người dùng.

181
Sưu t m b i: www.daihoc.com.vn

o Client hiển thị kết quả trả về cho người dùng. o Server truy cập cơ sở dữ liệu.vn . Tác nhân kích hoạt: Người dùng. o Client hiển thị các tiêu đề thông báo này cho người dùng. Client hiển thị nội dung này lên màn hình cho người dùng. gửi trả về cho client. o Server truy cập cơ sở dữ liệu để lấy nội dung thông báo.3. o Server truy cập cơ sở dữ liệu. sắp xếp theo thời gian giảm dần. số thứ tự lớp). lấy danh sách thông tin các học phần lý thuyết hoặc học phần thực hành có mở trong học kỳ này theo yêu cầu.daihoc.Java Mobile Luồng sự kiện chính: o Người dùng chọn chức năng xem thời khoá biểu. 182 Sưu t m b i: www. Luồng sự kiện chính: o Người dùng chọn chức năng xem thông báo.2. gửi về cho client. o Client gửi yêu cầu lên server.com. o Client gửi yêu cầu lên server. Luồng sự kiện phụ: o Nếu người dùng chọn một trong các tiêu đề và nhấn nút xem thông báo. o Client yêu cầu người dùng nhập thông tin lớp học muốn xem thời khoá biểu (tên lớp. trả về cho client. lấy tiêu đề của 10 thông báo gần đây nhất. Client sẽ gửi yêu cầu đến server. 9. o Người dùng nhập thông tin theo yêu cầu và nhấn nút xem thời khoá biểu lý thuyết hoặc thời khoá biểu thực hành.7 Xem thông báo: Mô tả: Hỗ trợ người dùng xem các thông báo của giáo vụ khoa.

daihoc.4. NgaySinh. SoTCLT.4 Mô hình thực thể kết hợp ER 9.4 Thiết kế mô hình dữ liệu: 9.com. TenChuyenNganh SV: MonHoc: MaSV.vn .4.Java Mobile 9. SoTCTH 183 Sưu t m b i: www.2 Các bảng dữ liệu: ChuyenNganh: MaChuyenNganh. TenMonHoc. password MaMH. ChuyenNganh. DiaChi.1 Mô hình thực thể kết hợp: Hình 9. TenSV.

Phong. SiSo.Java Mobile GV: Lop: Lop_MonLT: MaGV. NgayTB. MaLopLT. TenLop.2 SV: Lưu trữ thông tin của sinh viên Tên field MaSV TenSV NgaySinh DiaChi password Kiểu dữ liệu nvarchar(10) nvarchar(60) datetime nvarchar(100) nvarchar(25) Ý nghĩa Mã số sinh viên Tên sinh viên Ngày sinh của sinh viên Địa chỉ của sinh viên Mã chuyên ngành Mật mã account của sinh viên Bảng 9. DiaChi MaLop. MaLop. NamHoc.com.3. SiSoMax. DiemTC MaSV. Tiet Lop_MonTH: MaLopTH. MaLopTH MaThongBao.2 Table ChuyenNganh 9. STT. STT.3 Chi tiết các bảng dữ liệu: 9. SiSo. MaMH. DiemLT. MaLopLT. Phong. TenGV. Thu. DiemTH. MaGV. NoiDung 9.4.4. MaLopTH DangKyLT: DangKyTH: ThongBao: MaSV.3.3 Table SV Khoá ngoại Ghi chú Khóa chính ChuyenNganh nvarchar(4) 184 Sưu t m b i: www.1 ChuyenNganh: Các chuyên ngành của khoa Tên field MaChuyenNganh Kiểu dữ liệu nvarchar(4) Ý nghĩa Mã chuyên ngành Tên chuyên ngành Ghi chú Khóa chính TenChuyenNganh nvarchar(100) Bảng 9.daihoc. Thu.vn .4. Tiet PhanCongTH: MaGV. HK. STT MaLopLT. TieuDe. SiSoMax.

5 Table GV 9.4 Table MonHoc 9.3.3.3.daihoc.4 GV: Ghi chú Khoá chính Lưu trữ thông tin giáo viên Tên field MaGV TenGV DiaChi Kiểu dữ liệu int nvarchar(60) nvarchar(100) Ý nghĩa Mã giáo viên Tên giáo viên Địa chỉ liên lạc của giáo viên Bảng 9.5 Lop: Ghi chú Khoá chính Lưu thông tin lớp Tên field MaLop TenLop STT Kiểu dữ liệu nvarchar(12) nvarchar(10) int Mã lớp Tên lớp (niên khoá tương ứng) Số thứ tự lớp (cùng niên khoá) Bảng 9.3 MonHoc: Lưu trữ thông tin môn học Tên field MaMH TenMH SoTCLT SoTCTH Kiểu dữ liệu nvarchar(5) nvarchar(30) int int Ý nghĩa Mã môn học Tên môn học Số tín chỉ lý thuyết Số tín chỉ thực hành Bảng 9.com.3.6 Lop_MonLT: Ý nghĩa Ghi chú Khoá chính Lưu thông tin các học phần lý thuyết được mở trong mỗi học kỳ Tên field MaLopLT Kiểu dữ liệu int Ý nghĩa Mã học phần Ghi chú Khoá chính 185 Sưu t m b i: www.4.4.Java Mobile 9.4.vn .6 Table Lop 9.4.

4.7 Table Lop_MonLT 9.com.vn .daihoc.3.Java Mobile MaLop STT MaMH HK NamHoc SiSo SiSoMax MaGV Phong Thu Tiết nvarchar(12) int nvarchar(5) int nvarchar(9) int int int nvarchar(10) nvarchar(5) nvarchar(5) Mã lớp tương ứng STT lớp (nếu mở nhiều lớp nhỏ như các lớp Anh văn) Mã môn học Học kỳ (1 hay 2) Năm học (vd: 2004-2005) Sĩ số đăng ký hiện tại Sĩ số dự kiến Mã giáo viên phụ trách Phòng học Lịch học vào các ngày trong tuần Tiết học trong ngày Khoá ngoại Khoá ngoại Khoá ngoại Bảng 9.7 Lop_MonTH: Lưu thông tin các lớp thực hành tương ứng của các lớp lý thuyết Tên field MaLopTH MaLopLT STT Kiểu dữ liệu int int int Ý nghĩa Mã lớp thực hành Mã lớp lý thuyết tương ứng Số thứ tự lớp thực hành(một lớp lý thuyết có thể có nhiều lớp thực hành) SiSo SiSoMax MaGV Phong Thu int int int nvarchar(10) nvarchar(5) Sĩ số đăng ký hiện tại Sĩ số dự kiến Mã giáo viên hướng dẫn thực Khoá ngoại hành Phòng học Lịch học vào các ngày trong Ghi chú Khoá chính Khoá ngoại 186 Sưu t m b i: www.

daihoc.3.4.8 PhanCongTH: Phân công giáo viên hướng dẫn thực hành cho từng lớp Tên field MaGV MaLopTH Kiểu dữ liệu int int Ý nghĩa Mã giáo viên hướng dẫn Mã lớp thực hành Bảng 9.11 ThongBao: Các thông báo của văn phòng khoa Ghi chú Khoá chính Ghi chú Khoá chính 187 Sưu t m b i: www.10 Table DangKyLT 9.9 Table PhanCongTH 9.com.10 DangKyTH: Thông tin đăng ký học phần thực hành Tên field MaSV MaLopTH Kiểu dữ liệu nvarchar(10) int Ý nghĩa Mã số sinh viên Mã lớp thực hành đăng ký Bảng 9.3.4.8 Table Lop_MonTH 9.Java Mobile tuần Tiết nvarchar(5) Tiết học trong ngày Bảng 9.11 Table DangKyTH 9.9 DangKyLT: Ghi chú Khoá chính Thông tin đăng ký học phần lý thuyết Tên field MaSV MaLopLT DiemLT DiemTH DiemTC Kiểu dữ liệu nvarchar(10) int float float float Ý nghĩa Mã số sinh viên Mã lớp lý thuyết đăng ký Điểm thi lý thuyết Điểm thi thực hành Điểm tổng cộng Bảng 9.4.4.3.3.vn .

Trong cùng một lớp lý thuyết. Ngày sinh của sinh viên phải nhỏ hơn ngày hiện tại.4.2 Ràng buộc liên thuộc tính: Điểm thực hành không lớn hơn điểm tổng cộng.4.12 Table ThongBao 9.4. Năm học có dạng xxxx-yyyy với yyyy=xxxx+1 .4. liên bộ: Sĩ số hiện tại của các lớp lý thuyết.4. 188 Sưu t m b i: www.vn . Sĩ số tối đa các lớp lý thuyết. thực hành là số không âm.4 Ràng buộc dữ liệu: 9. Học kỳ có giá trị 1 hoặc 2. 9. Mã môn học có dạng xxyyy với xx là dạng ký tự. Sĩ số các lớp lý thuyết. một năm học. điểm tổng cộng trong khoảng 0 đến 10.Java Mobile Tên field MaThongBao NgayTB TieuDe NoiDung Kiểu dữ liệu int datetime nvarchar(100) Ý nghĩa Mã thông báo (tự động) Ngày ra thông báo Tiêu đề của thông báo Ghi chú Khoá chính nvarchar(2000) Nội dung thông báo Bảng 9. Điểm lý thuyết không lớn hơn điểm tổng cộng. Vd: 2004-2005. lớp thực hành bằng tổng số sinh viên đã đăng ký học lớp đó. các lớp thực hành phải có số thứ tự liên tục từ 1. Trong cùng một học kỳ.4. điểm thực hành. các học phần lý thuyết của cùng một môn học phải có số thứ tự liên tục từ 1. thực hành là số dương.4. 9.daihoc.1 Ràng buộc miền giá trị: Điểm lý thuyết. yyy là các ký số.com.3 Ràng buộc liên quan hệ. Các lớp lý thuyết. lớp thực hành có sĩ số không lớn hơn sĩ số max.

Lop_MonLT MaLopLT MaLopTH DangKyLT DangKyTH MaSV : Các học phần thực hành SV đã đăng ký : Các học phần thực hành có mở ứng với các học phần lý thuyết SV đã đăng ký Hình 9.4.4 Ràng buộc chu trình: Sinh viên chỉ được phép đăng ký các học phần thực hành của các học phần lý thuyết đã đăng ký.vn .Java Mobile 9.5 Ràng buộc chu trình 189 Sưu t m b i: www.com.daihoc.4.

Java Mobile 9.6 Các chức năng store procedures: • sp_XEM_DIEM: Lấy điểm thi của sinh viên trong một học kỳ cho trước hay tất cả các học kỳ.4.daihoc. 190 Sưu t m b i: www. • sp_XEM_TKB_LT: Lấy thông tin thời khoá biểu lý thuyết của một lớp khi biết tên lớp và số thứ tự lớp.4.vn .6 Mô hình cơ sở dữ liệu 9. • sp_XEM_TKB_TH: Lấy thông tin thời khoá biểu thực hành của một lớp khi biết tên lớp và số thứ tự lớp.com.5 Mô hình dữ liệu: Hình 9.

vn . chuyển đến server.Java Mobile • sp_DelAllTH: Xoá tất cả đăng ký thực hành của một sinh viên tại một học kỳ cho trước. • sp_RegisterLT: Thực hiện đăng ký một học phần lý thuyết. • sp_getRegLT: Lấy thông tin đăng ký học phần lý thuyết của sinh viên trong một học kỳ cho trứơc. có đánh dấu các học phần đã được sinh viên đăng ký. (Chỉ cho phép đăng ký khi sĩ số đăng ký còn nhỏ hơn sĩ số tối đa của học phần đó) • sp_RegisterTH: Thực hiện đăng ký một học phần thực hành. • sp_getLopLT: Lấy thông tin tất cả các học phần lý thuyết có mở trong một học kỳ cho trước. Dùng để hiển thị danh sách các học phần lý thuyết để sinh viên đăng ký. • sp_getRegTH: Lấy thông tin đăng ký học phần thực hành của sinh viên trong học kỳ cho trước. (Chỉ cho phép đăng ký khi sĩ số đăng ký còn nhỏ hơn sĩ số tối đa) • sp_getNewsTitle: Lấy tiêu đề 10 thông báo gần đây nhất • sp_getNewsContent: Lấy nội dung một thông báo cụ thể 9. 191 Sưu t m b i: www.com.daihoc. (Khi sinh viên hiệu chỉnh đăng ký lý thuyết thì tất cả các học phần thực hành cũ đã đăng ký sẽ bị xoá trước) • sp_DelRegisterLT: Xoá đăng ký một học phần lý thuyết.7 Thiết kế lớp: Chương trình phía client chỉ giữ nhiệm vụ nhận yêu cầu từ phía người dùng. Chương trình phía server làm nhiệm vụ xử lý chính và tương tác với cơ sở dữ liệu.4. • sp_getLopTH: Lấy thông tin các học phần thực hành có mở tương ứng với các học phần lý thuyết mà sinh viên đã đăng ký.

daihoc. gói JSR172 để hỗ trợ gửi nhận các gói tin SOAP. 192 Sưu t m b i: www.thử nghiệm: 9. • Server: server hỗ trợ kết nối web (có địa chỉ cố định để client kết nối đến).com.Java Mobile Hình 9. Cơ sở dữ liệu có thể đặt trực tiếp tại web server hay tại database server riêng biệt.vn . Có thể sử dụng chương trình giả lập của điện thoại tương ứng. gói JSR177 hỗ trợ mã hoá.7 Mô hình Lớp 9.5 Cài đặt .1 Yêu cầu phần cứng: • Client: điện thoại hỗ trợ kết nối GPRS (để kết nối mạng).5.

Java Mobile

9.5.2 Yêu cầu phần mềm: Client: • Máy ảo Java j2sdk 1.4.2_05. • J2ME Wireless Toolkit 2.3. • Ngoài ra có thể dùng JBuider10 để hỗ trợ soạn thảo chương trình Java, cũng như các chương trình giả lập điện thoại khác. Server: • Dot Net FrameWork. • Database server phải cài sql server 2000. 9.5.3 Giao diện chương trình: Server: không cần giao diện. Client:

193
Sưu t m b i: www.daihoc.com.vn

Java Mobile

Hình 9.8 Sơ đồ các màn hình

194
Sưu t m b i: www.daihoc.com.vn

Java Mobile

9.5.3.1

Màn hình welcome:

Hình 9.9 Màn hình welcome

195
Sưu t m b i: www.daihoc.com.vn

Java Mobile

9.5.3.2

Màn hình đăng nhập:

Hình 9.10 Màn hình đăng nhập Khi đăng nhập, trước khi bắt đầu kết nối, chương trình hiển thị nhắc nhở “bạn có thực sự muốn kết nối mạng hay không ?” vì khi kết nối, người dùng phải trả chi phí cho nhà cung cấp dịch vụ. Nếu đồng ý, nhấn nút OK, chương trình sẽ thực hiện kết nối và cho biết kết quả đăng nhập, nếu không, người dùng thoát khỏi ứng dụng.

196
Sưu t m b i: www.daihoc.com.vn

daihoc.com.vn .11 Confirm 197 Sưu t m b i: www.Java Mobile Hình 9.

5.3.3 Menu chức năng: Hình 9.12 Menu chức năng 198 Sưu t m b i: www.daihoc.vn .com.Java Mobile 9.

13 Màn hình đăng ký học phần lý thuyết 199 Sưu t m b i: www.daihoc.Java Mobile 9.com.4 Màn hình đăng ký lý thuyết: Hình 9.5.3.vn .

14 Màn hình đăng ký học phần thực hành 200 Sưu t m b i: www.3.vn .Java Mobile 9.5 Màn hình đăng ký học phần thực hành: Hình 9.5.daihoc.com.

6 Màn hình xem thời khoá biểu: Hình 9.5.Java Mobile 9.15 Màn hình xem thời khoá biểu 201 Sưu t m b i: www.com.daihoc.3.vn .

16 Màn hình xem kết quả học tập 202 Sưu t m b i: www.daihoc.5.Java Mobile 9.3.7 Màn hình xem kết quả học tập: Hình 9.vn .com.

8 Màn hình xem phiếu đăng ký học phần: Hình 9.5.3.Java Mobile 9.17 Màn hình xem phiếu đăng ký 203 Sưu t m b i: www.com.vn .daihoc.

daihoc.5.com.3.9 Màn hình xem thông báo: Hình 9.Java Mobile 9.18 Màn hình xem thời khoá biểu 204 Sưu t m b i: www.vn .

vì được thực hiện trong thời gian giới hạn. • Vận dụng tốt các kỹ thuật lập trình bằng J2ME.com. • Tìm hiểu và ứng dụng công nghệ Web service trong trao đổi dữ liệu giữa server và client. gồm: • Giới thiệu về CLDC. • Các thành phần giao diện trong MIDlet. có thể áp dụng trong thực tế.vn . Chúng tôi đã cố gắng trình bày những kiến thức nền tảng trong J2ME và xây dựng thành công ứng dụng “Đăng ký học phần bằng điện thoại di động”. nên luận văn vẫn còn một số hạn chế: 205 Sưu t m b i: www.Java Mobile Chương 10: Tổng kết 10. với các kết quả đạt được: • Ứng dụng hoàn chỉnh. Luận văn giới thiệu các kiến thức về lập trình trên điện thoại di động dùng J2ME. • Nhắn tin SMS với WMA. MIDP. • … Từ kết quả này. • Các thành phần của ứng dụng MIDlet. • Kết nối mạng với GCF. Tuy nhiên.daihoc.1 Kết luận: Sau hơn 5 tháng thực hiện. luận văn đã hoàn thành và đạt được một số kết quả nhất định. với tương đối đầy đủ các chức năng tương tự hệ thống đăng ký học phần SMS dành cho sinh viên trên web. chúng tôi đã tiến hành xây dựng ứng dụng “Đăng ký học phần bằng điện thoại di động”. • Lưu trữ dữ liệu với RMS. sử dụng khoá bí mật 64 bits. • Sử dụng thuật toán DES để mã hoá password.

Các yêu cầu bắt buộc phải có để thử nghiệm được ứng dụng ở môi trường thực tế: • Phải có điện thoại di động hỗ trợ công nghệ JSR 172. Một số lý do khiến ứng dụng khó áp dụng rộng rãi ở Việt Nam tại thời điểm hiện tại: • Hiện tại số lượng điện thoại hỗ trợ bộ thư viện JSR-172 chưa nhiều vì công nghệ này khá mới. • Phải có một server IIS và một địa chỉ IP thực (có thể đã thông qua NAT). • Ứng dụng sử dụng cơ sở dữ liệu tự xây dựng nên chưa hoàn toàn chính xác với thực tế. • Điện thoại phải truy cập được GPRS và nhà cung cấp phải hỗ trợ dịch vụ này.0.Java Mobile • Trong quá trình tìm hiểu công nghệ J2ME. có một số thuật ngữ tiếng Anh không thể được chuyển ngữ một cách chính xác. N91. Motorola A860…) • Công nghệ kết nối mạng được sử dụng là GPRS. (Nokia N90. nhưng các điện thoại này hầu hết chưa có mặt tại VN.0. Do ta truy xuất thông qua nhà cung cấp dịch vụ viễn thông nên không thể dùng các địa chỉ Private IP (10.0. Số lượng kiến thức trong lãnh vực J2ME rất lớn và liên tục được cập nhật nên luận văn chắc chắn còn nhiều thiếu sót. • Ứng dụng chỉ được thử nghiệm bằng chương trình giả lập. chưa có điều kiện chạy trên thiết bị thật.vn . ngoài ra để phục vụ cho nhu cầu mã hoá dữ liệu.Hồ Chí Minh.0. 206 Sưu t m b i: www.…) cho server.29. khoảng 50/1Kbyte.0. Hiện nay chỉ một số điện thoại ra đời gần đây là hỗ trợ công nghệ này.com.daihoc. điện thoại cần hỗ trợ JSR 177. hiện tại theo chúng tôi được biết công nghệ này chỉ được hỗ trợ ở hai thành phố lớn là Hà Nội và TP. Giá cước của loại hình dịch vụ này hiện nay còn khá đắt.172.

Nhóm sẽ tiếp tục nghiên cứu và quan tâm đến các tin tức cập nhật về công nghệ. Web Service của chúng tôi lúc này không cần hỗ trợ thao tác với cơ sở dữ liệu mà đóng vai trò biến đổi những dữ liệu gửi đến từ chương trình trên thiết bị di động để phù hợp với dữ liệu input của hệ 207 Sưu t m b i: www. Việc này rõ ràng không thuận tiện. tuy nhiên vì các lý do khách quan về thiết bị phần cứng nên mong muốn của chúng tôi chưa đạt được.Java Mobile 10.daihoc.2 Hướng phát triển: Mục tiêu ban đầu của chúng tôi đề ra khi xây dựng ứng dụng là giúp cho sinh viên của trường Tự Nhiên có thể đăng ký học phần qua điện thoại.Về sau.1 Hướng phát triển thực tế Lúc này Web Service của chúng tôi sẽ đóng vai trò trung gian giữa ứng dụng J2ME và ứng dụng Đăng Ký Học Phần của Khoa. đến khi điều kiện Việt Nam cho phép chúng tôi sẽ thử nghiệm ứng dụng của mình trong môi trường thực tế. gây dư thừa và có khả năng xảy ra đụng đột giữa hai hệ thống. nếu được phép chúng tôi sẽ tích hợp ứng dụng với dữ liệu của khoa theo mô hình sau: Hình 10.vn . Hiện tại ứng dụng của chúng tôi đang sử dụng Cơ Sở Dữ Liệu tự xây dựng nên chưa có sự liên thông với dữ liệu của khoa CNTT. Yêu cầu duy nhất đối với hệ thống của khoa CNTT là cung cấp cho chúng tôi những chức năng chính dưới dạng những hàm được export của một Web Service.com.

cấu trúc của các hệ thống khác nhau. Thói quen giao dịch trực tuyến chưa được hình thành trong đại đa số người dân.com hay www. xem chỉ số chứng khoán.com . Việt Nam là một nước có tỉ lệ người sử dụng điện thoại di động khá cao tuy nhiên lãnh vực thương mại điện tử lại chưa phát triển. chúng ta sẽ thực hiện giao dịch qua một bên trung gian được gọi là "payment gateway".secpay. Một yếu tố quan trọng trong các ứng dụng thương mại điện tử là quá trình chi trả trực tuyến.com. Các nhà phát triển đánh giá lãnh vực thương mại điện tử trên môi trường thiết bị di động sẽ phát triển rất nhanh chóng. Việc nghiên cứu công nghệ Web Service trong môi trường J2ME sẽ giúp chúng tôi có thể xây dựng nhiều hệ thống thương mại trực tuyến khác trong tương lai chứ không đơn thuần gói gọn trong ứng dụng đã trình bày. Có một điểm cần nói thêm là ứng dụng của khoa không nhất thiết phải là một web service mà có thể chỉ là một ứng dụng TCP giao tiếp thông qua socket đơn thuần.vn . đặc biệt Web Service là một công nghệ mới và được chuẩn hoá nên hứa hẹn sẽ vượt qua những rào cản của các mô hình trước đây.daihoc. Công nghệ J2ME và công nghệ Web Service đều là những công nghệ có tiềm năng to lớn. Lúc này chúng tôi sẽ giao tiếp với ứng dụng J2ME qua giao thức web service và giao tiếp với ứng dụng của khoa theo mô hình lập trình socket quen thuộc vẫn được. với sự phát triển nhanh chóng của ngành phần mềm cho thiết bị di động và web service. Các ứng dụng thương mại dựa trên Web Service sẽ có thể hoạt động tốt trong môi trường firewall và không bị rào cản do sự khác nhau về dữ liệu.google. người đọc có thể tìm hiểu thêm về khái niệm này trên www.Java Mobile thống của khoa CNTT và ngược lại. máy bay. Lúc này việc coding trên điện thoại di động và ứng dụng của Khoa hầu như không có thay đổi vì mọi thay đổi sẽ diễn ra tại web service trung gian của chúng tôi. dự báo thời tiết… qua 208 Sưu t m b i: www. Sự ra đời của Web Service đã khiến việc xây dựng những ứng dụng thương mại tiến thêm một bước quan trọng. Tuy nhiên. là ngành công nghiệp sẽ đem lại nhiều tỉ đô la doanh thu. đặt chỗ khách sạn. chúng tôi hy vọng tương lai sẽ có thêm nhiều ứng dụng phục vụ cho đời sống như mua vé tàu hoả.

vn .Java Mobile môi trường di động.daihoc. 209 Sưu t m b i: www.com. Chúng tôi mong muốn được góp sức cho sự phát triển của lãnh vực thương mại điện tử qua môi trường di động tại Việt Nam.

org: Trang chủ tổ chức Java Community Process 4. Prentice Hall PTR.com. Enterprise J2ME™: Developing Mobile Java Application.org: Diễn đàn Java Việt Nam 3. 2002 7. David Chappell . http://www. Michael Juntao Yuan.Java Web Service in A Nutshell.com: Trang chủ Sun Java 2. 2002 3.daihoc. http://jcp. 2003 11. Wireless J2ME™ Platform Programming. Kim Topey. 2001 6.forum. 1998 2. 2002 Web Sites: 1.microsoft. Cracking the Code™ .Tyler Jewell. 210 Sưu t m b i: www. New Jersey. James White-David Hemphill. Prentice Hall. nơi có nhiều tài liệu cho nhà phát triển. Core J2ME™ Technology & MIDP. Microsoft. 2002 5. 2003 8. Java Web Services. John W. 2002 4. Developing XML Web Services using Microsoft Visual C#. J2ME™ in a Nutshell. Manning. O'Reilley. O'Reilley. Muchow. Java in small things.Java Mobile Tài liệu tham khảo Books: 1.sun. Prentice Hall. Prentice Hall PTR. Vartan Piroumian. http://msdn. http://java. Thinking in Java 3rd. Addision Wesley.nokia. Dreamtech Software Team. http://javavietnam.com: Forum của Hãng Nokia. 2001 10. MSDN Training. Hungry Minds. Roger Riggs. O’Reilley. Programming Wireless Devices with the Java™ 2 Platform Micro Edition.com: Trang tài liệu MSDN online 5. 2003 9. Bruce Eckel.vn . Kim Topey.

vn . tự phát sinh file JAD và file JAR.3 Wireless ToolKit là bộ công cụ giả lập thiết bị di động. Để tạo một chương trình ứng dụng mới. ta chọn chức năng New Project 211 Sưu t m b i: www.daihoc.Java Mobile Phụ Lục A: Hướng dẫn sử dụng công cụ Sun Wireless ToolKit 2.com. Wireless ToolKit cung cấp các chức năng thuận lợi cho nhà phát triển J2ME như biên dịch các file mã nguồn. giả lập các thiết bị di động với các chức năng phong phú… Hình A.1 Công cụ Sun WirelessToolkit 2.3 Để vào màn hình ứng dụng chính của Wireless ToolKit ta sử dụng chức năng KToolBar.

Sau đó Wireless ToolKit sẽ cung cấp một màn hình tùy chọn 212 Sưu t m b i: www.2 Màn hình chính của công cụ Sau đó chương trình sẽ yêu cầu chúng ta nhập tên Project và tên của lớp ứng dụng MIDLet (bao gồm cả tên Package). Giả sử ta cài đặt wireless toolkit vào thư mục C:\WTK thì chương trình sẽ tạo thư mục C:\WTK\apps\J2ME Project\ sau những bước vừa làm như trên.com.3 Tạo project mới Lúc này Wireless ToolKit sẽ tạo một thư mục có tên theo Project Name ta vừa nhập (J2ME Project) trong thư mục apps của thư mục gốc cài đặt wireless toolkit. Hình A.daihoc.Java Mobile Hình A.vn .

com.Java Mobile Hình A. check chọn các thư viện JSR 172 (Web Service) và JSR 177 (hỗ trợ mật mã hóa dữ liệu). chúng ta sẽ chọn Cofiguration sử dụng là CLDC 1. (Ta có thể chọn mục Project/Setting để trở lại màn hình này bất kỳ lúc nào).1.daihoc.4 Các options cho project Chúng ta sẽ chọn các thư viện mở rộng cần Wireless ToolKit hỗ trợ đối với Project vừa tạo. Sau đó ta chọn Tab MIDlets 213 Sưu t m b i: www.vn . Ứng với ứng dụng "Đăng Ký Học Phần" trong luận văn.

(Ý nghĩa các thuộc tính đã được trình bày rất kỹ ở phần 2. ta phải khai báo đúng tên lớp của MIDlet nếu không sẽ phát sinh lỗi trong quá trình biên dịch. Trong gói ứng dụng của ta.Java Mobile Hình A.4 MIDlet Suite trong báo cáo luận văn). Đặc biệt phải chú ý đến thuộc tính Class.vn . có thể có nhiều MIDlet và mỗi MIDlet phải được khai báo chính xác các thuộc tính trong phần này. 214 Sưu t m b i: www.2.com.daihoc.5 Chỉnh sửa nội dung file Jad và Jar Đây là những thuộc tính cực kỳ quan trọng đối với ứng dụng và sẽ được đóng gói trong file JAD cũng như file manifest của file JAR.

công cụ Wireless Toolkit không phải là bộ công cụ hỗ trợ biên soạn mã nguồn mà chỉ có chức năng biên dịch. Ta cần lưu ý. Điều này khá quen thuộc với những người dùng đã từng sử dụng ngôn ngữ Java trước đây. Cấu trúc thư mục Project: Với mỗi Project được tạo ra đều có những thư mục con như sau: Bin: Chứa file JAD và file JAR sau khi đã được đóng gói. Biên dịch chương trình Hình A. 215 Sưu t m b i: www. Để hỗ trợ việc soạn thảo mã nguồn chúng ta có thể sử dụng Jbuilder hoặc các chương trình tương đương.6 Biên dich project Ta dùng tính năng Build để biên dịch các file mã nguồn. nếu không có lỗi phát sinh ta có thể sử dụng tính năng Run để thực thi chương trình.vn . thực thi và đóng gói ứng dụng.com.daihoc.Java Mobile Sau đó ta có thể dùng các chương trình quản lý file thông dụng để chép các file mã nguồn của ứng dụng vào thư mục C:\WTK\apps\J2ME Project\ vừa được tạo ra. Nếu các file mã nguồn nằm trong các package thì ta phải tạo các thư mục con ứng với các package và đưa các file mã nguồn vào đúng chính xác các thư mục con tương ứng. Giả sử như trên ta phải tạo thư mục MyPackage trong thư mục C:\WTK\apps\J2ME Project\ và chép các tập tin mã nguồn vào thư mục MyPackage vừa tạo đó.

vn . Tạo file JAD và file JAR: Hình A.daihoc.java Tmpclasses và Tmplib: Các thư mục tạm của wireless toolkit.png của project. Src: Chứa các file mã nguồn chưa biên dịch dạng . Res: Chứa các file resource như file hình dạng .com.Java Mobile Classes: Chứa file mã nguồn được biên dịch thành dạng .7 Đóng gói ứng dụng Ta chọn chức năng Create Package có sẵn trong tab project để phát sinh các file JAR và file JAD để có thể đưa vào thiết bị thật để sử dụng.class Lib: Chứa các thư viện cộng thêm của Project. chúng ta thường không dùng đến. 216 Sưu t m b i: www.

daihoc. chúng ta chỉ cần tạo mới một project ASP.Java Mobile Phụ Lục B: Xây dựng và Sử dụng Web Service Xây dựng Web Service bằng Microsoft Studio . những hàm nào có nhu cầu export để gọi từ xa chúng ta khai báo thêm cụm từ [Web Method].NET: Việc xây dựng một web service trong môi trương Visual Studio . Trong lớp vừa tạo của chúng ta.Net rất dễ dàng. 217 Sưu t m b i: www.vn .NET (có thể bằng ngôn ngữ C# hoặc VB.Services.1 Tạo project Web Service Sau đó ta khai báo một lớp mới để chứa service.com.NET) Hình B.WebService. lúc này Studio sẽ giúp chúng ta biên dịch mọi thứ để hình thành một Web Service tương ứng. lớp này kế thừa từ lớp System.Web.

Ngoài ra . 218 Sưu t m b i: www. phần còn lại là trách nhiệm của Visual Studio. Thuộc tính quan trọng nhất cần chú ý là EnableSession. trước mỗi hàm cần cho phép truy cập từ xa ta sẽ thêm định nghĩa WebMethod vào trước mỗi hàm.2 Khai báo lớp và hàm Trong ví dụ trên chúng ta đã xây dựng lớp Service1 và trong lớp này hàm HelloWorld() được khai báo là hàm được phép gọi từ xa qua cụm từ “[Web Method]”. Với những đồ án cần export nhiều hàm vào service.vn .daihoc. khi khai báo EnableSession=true.Java Mobile Hình B. trong hàm sẽ cho phép ta sử dụng đối tượng Session để lưu và truy vấn các biến session.com.NET còn cho phép ta định nghĩa nhiều thuộc tính (properties) để tăng thêm tùy biến cho các hàm service.

219 Sưu t m b i: www.Java Mobile Hình B. File WSDL này sẽ được dùng để xây dựng các lớp giúp truy xuất Web Service vừa xây dựng (sẽ được trình bày ở phần truy xuất web service bằng J2ME).daihoc. Hình B. trang này sẽ gồm các hàm được export trong service của chúng ta và mục Service Description sẽ cung cấp file WSDL cho Web service tương ứng.4 Màn hình thực thi Web Service của IE Khi chúng ta đưa project này vào IIS và Run ta sẽ nhận được trang tóm tắt các thông tin về web service. Khi ta click vào phần Service Description.3 Export nhiều hàm cùng lúc Thực thi Web Service. IIS sẽ cung cấp nội dung file WSDL.vn .com.

vn . Nội dung file này rất quan trọng và sẽ được dùng ở phần sau để truy xuất web service.daihoc.3 220 Sưu t m b i: www.5 File WSDL Ta sẽ dùng chức năng Save As… của Web Browser để lưu nội dung file này lại với phần mở rộng là . chúng ta phải dùng chức năng stub generator của bộ công cụ wireless toolkit 2. Dùng J2ME truy xuất Web Service: Để truy xuất được web service.Java Mobile Hình B.com.wsdl.

màn hình chức năng sẽ xuất hiện Hình B.java).7 Các options của công cụ Stub Generator Ta chọn đường dẫn đến file WSDL có được.com. phần Output Package ta sẽ nhập tên Package cho các lớp được tự động phát sinh. Trong các lớp phát sinh.6 Công cụ Stub Generator Khi chọn chức năng stub generator. để gọi hàm của web service ta chỉ cần tạo một đối tượng của lớp này và dùng hàm do đối tượng đó cung cấp.daihoc.vn . 221 Sưu t m b i: www. ở đây cũng chính là thư mục source của project. lớp quan trọng nhất là lớp <PackageName>Soap_Stub. Lớp này có chứa tất cả các hàm mà web service cung cấp (tương ứng 1-1). Các lớp phát sinh này sẽ được đặt ở thư mục output path.java (trong trường hợp này là lớp DKHPServiceSoap_Stub.Java Mobile Hình B.

177. JSR-177 Technology for the Wireless Industry.Location .J2ME Để tìm hiểu về JSR bạn có thể vào trang web http://www. JSR 120.org/) là một chương trình do hãng Sun đề ra nhằm tập hợp ý kiến của các nhà phát triển khắp nơi để đóng góp cho ngôn ngữ Java.Wireless . Java Partner Site) Web Services APIs. Sự phát triển của ngôn ngữ Java.Security . Trong số các đặc tả cho dòng ngôn ngữ J2ME thì một số đặc tả sau là quan trọng nhất: . JSR 205 API for J2ME.jcp. (SATSA).Mobile . JSR 118 Messaging API (WMA). Các đặc tả này ra đời rất nhanh chóng và dần trở thành yêu cầu bắt buộc đối với những nhà sản xuất nếu muốn cạnh tranh với các đối thủ. đặc biệt là J2ME.Bluetooth . Java Community Process (JCP – http://www. JSR 179 and Trust Services API for J2ME. Motorola.Connected . (WSA).Java Mobile Phụ Lục C: Giới thiệu các thư viện JSR Như đã đề cập.com. JSR 172 Content Handler API.Mobile .daihoc.Mobile . JSR 139 Information Device Profile (MIDP). JSR 185 Media API (MMAPI). JSR-184 API (JSR-82. trong đó có J2ME. JSR 37.J2ME 3D Graphics. JSR 211 . việc ra đời của các đặc tả này đã tăng thêm sức mạnh cho ngôn ngữ Java nói chung và dòng ngôn ngữ J2ME nói riêng vốn ban đầu chỉ nhắm đến các thiết bị nhỏ. ít chức năng.org/en/jsr/detail?id=xxx với xxx là mã hiệu của JSR (172.Java Limited Device Configuration (CLDC).vn . (CHAPI).jcp. JSR 135 . những đặc tả mới cho ngôn ngữ Java.…) 222 Sưu t m b i: www. dưới dạng các Java Specification Requests (JSR – xxx với xxx là ký số của đặc tả). Java là ngôn ngữ phát triển rất nhanh chóng. Tổ chức này liên tục đề ra những yêu cầu. (JTWI). là nhờ công sức đóng góp của cộng đồng các nhà phát triển phần mềm. JSR 30.