Giáo trình Java và công nghệ J2ME
Java la một 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 và hiện nay đang phát triển vượt bậc với sự đóng góp của hàng vạn lập trình viên
trên thế giới. Ban đầu, Oak được kỹ sư James Gosling và các cộng sự xây dựng với mục
đích lập trình cho các mặt hang điện dân dụng với mục tiêu nhỏ gọn và tương thích được
với nhiều loại thiết bị phần cứng khác nhau. Sau đó Oak được sử dụng trong nhiều dự án
như dự án Xanh (Blue Project), dự án Phim theo yêu cầu (Video on demand Project). Sau
một chuyến du lịch tới đảo Java của Indonesia, nhóm phát triển Oak đã đổi tên Oak thành
Java.
Java mà tiền thân là Oak được xây dựng chủ yếu dựa trên bộ công cụ phát triển
(Java Development Kit - JDK) như là bộ thư viện chuẩn trong đó chứa trình biên dịch,
trình thông dịch, trình đóng gói, và tài liệu.Đây chính là nền tảng cho việc phát triển các
ứng dụng Java. Hiện nay, cộng đồng Java trên thế giới mà đi đầu là hang Sun
Microsystem đã xây dựng nhiều nhánh mới cho Java như: Javamail (thư diện tử), Java
TAPI (viễn thông), Java3D (đồ họa 3 chiều_, J2ME (ứng dụng cho thiết bị di động). Hiện
nay Java có các phiên bản sau:
J2SE
rM
(Java 2 Platform, Standart Edition): Phiên bản chuẩn gồm bộ công cụ thông dụng
dùng để chạy trên các máy PC hoặc các mạng máy tính nhỏ.
J2EE™ (Java 2 Platform, Enterprise Edition): Phiên bản dành cho các máy chủ với bộ
nhớ lớn. Bao gồm các kiến trúc nâng cao như Web, EJB, Transaction dùng để xây dựng
các ứng dụng có quy mô lớn.
Duoi day la doan code md ket noi thong qua stream // Create a ContentConnection String url = ""; 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 ra chúng ta có thể tọa một kết nối InputStream mà không cần sự có mặt của ContentConnection. Tuy nhiên, phương pháp này có hạn chế là không cung cấp phương thức để xác định chiều dài dữ liệu. Dưới đây là cách mở một kết nối dạng HttpConnection: String url = ""; HttpConnection http = (HttpConnection) Connector.open(url); Sau khi được mở, kết nối này cung cấp truy xuất đến rất nhiều loại luồng mà InputStream và DataInputStream là hai trong số đó. Tuy nhiên thế mạnh thực sự của kết nối HttpConnection lại nằm ở chỗ nó có khả năng giúp cho lập trình viên loại bỏ các gánh nặng của các câu lệnh HTTP. Dưới đây là ví dụ đơn giản, đầu tiên MIDlet sẽ download và hiển thị hình ảnh đã tải về. MIDlet sẽ dử dụng ByteArrayOutputStream để chứa dữ liệu tải về bởi vì ta không dùng ContentConnection nên không thể biết kích cỡ dữ liệu tải vê 89 /* --------------------------------------------------------------------- * 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", "", 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) { // 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 sẽ cho phép nhập địa chỉ URL Sau khi tải về, hình ảnh sẽđược hiển thị 92 3. Client Request va Server Response Cả HTTP và HTTPS đều gửi request và response. Máy client gửi request, còn server sẽ trả về response. Client request bao gồm 3 phần sau: - Request method - Header - Body Request method định nghĩa cách mà dữ liệu sẽ được gửi đến server. Có 3 phương thức được cung cấp sẵn là GET, POST, HEADER. Khi sử dụng Get, dữ liệu cần request sẽ nằm trong URL. Với Post dữ liệu gửi từ client sẽđược phân thành các stream riêng biệt. Trong khi đó, Header sẽ không gửi dữ liệu yêu cầu lên server, thay vào đó header chỉ request những meta information về server. GET và POST là hai phương thức request khá giống nhau, tuy nhiên do GET gửi dữ liệu thông qua URL nên sẽ bị giới hạn, còn POST sử dụng những stream riêng biệt nên sẽ khắc phục được hạn chế này. Ví dụ về việc mở HTTP Connection thông qua GET String url = ""; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); Những Header field sẽ cho phép ta truyền các tham số từ client đến server. Các header field thường dùng là If-Modified-Since, Accept, and User Agent. Bạn có thểđặt các field này thông qua phương thức setRequestProperty(). Dưới đây là ví dụ dùng setRequestProperty(), chỉ có những dữ liệu thay đổi sau ngày 1 tháng 1 năm 2005 mới được gửi về từ server: String url = ""; HttpConnection http = null; http = (HttpConnection) Connector.open(url); http.setRequestMethod(HttpConnection.GET); // Set header field as key-value pair 93 http.setRequestProperty("If-Modified-Since", "Sat, 1 Jan 2005 12:00:00 GMT");Body chứa nội dung mà bạn muốn gửi lên server. Ví dụ về sử dụng POST và gửi dữ liệu từclient thông qua stream: String url = ""; 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 khi nhận được và sử lý yêu cầu từ phía client, server sẽ đóng gói và gửi về phía client. Cũng như client request, server cũng gồm 3 phần sau: Status line Header Body Status line sẽ thông báo cho client kết quả của request mà client gửi cho server. HTTP phân loại status line thành các 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 của HTTP trên server, status code, và đ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 như header của client, server có thể gửi data thông qua header. 94 Sau đây là những phương thức dùng để lấy thông tin Header mà server gửi vê: String getHeaderField(int n) Get header field value looking up by index String getHeaderField(String name) Get header field value looking up by name String getHeaderFieldKey(int n) Get header field key using index Server có thể trả về nhiều Header field. Trong trường hợp này, phương thức đầu tiên sẽ cho lấy header field thông qua index của nó. Còn phương thức thứ hai lấy nội dung header field dựa vào tên của header field. Còn nếu muốn biết tên (key) của header field, có thể dùng phương thức thứ 3 ở trên. Sau đây là ví dụ về 3 phương thức trên, trong trường hợp server gửi về chuỗi "content- type=text/plain". Body: Cũng giống như client, server gửi hầu hết những thông tin trong phần body cho client. Client dùng input stream đểđọc kết quả trả về từ server. The HttpConnection API Như đã đề cập ở trên, ta sẽ sử dụng HttpConnection API để thiết lập kết nối trong MIDP. Dưới đây là những API trong HttpConnection: Method Description long getDate() Get header field date long getExpiration() Gets header field expiration 95 String getFile() Gets filename from the URL int getHeaderField(int n) Gets header field value looking up by index String getHeaderField(String name) Gets header field value looking up by name long getHeaderFieldDate(String name, long def) Gets named field as a long (representing the date) int getHeaderFieldInt(String name, int def) Gets named field as an integer String getHeaderFieldKey(int n) Gets header field key using index String getHost() Gets host from the URL long getLastModified() Gets last-modified field value String getPort() Gets port from the URL String getProtocol() Gets protocol from the URL String getQuery() Gets the query string (only valid with GET request) String getRef() Gets the reference portion of URL String getRequestMethod() Gets the current setting of the request method (GET, POST or HEAD) String getRequestProperty(String key) Gets the current setting of a request property int getResponseCode() Gets the response code (numeric value) String getResponseMessage() Gets the response message (text value) String getURL() Gets the entire URL void setRequestMethod(String method) Sets the request method (GET, POST or HEAD) void setRequestProperty(String key, String value) Sets a request property (header information) 96 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.
File đính kèm:
- Giáo trình Java và công nghệ J2ME.pdf