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

