Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 96 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
96
Dung lượng
1,96 MB
Nội dung
CHƯƠNG I: GIỚI THIỆU TỔNG QUAN Giới thiệu Java công nghệ J2ME Giới thiệu Java Java la công nghệđược hãng Sun Microsystems xây dựng từ cuối năm 1990 với tên gọi Oak phát triển vượt bậc với đóng góp hàng vạn lập trình viên giới Ban đầu, Oak kỹ sư James Gosling cộng xây dựng với mục đích lập trình cho mặt hang điện dân dụng với mục tiêu nhỏ gọn tương thích với nhiều loại thiết bị phần cứng khác Sau Oak sử dụng nhiều dự án dự án Xanh (Blue Project), dự án Phim theo yêu cầu (Video on demand Project) Sau chuyến du lịch tới đảo Java Indonesia, nhóm phát triển Oak đổi tên Oak thành Java Java mà tiền thân Oak xây dựng chủ yếu dựa công cụ phát triển (Java Development Kit - JDK) thư viện chuẩn chứa trình biên dịch, trình thông dịch, trình đóng gói, tài liệu.Đây tảng cho việc phát triển ứng dụng Java Hiện nay, cộng đồng Java giới mà đầu hang Sun Microsystem xây dựng nhiều nhánh cho Java như: Javamail (thư diện tử), Java TAPI (viễn thông), Java3D (đồ họa chiều_, J2ME (ứng dụng cho thiết bị di động) Hiện Java có phiên sau: J2SErM(Java Platform, Standart Edition): Phiên chuẩn gồm công cụ thông dụng dùng để chạy máy PC mạng máy tính nhỏ J2EE™ (Java Platform, Enterprise Edition): Phiên dành cho máy chủ với nhớ lớn Bao gồm kiến trúc nâng cao Web, EJB, Transaction…dùng để xây dựng ứng dụng có quy mô lớn J2ME™ (Java Platform, Micro Edition): Bao gồm môi trường thư viện Java dùng để phát triển ứng dụng thiết bị có nhớ nhỏ điện thoại di động, PDA, đồ gia dụng Giới thiệu J2ME lập trình cho thiết bị di động J2ME phát triển từ kiến trúc JavaCard, EmbededJava PersonalJava phiên Java 1.1 Sau phiên Java Sun định thay PersonalJava phiên có tên Java Micro Edition, viết tắt J2ME J2ME sử dụng cho thiết bị nhỏ gọn với dung lượng nhớ nhỏ bé khả xử lý thấp Mục tiêu Java cho phép người lập trình viết ứng dụng độc lập với thiết bị di động., không cần quan tâm đến phần cứng thực Để làm vậy, J2ME xây dựng tầng khác để che giấu việc tương tác trực tiếp với phần cứng thiết bị Các tầng J2ME xây dựng CLDC (Connected Limited Device Configuration): Tầng tầng Phần cứng thiết bị - tầng vật lý bao gồm phần cứng thiết bị di động Các tầng bên tầng Phần cứng thiết bị tầng trừu tượng, chúng cung cấp cho lập trình viên nhiều giao diện lập trình thân thiện dễ dàng mà không cần quan tâm đến phần cứng Nói khác chúng đóng vai trò trung gian giúp cho lập trình viên tương tác với phầncứng mà không cần quan tâm đến chi tiết thực phần cứng thiết bị Tầng Phần cứng thiết bị (Device Hardware Layer): thiết bị di động thật với nhớ tốc độ xử lý cụ thể Các thiết bị di động khác có vi xử lý tập lệnh khác Mục tiêu J2ME cung cấp cho lập trình viên khả giao tiếp giống với tất loại thiết bị di động khác Tầng máy ảo Java (Java Virtual Machine Layer): tầng đóng vai trò thông ngôn chương trình thiết bị Nó thông dịch mã bytecode (mã có sau biên dịch mã nguồn chương trình) thành mã máy thiết bị di động Tầng bao gồm KVM (K Virtual Machine) biên dịch mã bytecode thành mã máy Nó cung cấp chuẩn hóa cho thiết bị di động để ứng dụng J2ME sau biên dịch chạy thiết bị di động hỗ trợ KVM Tầng cấu hình (Configuration Layer): Tầng cung cấp hàm API nhân J2ME Lập trình viên sử dụng lớp phương thức API nhiên không thực phong phú tập API tầng trạng Tầng trạng (Profile Layer): Tầng cung cấp hàm API hữu dụng cho việc lập trình Mục đích tầng xây dựng nên lớp cấu hình cung cấp nhiều thư viện ứng dụng 6.1 Lý chon J2ME: Java ban đầu thiết kế dành cho máy với tài nguyên nhớ hạn chế Thị trường J2ME mở rộng cho nhiều chủng loại thiết bị như: Các lọai thẻ cá nhân Java Card Máy điện thoại di động Máy PDA (Personal Digital Assistant - thiết bị trợ giúp cá nhân) Các hộp điều khiển dành cho tivi, thiết bị giải trí gia dụng 6.2 Kiến trúc J2ME Phần trình bày kiến trúc tổng quát tảng Java a) Giới thiệu thành phần tảng J2ME: Định nghĩa Configuration (Cấu hình): đặc tả định nghĩa môi trường phần mềm cho dòng thiết bị phân loại tập hợp đặc tính, ví dụ như: Kiểu số lượng nhớ Kiểu tốc độ vi xử lý Kiểu mạng kết nối Do đặc tả nên nhà sản xuất thiết bị Samsung, Nokia bắt buộc phải thực thi đầy đủ đặc tả Sun qui định để lập trình viên dựa vào môi trường lập trình quán thông qua quán này, ứng dụng tạo mang tính độc lập thiết bị cao Ví dụ lập trình viên viết chương trình game cho điện thoại Samsung sửa đổi chương trình cách tối thiểu để chạy điện thọai Nokia Hiện Sun đưa dạng Configuration: CLDC (Connected Limited Device Configuration-Cấu hình thiết bị kết nối giới hạn): thiết kế để nhắm vào thị trường thiết bị cấp thấp (low-end), thiết bị thông thường máy điện thọai di động PDA với khoảng 512 KB nhớ Vì tài nguyên nhớ hạn chế nên CLDC gắn với Java không dây (JavaWireless ), dạng cho phép người sử dụng mua tải ứng dụng Java, ví dụ Midlet CDC- Connected Device Configuration (Cấu hình thiết bị kết nối): CDC đưa nhắm đến thiết bị có tính mạnh dòng thiết bị thuộc CLDC yếu hệ thống máy để bàn sử dụng J2SE Những thiết bị có nhiều nhớ (thông thường 2Mb) có xử lý mạnh Các sản phẩm kể đến máy PDA cấp cao, điện thoại web, thiết bị gia dụng gia đình Cả dạng Cấu hình kể chứa máy ảo Java (Java Virtual Machine) tập hợp lớp (class) Java để cung cấp môi trường cho ứng dụng J2ME Tuy nhiên, bạn ý thiết bị cấp thấp, hạn chế tài nguyên nhớ xử lý nên yêu cầu máy ảo hổ trợ tất tính với máy ảo J2SE, ví dụ, thiết bị thuộc CLDC phần cứng yêu cầu phép tính toán dấu phẩy động, nên máy ảo thuộc CLDC không yêu cầu hỗ trợ kiểu float double Ram Rom CLDC >=32K, =128k, =256K >=512k Nguon Nang Luong Co GioI Han (nguon pin) Khong gioi han Network Cham Nhanh b) Định nghĩa Profile: Profile mở rộng Configuration cách thêm vào class để bổ trợ tính cho thiết bị chuyên biệt Cả Configuration có profile liên quan từ profile dùng class lẫn Đến ta nhận thấy profile định nghĩa tập hợp class khác nhau, nên thường ta chuyển ứng dụng Java viết cho profile chạy máy hỗ trợ profile khác Cũng với lý đó, bạn lấy ứng dụng viết J2SE hay J2EE chạy máy hỗtrợ J2ME Sau profile tiêu biểu: Mobile Information Device Profile (MIDP): profile bổ sung tính hỗtrợ kết nối, thành phần hỗ trợ giao diện người dùng vào CLDC Profile thiết kế chủ yếu để nhắm vào điện thọai di động với đặc tính hình hiển thị hạn chế, dung lượng chứa có hạn Do MIDP cung cấp giao diện người dùng đơn giản tính mạng đơn giản dựa HTTP Có thể nói MIDP profile tiếng kiến thức cho lập trình Java máy di động (Wireless Java) PDA Profile: tương tự MIDP, với thị trường máy PDA với hình nhớ lớn Foundation Profile: cho phép mở rộng tính CDC với phần lớn thư viện Core Java2 1.3 Ngoài có Personal Basis Profile, Personal Profile, RMI Profile, Game Profile 6.3 Phát triển ứng dụng Biên dịch Mã nguồn chương trình biên dịch trình biên dịch chuẩn Java, chúng tạo file class Ta biên dịch từ trình soạn thảo biên dịch trực tiếp từ dòng lệnh 6.4 Kiểm tra lỗi chạy thử Chúng ta sử dụng công cụ WTK để kiểm tra lỗi chạy thử chương trình việc tiến hành thiết bị thật thời gian Việc sử dụng giả lập giúp nhanh chóng phát lỗi Ngoài giúp lập trình viên có nhìn cảm quan chương trình 6.5 Đóng gói Sau kiểm lỗi chạy thử chương trình, tiến hành đóng gói ứng dụng để cài đặt thiết bị thật Việc đóng gói ứng dụng thực chất nén file class vào file jar, điều giúp giảm kích thước ứng dụng đơn giản hóa cài đặt thiết bị thật Chúng ta đóng gói ứng dụng trình đóng gói JDK trình đóng gói nằm IDE Hoặc cách thủ công, đóng gói ứng dụng cách trực tiếp Việc đóng gói trực tiếp thực chất tiến hành lại công việc trình đóng gói kiểm soát lỗi tốt Tuy việc phức tạp dễ gây lỗi lập trình viên chưa thục 6.6 Đóng gói triển khai ứng dụng thành tập tin JAR Các lớp biên dịch ứng dụng J2ME đóng gói tập tin JAR với tài nguyên khác như: hình ảnh, âm thanh, Tập tin JAR tập tin cài vào thiết bị di động Người sử dụng tải tập tin JAR vào máy di động cách sau: Kết nối điện thoại di động với máy tính cáp truyền liệu: Việc yêu cầu người dùng phải có tập tin JAR thật phần mềm truyền thông để tải ứng dụng vào điện thoại thông qua cáp liệu Cổng hồng ngoại: Yêu cầu thiết bị di động nguồn chứa file JAR phải hỗ trợ hồng ngoại người dùng có file JAR thật Sử dụng mạng không dây: tải ứng dụng thông qua mạng GPRS, người dùng cần biết địa URL tập tin JAR 6.7 Tập tin manifest.mf tập tin JAD Tập tin manifest.mf tập tin JAD mô tả đặc điểm ứng dụng Tập tin manifest.mf nằm bên tập tin JAR tập tin JAD nằm tập tin JAR Tập tin JAD giúp cho người dùng biết đặc điểm ứng dụng trước tải Việc giúp làm giảm lãng phí tài nguyên tiền bạc thực tế, ứng dụng J2ME chạy số máy định Tập tin manifest.mf có nội dung sau: Manifest-Version: //Phiên tập tin manifest.mf MIDlet-Name://Tên MIDlet MIDlet-Version: //Phiên MIDlet MIDlet-Vendor: //Nhà sản xuất MIDlet-://Tên MIDlet MicroEdition-Profile: //Phiên trạng MicroEdition-Configuration: //Phiên cấu hình 6.8 Tối ưu mã chương trình giảm kích thước ứng dụng Sau đóng gói chương trình thành tập tin JAR thấy file liệu nén lại cách đáng kể Tuy nhiên ta giảm kích thước file JAR thêm lần cách dùng công cụ Công cụ thường bao gồm đặc tính sau: - Loại bỏ class không dùng đến - Loại bỏ hàm biến không dùng đến - Đổi tên class, package, hàm biến thành tên đơn giản ngắn gọn - Thêm vào file class số mã để chương trình khó bị dịch ngược Ba đặc tính đầu dùng để giảm kích thước file class đặc tính thứ thứ dùng để bảo vệ chương trình khó bị dịch ngược lại thành mã nguồn Ngay bị dịch ngược lại thành mã nguồn chương trình khó bị đọc tên lớp, biến, hàm, package bị thay đổi Các công cụ thường dùng để tối ưu mã chương trình Jbuilder 9X, Retroguard, Jshrink 6.9 Những khó khăn lập trình thiết bị di động Sử dụng công nghệ J2ME cho việc lập trình thiết bị di động việc không khó lập trình viên Tuy lập trình J2ME, lập trình viên gặp phải số khó khăn đạc trưng tránh khỏi: - Không hỗ trợ phép tính dấu phẩy động (floating point): - Không hỗ trợ nạp class (Class loader) - Không hỗ trợ từ khóa finalize() - Phần lớn thư viện API cho Swing AWT sử dụng MIDP - Không hỗ trợ tính quản lý file thư mục: Đây làm bạn ngạc nhiên thực tế thiết bị J2ME hỗ trợ thiết bị lưu trữ thông thường ổ cứng v.v Tuy nhiên, điều nghĩa bạn phải liệu quan trọng tắt máy, Sun cung cấp chức khác tương đương gọi Record Management system (RMS) để cung cấp khả lưu trữ cho thiết bị - Các thiết bị di động bị giới hạn kích thước ứng dụng Ví dụ như: với Series 40 Nokia, Samsung X100, V200, có dung lượng lưu trữ hạn chế Sau kích thước tối đa file JAR cài đặt số dòng điện thoại: Loại điện thoại Kích thước tối đa file JAR Nokia series 40 Motorola T720 Panasonic X60 64 KB 64KB 80KB 128KB Sony Ericssion T610, T630 Samsung X600 100KB Đó số khó khăn mà lập trình viên thường gặp phải lập trình cho điện thoại di động 10 try { rs.closeRecordStoreQ; } catch (Exception e) { db(e.toString()); } } public void deleteRecStore() { if (RecordStore.listRecordStores() != null) { try { RecordStore.deleteRecordStore(RECSTORE); } catch (Exception e) { db(e.toString()); } } } public void writeRecord(String str) { byte[] rec = str.getBytes(); try { rs.addRecord(rec, 0, rec.length); } catch (Exception e) { db(e.toString()); } } public void updateRecord(String str) { try { rs.setRecord(1, str.getBytes(), 0, str.length()); } catch (Exception e) { db(e.toString()); } } public void deleteRecord() { try { rs.deleteRecord(1); } catch (Exception e) { db(e.toString()); 82 } public void dbfString str) { System.err.println("Msg: " + str); } } class TestRecordListener implements RecordListener { public void recordAdded(RecordStore recordStore, int recordId) { try { System.out.println("Record with ID#: " + recordId + "added to RecordStore: " + recordStore.getName()); } catch (Exception e) { System.err.println(e); } } public void recordDeleted(RecordStore recordStore, int recordId) { try { System.out.println("Record with ID#: " + recordId + "deleted from RecordStore: " + recordStore.getName()); } catch (Exception e) { System.err.println(e); } } public void recordChanged(RecordStore recordStore, int recordId) { try{ System.out.println("Record with ID#: " + recordId + "changed in RecordStore: " recordStore.getName()); } catch (Exception e) { System.err.println(e); } } } 83 Các Ngoại Lệ Phát Sinh Trong RMS Các phương thức API RMS việc phát sinh ngoại lệ thông thường đến môi trường chạy (runtime enviroment) RMS định nghĩa thêm ngoại lệ gói javax.microedition.rms sau: 84 ChươngIV: KHUNG KẾT NỐI CHUNG (Generic Connection Framework - GCF) Trong phiên J2SE, hỗ trợ giao thức kết nối mạng có gói java.io java.net với tổng dung lượng 200KB bao gồm 100 lớp giao diện Qaủ thật với nhớ nhỏ bé hạn chế xử lý, việc đưa gói vào ứng dụng viết J2ME điều hoàn toàn không khả thi Chính vậy, mở rộng phạm vi hỗ trợ giao thức mạng hệ thống tập tin, ngưoiừ ta không dùng lại lớp J2SE mà xây dựng khái niệm gọi Khung kết nối chung (Generic Connection Framework - GCF) GCF tập hợp lớp giao diện thiết kế nhằm tọa thuận tiện cho việc truy xuất đến hệ thống lưu trữ kết nối mạng Mục tiêu GCF tạo tập lớp hoàn toàn mà cung cấp tập J2SE cách có chọn lọc Tập giới hạn tối ưu để phù hợp với ràng buộc khác biệt thiết bị di động Cây phân cấpConnection Khi đưa khái niệm phân cấp, người ta chủ ý tạo lớp có khả mở loại kết nối bao gồm: file, http, datagram, Tên lớp Connector Như sử dụng Connector để mở kết nối, cần gọi phương thức open có định dạng sau: Connector.Open("protocol:address; parameter") Cơ chế mà GCF dùng để mở nhiều loại giao tiếp phương thức chung chứng minh tính uyển chuyển GCF Cơ chế hoạt động sau: Trong thời gian thực thi, có yêu cầu mở giao thức, Connector tìm đến lớp tương ứng cài đặt giao thức Quá trình tìm kiếm thực thông qua phương thức Class.forName() Ví dụ để yêu cầu mở kết nối HTTP J2ME, yêu cầu viết sau: 85 Class.forName("com.sun.midp.io.j2me.http.Protocol"); Khi tìm thấy lớp tương ứng, Class.forName() trả đối tượng có cài đặt giao diện Connection (trong lớp Connector giao diện Connection định nghĩa sẵn CLDC) Sau phân cấp Connection, bao gồm lớp mà lớp định nghĩa giao diện: Trong kiến trúc phân cấp, cài đặt thật ác giao thức nằm mức trạng Trong MIDP 1.0, HttpConnection hỗ trựo tâpj HTTP phiên 1.0 Do lớp mở rộng ContentConnection, cung cấp sẵn 20 phương thức chuyên biệt để giao tiếp thông qua giao thức HTTP Mặc dù DatagramConnection xuất phân cấp người ta không bắt buộc cài đặt MIDP để hỗ trợ giao thức 86 Kết nối HTTP HTTP giao thức chắn hỗ trợ MIDP 1.0 Chúng ta giao tiếp với máy chủ hay thiết bị từ xa có hỗ trợ giao thức nhờ vào lớp HttpConnection Lớp Connector cung cấp cho người dùng bảy phương thức để tạo kết nối tới máy chủ Ba phương thức số biến thể phương thức open() Các phương thức mô tả bảng sau: Cac phuong thuc cua lop javax.microedition.io.Connector Phuong thuc Mo ta static Connection open(String Tao mot ket noi co che name) READWRITE static Connection open(String name, int Tao mot ket noi voi che duoc mode) chi dinh Tao mot ket noi voi che static Connection open(String name, int duoc chi dinh, them ngoai le mode, boolean timeouts) time out static InputStream Tao ket noi luong nhap openInputStream(String name) static OutputStream Tao ket noi luong xuat openOutputStream(String name) static DataInputStream Tao ket noi luong nhap kieu openDataInputStream(String name) DataInputStream static DataOutputStream Tao ket noi luong xuat kieu openDataOutputStream(String DataOutputStream name) 87 Duoi day la doan code md ket noi thong qua stream // Create a ContentConnection String url = "http://www.corej2me.com"; ContentConnection connection = (ContentConnection) Connector.open(url); // With the connection, open a stream InputStream iStrm = connection.openInputStream(); // ContentConnection includes a length method int length = (int) connection.getLength(); if (length != -1) { byte imageData[] = new byte[length]; // Read the data into an array iStrm.read(imageData); } Thật tọa kết nối InputStream mà không cần có mặt ContentConnection Tuy nhiên, phương pháp có hạn chế không cung cấp phương thức để xác định chiều dài liệu Dưới cách mở kết nối dạng HttpConnection: String url = "http://www.corej2me.com/midbook_v1e1/ch14/duke.png"; HttpConnection http = (HttpConnection) Connector.open(url); Sau mở, kết nối cung cấp truy xuất đến nhiều loại luồng mà InputStream DataInputStream hai số Tuy nhiên mạnh thực kết nối HttpConnection lại nằm chỗ có khả giúp cho lập trình viên loại bỏ gánh nặng câu lệnh HTTP Dưới ví dụ đơn giản, MIDlet download hiển thị hình ảnh tải MIDlet dử dụng ByteArrayOutputStream để chứa liệu tải ta không dùng ContentConnection nên biết kích cỡ liệu tải vê 88 /* * DownloadImage.java * */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import java.io.*; public class DownloadImage extends MIDlet implements CommandListener { private Display display; private TextBox tbMain; private Form fmViewPng; private Command cmExit; private Command cmView; private Command cmBack; public DownloadImage() { display = Display.getDisplay(this); // Create the textbox, allow maximum of 50 characters tbMain = new TextBox("Enter url", "http://localhost/intel.png", 55, 0); // Create commands and add to textbox cmExit = new Command("Exit", Command.EXIT, 1); cmView = new Command("View", Command.SCREEN, 2); tbMain.addCommand(cmExit); tbMain.addCommand(cmView ); // Set up a listener for textbox tbMain.setCommandListener(this); // Create the form that will hold the image fmViewPng = new Form(""); // Create commands and add to form cmBack = new Command("Back", Command.BACK, 1); fmViewPng.addCommand(cmBack); // Set up a listener for form fmViewPng.setCommandListener(this); } public void startApp() { display.setCurrent(tbMain); } public voidpauseApp() {} public void destroyApp(boolean unconditional) {} public void commandAction(Command c, Displayable s) { 89 // If the Command button pressed was "Exit" if (c == cmExit) { dstroyAppfalse); notifyDestroyed(); } else if (c == cmView) { // Download image and place on the form try { Image im; if ((im = getImage(tbMain.getString())) != null) { ImageItem ii = new ImageItem(null, im,ImageItem.LAYOUTDEFAULT, null); // If there is already an image, set (replace) it if fmViewPng.size() != 0) fmViewPng.set(0, ii); else // Append the image to the empty form fmViewPng.append(ii); } else fmViewPng.append("Unsuccessful download."); // Display the form with image display.setCurrentfmViewPng); } catch (Exception e) { System.err.println("Msg: " + e.toString()); } } else if (c == cmBack) { display.setCurrent(tbMain); } } private Image getImage(String url) throws IOException { InputStream iStrm = (InputStream) Connector.openInputStream(url); Image im = null; try { ByteArrayOutputStream bStrm = new ByteArrayOutputStream(); int ch; while ((ch = iStrm.read()) != -1) bStrm.write(ch); // Place into image array byte imageData[] = bStrm.toByteArray(); // Create the image from the byte array im = Image.createImage(imageData, 0, imageData.length); finally { // Clean up if (iStrm != null) iStrm.close(); } return (im == null ? null: im); } } Một textbox cho phép nhập địa URL Sau tải về, hình ảnh sẽđược hiển thị Client Request va Server Response Cả HTTP HTTPS gửi request response Máy client gửi request, server trả response Client request bao gồm phần sau: - Request method - Header - Body Request method định nghĩa cách mà liệu gửi đến server Có phương thức cung cấp sẵn GET, POST, HEADER Khi sử dụng Get, liệu cần request nằm URL Với Post liệu gửi từ client sẽđược phân thành stream riêng biệt Trong đó, Header không gửi liệu yêu cầu lên server, thay vào header request meta information server GET POST hai phương thức request giống nhau, nhiên GET gửi liệu thông qua URL nên bị giới hạn, POST sử dụng stream riêng biệt nên khắc phục hạn chế Ví dụ việc mở HTTP Connection thông qua GET String url = "http://www.corej2me.com?size=large"; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); Những Header field cho phép ta truyền tham số từ client đến server Các header field thường dùng If-Modified-Since, Accept, and User Agent Bạn có thểđặt field thông qua phương thức setRequestProperty() Dưới ví dụ dùng setRequestProperty(), có liệu thay đổi sau ngày tháng năm 2005 gửi từ server: String url = "http://www.corej2me.comXsomefile.txt"; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); // Set header field as key-value pair 92 http.setRequestProperty("If-Modified-Since", "Sat, Jan 2005 12:00:00 GMT");Body chứa nội dung mà bạn muốn gửi lên server Ví dụ sử dụng POST gửi liệu từclient thông qua stream: String url = "http://www.corej2me.com"; tmp = "test data here"; OutputStream ostrm = null; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.POST); // Send client body ostrm = http.openOutputStream(); byte bytes[] = tmp.getBytes(); for(int i = 0; i < bytes.length; { os.write(bytes[i]); } os.flush(); Sau nhận sử lý yêu cầu từ phía client, server đóng gói gửi phía client Cũng client request, server gồm phần sau: Status line Header Body Status line thông báo cho client kết request mà client gửi cho server HTTP phân loại status line thành nhóm sau đây: 1xx is informational 2xx is success 3xx is redirection 4xx is client error 5xx is server error Status line bao gồm version HTTP server, status code, đoạn text đại diện cho status code Vi du: "HTTP/1.1 200 OK" "HTTP/1.1 400 Bad Request" "HTTP/1.1 500 Internal Server Error" Header Không giống header client, server gửi data thông qua header 93 Sau phương thức dùng để lấy thông tin Header mà server gửi vê: String getHeaderField(int n) index String getHeaderField(String name) name String getHeaderFieldKey(int n) Get header field value looking up by Get header field value looking up by Get header field key using index Server trả nhiều Header field Trong trường hợp này, phương thức cho lấy header field thông qua index Còn phương thức thứ hai lấy nội dung header field dựa vào tên header field Còn muốn biết tên (key) header field, dùng phương thức thứ Sau ví dụ phương thức trên, trường hợp server gửi chuỗi "contenttype=text/plain" Body: Cũng giống client, server gửi hầu hết thông tin phần body cho client Client dùng input stream đểđọc kết trả từ server The HttpConnection API Như đề cập trên, ta sử dụng HttpConnection API để thiết lập kết nối MIDP Dưới API HttpConnection: Method long getDate() long getExpiration() Description Get header field date Gets header field expiration 94 String getFile() int getHeaderField(int n) String getHeaderField(String name) Gets filename from the URL Gets header field value looking up by index Gets header field value looking up by name long getHeaderFieldDate(String Gets named field as a long (representing the name, long def) date) int getHeaderFieldInt(String name, int def) String getHeaderFieldKey(int n) String getHost() long getLastModified() String getPort() String getProtocol() String getQuery() String getRef() String getRequestMethod() Gets named field as an integer Gets header field key using index Gets host from the URL Gets last-modified field value Gets port from the URL Gets protocol from the URL Gets the query string (only valid with GET request) Gets the reference portion of URL Gets the current setting of the request method (GET, POST or HEAD) String getRequestProperty(String key) Gets the current setting of a request int getResponseCode() String getResponseMessage() String getURL() property Gets the response code (numeric value) Gets the response message (text value) Gets the entire URL void setRequestMethod(String Sets the request method (GET, POST or method) HEAD) Sets a request property (header information) void setRequestProperty(String key, String value) 95 Tài liệu tham khảo them [1] Phuong Lan, Java tap 3, NXB Lao dong Xa hoi, 2006 [2] Nguyen Thi Bich Nga, Nen tang cong nghe J2Me & MIDP, NXB Giao thong Van tai, 2006 [3] Nguyen Huu Mai, Tổng quan ve J2ME, javavietnam.org, 2004 [4] Le Ngoc Quoc Khanh, Phat trien ung dung J2ME va J2ME Wireless Toolkit, 2004 [5] John W Muchow, Core J2METM Technology & MIDP, Prentice Hall PTR publisher, 2001 [6] Kim Topley, J2Me in a Nutshell, O'Reilly publisher, 2002 [7] Gwenael Le Bodic, Mobile Messaging Technologies and Service, John Wiley & Sons publisher, 2003 96 [...]... Displayable va Screens Một ứng dụng MIDlet chỉ có 1 đối tượng thể hiện Display Đối tượng này dùng để lấy thông tin vềđối tượng trình bày, ví dụ màu được hỗ trợ, và bao gồm các phương thức đểyêu cầu các đối tượng được trình bày Đối tượng Display cần thiết cho bộ quản lý việc trình bày trên thiết bịđiều khiển thành phần nào sẽđược hiển thị lên trên thiết bịMặc dù chỉ có một đối tượng Display ứng với mỗi...CHƯƠNG II: LẬP TRÌNH VỚI J2ME 1 MIDlet vàđối tượng Display 1.1 MIDlet - Vòng đời của một MIDlet Nếu ai đã viết Applet thì chắc hẳn thấy hai cái tên này na ná nhau MIDlet là viết tắt của “Mobile Information Device applet”.Hầu... int maxSize, int constraints) c) Alert va AlertType Một Alert đơn giản là một hộp thoại rất nhỏ Có 2 loại Alert: Modal: là loại hộp thoại thông báo được trình bày cho đến khi người dùng ấn nút đồng ý Non-modal: là loại hộp thoại thông báo chỉđược trình bày trong một số giây nhất địnhCác phương thức dựng củaAlert: Alert(String title) Alert(String title, String alertText, Image alertImage, AlertType... phần tích hợp quá trình phát triển Nếu các hàm API cấp cao cho phép chúng ta tạo ra giao diện cho các ứng dụng theo chuẩn, thì các hàm API cấp thấp cho phép chúng ta có thể thể hiện các ý tưởng của mình Canvas và Graphics là 2 lớp trái tim của các hàm API cấp thấp Chúng ta sẽ làm tất cả các công việc bằng tay Canvas là một khung vẽ cho phép người phát triển có khả năng vẽ lên thiết bị trình bày cũng như... ScratchPad sẽminh họa làm thế nào để thao tác các sự kiện con trỏ để tạo ra một chương trình vẽ đường thẳng đơn giản a) Hệ thống trục tọa đọ 34 Mục tiêu đầu tiên của chúng ta là làm quen với hệ thống trục tọa độđể làm việc với thiết bị thể hiện Hệ thống tọa độ cho lớp Canvas có tâm tọa độ là điểm trái trên của thiết bị trình bày Giá trị x tăng dần về phía phải, giá trị y tăng dần khi đi xuống phía dưới... trong Form và có thể nhận biết và xử lý sự kiện CustomItem được vẽ lên màn hình hiển thị bằng phương thức paint() Vì thế nó sẽ tùy thuộc vào đoạn mã được bạn hiện thực bên trong phương thức paint() Quá trình tạo ra một đối tượng CustomItem cũng không khác các đối tượng có sẵn trên nền Java Đoạn mã dưới đây minh họa sườn của việc tạo ra một đối tượng CustomItem public class NewItem extends CustomItem... Ticker Trong phần này chúng ta sẽ xem xét các đối tượng ListBox, TextBox, Alert, và Ticker trong các thành phần giao diện cấp cao của ứng dụng MIDP Chúng ta hãy cũng xem lại cây phân cấp các thành phần trình bày trên thiết bị một cách hoàn chỉnh hơn a) List Một List chứa một dãy các lựa chọn được thể hiện một trong ba dạng Chúng tađã thấy loại cho phép nhiều lựa chọn và loại chỉ được phép chọn một khi... du: private DateField dfAlarm; // Tao doi tuong DateField cho thay doi ca ngay va gid dfAlarm = new DateField("Set Alarm Time", DateField.DATE TIME); dfAlarm.setDate(new Date()); Dưới đây là đoạn chương trình mẫu thử nghiệm đổi tượng DateField import java.util.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.Timer; import java.util.TimerTask; public class DateFieldTest... main form when done display.setCurrent(al, fmMain); } } } d) Ticker Thành phần Ticker đuợc dùng để thể hiện một đoạn chuỗi chạy theo chiềungang Tham số duy nhất của thành phần Ticker là đoạn văn bản được trình bày Tốc độ và chiều cuốn được xác định bởi việc cài đặt trên thiết bị nào Phương thức dựng của Ticker: Ticker(String str); Từ cây phân cấp các thành phần thể hiện trên thiết bị, ta thấy là thành... Gauge(String label, boolean interactive, int maxValue, int initialValue) VI du: private Gauge gaVolume; // Điều chỉnh âm lượng gaVolume = new Gauge("Sound Level", true, 100, 4); Dưới đây là đoạn chương trình mẫu minh họa cách sử dụng lớp Gauge import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class InteractiveGauge extends MIDlet implements CommandListener { private Display ... đặc tả Sun qui định để lập trình viên dựa vào môi trường lập trình quán thông qua quán này, ứng dụng tạo mang tính độc lập thiết bị cao Ví dụ lập trình viên viết chương trình game cho điện thoại... trình thiết bị di động Sử dụng công nghệ J2ME cho việc lập trình thiết bị di động việc không khó lập trình viên Tuy lập trình J2ME, lập trình viên gặp phải số khó khăn đạc trưng tránh khỏi: -... trình việc tiến hành thiết bị thật thời gian Việc sử dụng giả lập giúp nhanh chóng phát lỗi Ngoài giúp lập trình viên có nhìn cảm quan chương trình 6.5 Đóng gói Sau kiểm lỗi chạy thử chương trình,