Để giả lập máy chủ web trên PC có rất nhiều phần mềm, tính năng tổng hợp
được chú ý cao nhất cho các phần mềm cài đặt đủ cả 3 bộ tiện ích là php, mySql và
phpmyAdmin. Wamp là một phần mềm với giao diện đơn giản, dễ sử dụng và hội tụ đủ
các điều kiện trên. Tiến hành cài đặt gói Wamp 1.5 đính kèm trong đĩa chương trình, cài
đặt theo thông số mặc định của phần mềm.
83 trang |
Chia sẻ: lylyngoc | Lượt xem: 2958 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu công nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ể mở kết nối. Phương thức open() trả
về một đối tượng Connection sau đĩ cĩ thể đĩng vai trị là một HttpConnection cho phép
dùng tất cả các phương thức của HttpConnection.
Một kết nối HTTP cĩ thể ở một trong ba trạng thái khác nhau: Thiết lập (Setup), Kết
nối (Connectd), hay Đĩng (Close). Trong trạng thái Thiết lập, kết nối chưa được tạo.
Phương thức setRequestMethod() và setRequestProperty() chỉ cĩ thể được dùng trong
trạng thái thiết lập. Chúng được dùng để thiết lập phương thức yêu cầu (GET, POST,
HEAD) và thiết lập thuộc tính HTTP (ví dụ. User-Agent). Khi sử dụng một phương thức
yêu cầu gởi dữ liệu đến hay nhận dữ liệu về từ server sẽ làm cho kết nối chuyển sang
trạng thái Kết nối. Gọi phương thức close() sẽ làm cho kết nối chuyển sang trạng thái
Đĩng.
Thiết
lập
Kết
nối
Đĩng
Kết nối đến server
chưa được tạo
Đĩng, kết nối
khơng cịn dùng
được, các luồng
I/O vẫn cịn
openInputStream()
openOutputStream()
getLength()
getType()
getEncoding()
getHeaderField()
getResponseCode()
getResponseMessage()
getHeaderFieldInt()
getHeaderFieldDate()
Kết nối đã được
tạo, gởi các tham
số yêu cầu, chờ hồi
đáp
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
31
Hình 16. Các trạng thái kết nối HTTP.
Lưu ý rằng gọi bất kì phương thức nào liệt kê ở trên (ví dụ. openInputStream(),
getLenght()) cũng sẽ làm cho kết nối chuyển sang trạng thái Kết nối.
4.2.3.1. Ví dụ kết nối HTTP GET
Phương thức HTTP GET cho phép lấy dữ liệu từ server và là phương thức mặc định
nếu khơng xác định phương thức trong trạng thái Thiết lập.
Ví dụ thực hiện một kết nối HTTP GET cơ bản:
void getViaHttpConnection(String url) throws IOException {
HttpConnection c = null; InputStream is = null;
try {
c = (HttpConnection)Connector.open(url); // Mở kết nối HTTP
is = c.openInputStream(); // Mở Input Stream, mặc định GET
type = c.getType();
int len = (int)c.getLength();
if (len > 0) {
byte[] data = new byte[len];
int numBytes = is.read[data]; // Nếu biết chiều dài
processData(data);
} else {
int ch;
while ((ch = is.read()) != -1) { // đọc đến khi nào gặp -1
stringBuffer.append((char)ch);
}
processBuffer(stringBuffer);
}
} finally {
if (is != null) is.close();
if (c != null) c.close();
}
}
getViaHttpConnection() nhận một chuỗi là tham số đầu vào, đĩ là địa chỉ địa chỉ
URL chuyển cho phương thức open() của lớp Connection. Phương thức open() trả về một
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
32
đối tượng Connection đĩng vai trị là một lớp HttpConnection. Phương thức
openInputStream() sẽ làm cho kết nối chuyển sang trạng thái Kết nối. Vì khơng cĩ yêu
cầu phương thức nào, kết nối sẽ mặc định là một kết nối HTTP GET.
Phương thức getLength() sẽ trả về chiều dài của dữ liệu gởi từ server. Nếu biết được
chiều dài, thì biến len sẽ chứa chiều dài dữ liệu và ta cĩ thể đọc tồn bộ khối dữ liệu. Nếu
khơng thì len sẽ chứa giá trị -1 và dữ liệu phải được đọc từng ký tự một cho đến khi gặp
đánh dấu cuối file (-1). Phương thức processData() và processBuffer() xử lý dữ liệu đến
từ server. Khối lệnh cuối cùng sẽ đĩng tất cả các kết nối khơng quan tâm đến cĩ lỗi từ
khối lệnh try ở trước hay khơng.
4.2.3.2. Ví dụ kết nối HTTP POST
HTTP POST cho phép gởi dữ liệu đến server. Dữ liệu gởi đến server qua phương
thức GET chỉ giới hạn là dữ liệu chứa địa chỉ URL. Phương thức POST cho phép gởi một
luồng byte đến server. Phương thức HTTP POST thực hiện theo cách tương tự với
phương thức HTTP GET.
Ví dụ thực hiện một kết nối HTTP POST:
void postViaHttpConnection(String url) throws IOException {
HttpConnection c = null; InputStream is = null;
OutputStream os;
try {
c = (HttpConnection)Connector.open(url); // Mở kết nối
// Thiết lập phương thức POST
// trong khi vẫn ở trạng thái Thiết lập
c.setRequestMethod(HttpConnection.POST);
// Mở luồng output stream và chuyển sang trạng thái Kết nối
os = c.openOutputStream();
// Chuyển đổi dữ liệu thành luồng byte
// và gởi đến server
os.write(“Data Sent to Server\n”.getBytes());
int status = c.getResponseCode();
// Kiểm tra status
if (status != HttpConnection.HTTP_OK)
throw new IOException(“not OK”);
int len = (int)c.getLength();
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
33
// Giống như ví dụ HTTP GET:
// Kiểm tra length và xử lý tương ứng
} finally {
// Đĩng kết nối giống như ví dụ HTTP GET
}
}
Như ví dụ trước, phương thức postViaHttpConnection() nhận tham số đầu vào là
một chuỗi là địa chỉ URL được chuyển đến phương thức open() của lớp Connection.
Phương thức open() trả về một đối tượng Connection đĩng vai trị là một lớp
HttpConnection.
Kết nối bây giờ ở trong trạng thái thiết lập và phương thức yêu cầu được đặt là
POST bằng phương thức setRequestMethod(). Tất cả các thuộc tính khác phải được thiết
lập trong trạng thái này.
Phương thức openOutputStream() sẽ làm cho kết nối chuyển sang trạng thái Kết nối.
Phương thức write() và flush() sẽ gởi dữ liệu đến server.
Đoạn mã cịn lại giống như phương thức GET. Luồng input được mở, chiều dài của
dữ liệu được kiểm tra, và dữ liệu được đọc tồn bộ khối hay từng ký tự một tùy vào chiều
dài được trả về. Khối lệnh cuối cùng sẽ đĩng kết nối.
4.2.4. Triệu gọi CGI script
Cả hai phương thức GET và POST cĩ thể được dùng để triệu gọi CGI script
(Common Gateway Interface script) và cung cấp dữ liệu nhập. Ví dụ, một MIDlet cĩ một
form cho người dùng điền dữ liệu, sau đĩ cĩ thể gởi dữ liệu kết quả cho server để CGI
script xử lý. CGI script cĩ thể được triệu gọi giống như phương thức GET và POST. Tên
của CGI script và dữ liệu tham số nhập cĩ thể chuyển trong địa chỉ URL. Nếu cần gởi
thêm dữ liệu cho server, thì cĩ thể dùng phương thức POST.
Ví dụ các tham số được gởi là một phần của URL:
url =
Trong ví dụ trên, địa chỉ URL cĩ thể được chuyển như là một tham số giống như
phương thức getViaHttpConnection() ở ví dụ trước.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
34
4.2.5. HTTP Request Header
HTTP request header phải được thiết lập ở trạng thái Thiết lập bằng phương thức
setRequestMethod() và setRequestProperty(). Phương thức setRequestMethod() dùng để
thiết lập các phương thức GET, POST, hoặc HEAD.
Phương thức setRequestProperty() dùng để thiết lập các trường trong request header.
Ví dụ cĩ thể là “Accept-Language”, “If-Modified-Since”, “User-Agent”.
Phương thức getRequestMethod() và getRequestProperty() cĩ thể được dùng để lấy
các thuộc tính trên.
4.3. Wireless Messaging API
J2ME chứa hầu hết các cấu hình và hiện trạng, kết hợp với nhau để định nghĩa mơi
trường thực thi Java hồn chỉnh cho các thiết bị cĩ tài nguyên giới hạn. Tuy nhiên, đơi
khi, cần phải cĩ gĩi giao diện lập trình ứng dụng (Application Programming Interface –
API), cĩ thể chi xẻ bởi các ứng dụng chạy trên các hiện trạng khác nhau. J2ME định
nghĩa API như vậy là các gĩi tùy chọn (optional package), là một tập các lớp và các tài
nguyên khác cĩ thể được dùng kết hợp với hiện trạng.
Cũng giống như các thành phần của J2ME, các gĩi tùy chọn được định nghĩa là yêu
cầu đặc tả Java (Java Specification Request – JSR) thơng qua Java Community Process.
Một trong những gĩi tùy chọn đầu tiên cho J2ME là JSR 120, bộ API nhắn tin khơng dây
(Wireless Messaging API – WMA), dùng để gởi và nhận các tin nhắn văn bản hoặc nhị
phân ngắn trên kết nối khơng dây. WMA dựa trên khung kết nối mạng tổng quát (GCF).
Các tin nhắn được gởi và nhận với WMA được gởi trên các mạng khơng dây của
điện thoại di động và các thiết bị tương tự khác, cĩ thể là GSM hay CDMA. WMA hỗ trợ
Short Message Service (SMS) và Cell Broadcast Short Message Service (CBS). Mặc dù
tin nhắn WMA tương tự như datagram, WMA khơng sử dụng giao diện datagram được
định nghĩa bởi GCF, giao diện này dùng cho kết nối UDP. Thay vào đĩ, WMA định nghĩa
một tập giao diện mới trong gĩi java.wireless.messaging.
Để gởi hoặc nhận tin nhắn, ứng dụng trước hết phải tạo một instance của giao diện
MessageConnection, sử dụng GCF connection factory. Địa chỉ URL chuyển cho phương
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
35
thức java.microedition.io.Connector.open() chỉ định giao thức sử dụng (SMS hoặc CBS),
và số điện thoại đích, cổng, hoặc cả hai. Ví dụ, đây là những URL hợp lệ:
sms://+417034967891
sms://+417034967891:5678
sms://:5678
cbs://:5678
URL trong hai dạng đầu tiên mở kết nối client, ứng dụng kết nối đến một server với
địa chỉ thiết bị và cổng chỉ định. Nếu cổng khơng chỉ định, sẽ dùng cổng nhắn tin mặc
định của ứng dụng. Dạng URL thứ ba mở một kết nối server trên thiết bị, cho phép ứng
dụng đợi và hồi đáp tin nhắn đến từ các thiết bị khác. Dạng cuối cùng cho phép ứng dụng
lắng nghi tin nhắn broadcast từ người điều hành mạng.
Sau đây là một ví dụ đơn giản tạo một kết nối SMS client:
import java.microedition.io.*;
import java.wireless.messaging.*;
.....
MessageConnection conn = null;
String url = "sms://+417034967891";
try {
conn = (MessageConnection) Connector.open( url );
// thực hiện cơng việc gì đĩ
}
catch( Exception e ){
// xử lý lỗi
}
finally {
if( conn != null ){
try { conn.close(); } catch( Exception e ){}
}
}
Để gởi tin nhắn, sử dụng phương thức MessageConnection.newMessage() để tạo một tin
nhắn rỗng, thiết lập payload của nĩ (dữ liệu văn bản hoặc nhị phân để gởi), và triệu gọi
phương thức MessageConnection.send():
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
36
public void sendText( MessageConnection conn, String text )
throws IOException, InterruptedIOException {
TextMessage msg = conn.newMessage( conn.TEXT_MESSAGE );
msg.setPayloadText( text );
conn.send( msg );
}
Gởi dữ liệu nhị phân cũng hồn tồn tương tự:
public void sendBinary( MessageConnection conn, byte[] data )
throws IOException, InterruptedIOException {
BinaryMessage msg =
conn.newMessage( conn.BINARY_MESSAGE );
msg.setPayloadData( data );
conn.send( msg );
}
Dĩ nhiên, cĩ giới hạn lượng dữ liệu cĩ thể gởi trong một tin nhắn. Thơng thường, tin
nhắn văn bản SMS bị giới hạn đến 160 hoặc 70 ký tự, tin nhắn nhị phân bị giới hạn đến
140 bytes.
Nhận tin nhắn thậm chí cịn đơn giản hơn: Sau khi mở một kết nối server, ứng dụng
gọi phương thức receive() của kết nối, phương thức này sẽ trả về tin nhắn cĩ trong cổng
đã xác định. Nếu khơng cĩ tin nhắn, phương thức sẽ đứng (block) cho đến khi cĩ tin
nhắn, hoặc cho đến khi cĩ một thread khác đĩng kết nối:
import java.io.*;
import java.microedition.io.*;
import java.wireless.messaging.*;
MessageConnection conn = null;
String url = "sms://:5678"; // khơng cĩ số điện thoại!
try {
conn = (MessageConnection) Connector.open( url );
while( true ){
Message msg = conn.receive(); // blocks
if( msg instanceof BinaryMessage ){
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
37
byte[] data =
((BinaryMessage) msg).getPayloadData();
// thực hiện cơng việc gì đĩ
} else {
String text =
((TextMessage) msg).getPayloadText();
//thực hiện cơng việc gì đĩ
}
}
}
catch( Exception e ){
//xử lý lỗi
}
finally {
if( conn != null ){
try { conn.close(); } catch( Exception e ){}
}
}
Để bảo đảm tính ổn định của chương trình, việc gởi và nhận thơng điệp nên giao cho một
thread riêng đảm nhận.
[ Nguồn [9] ].
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
38
Chương 5. Xây dựng ứng dụng thử nghiệm
5.1. Giới thiệu ứng dụng
5.1.1. Mục tiêu
Xây dựng một ứng dụng trên thiết bị di động nhằm trợ giúp người dùng cập nhật
các thơng tin mà người dùng quan tâm thơng qua các thơng tin đã xuất bản trên Web
Services.
Bằng phương pháp này, người dùng sẽ cĩ được các thơng tin chọn lọc nhất mà họ
khơng phải tốn thời gian ngồi lướt web, thay vào đĩ, họ cĩ thể đi đến bất cứ đâu chỉ với
thiết bị di động nhỏ gọn trong tay là cĩ thể cập nhật thơng tin họ quan tâm.
5.1.2. Ứng dụng thử nghiệm
Chương trình ứng dụng được viết bằng ngơn ngữ J2ME phục vụ thiết bị di động của
người dùng cĩ hỗ trợ dịng ngơn ngữ này.
Phía dịch vụ cung cấp nội dung được xây dựng trên ngơn ngữ PHP và cơ sở dữ
liệu mySQL.
Nội dung được web-services trả về theo chuẩn XML và được ứng dụng chạy trên
thiết bị di động phân tách, xử lý và hiển thị trên màn hình.
5.2. Các cơng nghệ sử dụng trong chương trình
5.2.1. Lightweight UI Toolkit (LWUIT)
LWUIT là một thư viện nhỏ dựa trên Swing nhưng được thiết kế cho các thiết bị
mang tính chất nhỏ gọn. LWUIT hỗ trợ giao diện một cách linh hoạt v à mạnh mẽ, với các
thành phần và các lớp phân tầng riêng biệt.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
39
Hình 17: Các phân tầng lớp trong LWUIT.
Với bộ thư viện nhỏ gọn này, người lập trình sẽ cĩ một phương thức riêng để tương
tác và làm việc với mơi trường MIDP trên thiết bị di động.
Ví dụ hiển thị Hello world
import com.sun.lwuit.Display;
import com.sun.lwuit.Form;
import com.sun.lwuit.Label;
import com.sun.lwuit.layouts.BorderLayout;
import com.sun.lwuit.plaf.UIManager;
import com.sun.lwuit.util.Resources;
public class HelloMidlet extends javax.microedition.midlet.MIDlet {
public void startApp() {
Display.init(this);
try {
Resources r = Resources.open("/LWUIT.res");
UIManager.getInstance().setThemeProps(r.getTheme(
r.getThemeResourceNames()[0])
);
} catch (java.io.IOException e) {
}
Form f = new Form();
f.setTitle("Hello World");
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
40
f.setLayout(new BorderLayout());
f.addComponent("Center", new Label("I am a Label"));
f.show();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Sau khi biên dịch ta thu được kết quả như hình dưới
Hình 18 : Ứng dụng thử nghiệm với LWUIT.
Việc giới thiệu chi tiết và đầy đủ các lớp và phương thức của bộ thư viện LWUIT
này nằm ngồi nội dung của tài liệu, người đọc cĩ thể tìm hiểu chi tiết tại địachỉ:
https://lwuit.dev.java.net/
5.2.2. XML
XML (Extensible Markup Language) là một tập các quy tắc để mã hĩa tài liệu
điện tử. Nĩ được định nghĩa trong XML 1.0 Specìication xuất bản bởi W3C và một số chi
tiết kỹ thuật khác liên quan tất cả là chuẩn mở.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
41
Mục tiêu thiết kế XML của nhấn mạnh tính đơn giản, tổng quát, và khả năng sử
dụng trên Internet. Nĩ là một định dạng dữ liệu văn bản, với sự hỗ trợ mạnh mẽ
Unicode cho các ngơn ngữ trên thế giới. Mặc dù XML của thiết kế tập trung vào các tài
liệu, nĩ được sử dụng rộng rãi cho các đại diện của các cấu trúc dữ liệu tuỳ tiện, ví dụ như
trong các dịch vụ web.
Cĩ rất nhiều phần mềm mà các nhà phát triển phần mềm cĩ thể sử dụng để truy cập
dữ liệu XML, và các hệ thống giản đồ một số thiết kế để hỗ trợ trong các định nghĩa của
ngơn ngữ dựa trên XML
5.2.2.1. Phân tách XML
Khái niệm phân tích XML là biên dịch định nghĩa thẻ và thể hiện tài liệu để cho
người dùng hoặc mơi trường phát triển ứng dụng cĩ thể hiểu dữ liệu được lưu trữ trong tài
liệu. Nĩ yêu cầu một phần mềm đặc biệt gọi là bộ phân tích (parser).
Một bộ phân tích là một phần mềm phân tích tài liệu XML dựa trên cơ sở các thẻ
XML. Bộ phân tích nhận biết thẻ XML trên cơ sở các tham số (parameter) chuyển cho nĩ
và lấy đoạn text đi với thẻ đĩ. Việc này được thực hiện bằng cách biên dịch và phiên dịch
định nghĩa của các thẻ chứa trong DTD.
Cĩ hai loại bộ phân tích:
o Bộ phân tích xác nhận hợp lệ (Validating parser).
o Bộ phân tích khơng xác nhận hợp lệ (Nonvalidating parser).
Để hiểu được hai loại này, ta cần phải biết ý nghĩa của tài liệu hợp lệ (valid) và đúng
ngữ pháp (well-formed). Một tài liệu XML hợp lệ là một tài liệu tuân thủ theo DTD gắn
với tài liệu XML. DTD cĩ thể được viết trong cùng tài liệu XML (được nhúng) hay nĩ cĩ
thể được chỉ định bằng một liên kết. Một tài liệu hợp lệ thì phải đúng ngữ pháp. Khi ta
định nghĩa các thẻ trong một DTD, mối liên hệ giữa chúng cũng được định nghĩa. Một tài
liệu đúng ngữ pháp là tài liệu mà tất cả các thẻ đều bám vào các mối liên hệ định nghĩa
trong DTD. Một số luật mà tài liệu đúng ngữ pháp phải theo là:
o Tất cả các thẻ dùng trong tài liệu phải được cân bằng bằng các thẻ bắt đầu và kết
thúc.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
42
o Tất các các thuộc tính bắt buộc định nghĩa trong DTD phải cĩ mặt.
o Giá trị thuộc tính phải nằm trong dấu nháy.
o Các thẻ chứa và được chứa phải theo sát DTD, hay Schema.
o Các ký tự markup như < hay & khơng được đứng một mình. Nếu cần, chúng phải
được dùng là <, &,…
o Tất cả các thẻ rỗng phải kết thúc bằng />
Chức năng của bộ phân tích là kiểm tra các luật trên.
Dựa vào các loại tài liệu XML mà ta đã đề cập ở trên, cĩ hai loại bộ phân tích XML,
một loại phân tích tài liệu XML kiểm tra hợp lệ và bộ kia phân tích tài liệu XML khơng
kiểm tra hợp lệ.
Bộ phân tích khơng kiểm tra hợp lệ (Nonvalidating parser): Bộ phân
tích này chỉ kiểm tra tài liệu cĩ đúng ngữ pháp hay khơng; nĩi cách khác, bộ phân tích ch ỉ
thực hiện kiểm tra cú pháp của DTD trong tài liệu, đĩ là lý do tại sao nĩ được gọi là bộ
phân tích khơng kiểm tra hợp lệ.
Bộ phân tích kiểm tra hợp lệ (Validating parser): Các bộ phân tích này
biên dịch DTD và theo các khai báo thẻ để phát sinh output ở dạng người dùng cĩ thể đọc
được. J2ME khơng thể hỗ trợ kiểm tra hợp lệ tài liệu XML.
Ngồi ra cĩ thể phân loại theo cách tiếp cận. Cĩ hai cách tiếp cận cho việc xử lý
XML: SAX và DOM. SAX hay Simple API for XML là một khung (framework) hướng sự
kiện, bộ phân tích sẽ gọi các back function trong mã chương trình client khi xử lý tập tin
XML. SAX nhẹ, và mơ hình hướng sự kiện của nĩ làm giảm bộ nhớ cần thiết làm cho nĩ
thích hợp với các ứng dụng nhỏ. Tuy nhiên, nĩ chiếm một phần lớn trong mã chương
trình client để theo dõi cây phân tích XML. Khác với SAX, DOM hay Document Object
Model đưa ra cách nhìn theo cây gần với mơ hình đối tượng nhưng yêu cầu tiêu tốn nhiều
bộ nhớ hơn. Một cây DOM cĩ thể dễ dàng được “duyệt qua” sử dụng mối liên hệ cha-con.
5.2.2.2. Các bộ phân tích XML cho KVM
Cĩ nhiều loại bộ phân tích cho KVM. Các bộ phân tích đưa ra ở đây làm việc với
KVM. Ta sẽ chỉ nĩi về tính năng chính của các bộ phân tích.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
43
o Pull parser: Ở các bộ phân tích này, đầu tiên dữ liệu được đọc và nĩ được phân
tích từ định nghĩa. Việc phân tích cĩ thể hồn thành bằng các hàm đệ qui để dịch cấu trúc
cây của tài liệu.
o Push parser: Các bộ phân tích này xử lý định nghĩa dữ liệu trước khi xử lý tài
liệu. Cấu trúc cây hồn chỉnh được tạo trong bộ nhớ trước khi thật sự bắt đầu xử lý tài liệu
XML. Trong trường hợp này, tồn bộ cây DOM được sinh ra trong bộ nhớ ngay cả khi
khơng cần thiết phải như vậy.
5.2.2.2.1. kXML
Đây là bộ phân tích XML quan trọng và phổ biến nhất cho KVM. Nĩ là kết hợp của
pull parser và XML Writer, được dùng để viết XML. Nĩ chứa một WAP Binary XML
(WBXML) được dùng để chuyển tài liệu XML trên các kênh truyền thơng vơ tuyến. Do
đĩ, nĩ hỗ trợ Wireless Markup Language. Nĩ chứa một kDOM đặc biệt, đĩ là Document
Object Model thay cho kXML. Nĩ đơn giản hơn và quản lý khơng gian hiệu quả hơn
Document Object Model. Nĩ biên dịch và làm việc với mơi trường Thiết bị thơng tin di
động (Mobile Information Device-MID) mà khơng cần phải hiệu chỉnh. Nĩ nằm trong gĩi
de.kxml. Chức năng của nĩ được định nghĩa trong lớp Parser.
5.2.2.2.2. Tiny XML
Đây là một push parser khơng kiểm tra hợp lệ, biên dịch tồn bộ cây DOM vào bộ
nhớ và sau đĩ phân tích tồn bộ tài liệu XML. Nĩ cần phải hiệu chỉnh mã nguồn để chạy
trên MID. Đặc điểm chính của TinyXML là nĩ chỉ theo một số bộ mã xác định: ASCII,
UTF-16, UTF-16BE, và UTF-8. Kiểu bộ mã được xác định trong XML Prolog. Nếu kiểu
bộ mã XML Prolog khơng phải là bộ mã ASCII, UTF-16, UTF-16EB và UTF-8, thì
TinyXML sẽ khơng phân tích tài liệu XML và sẽ ném ra một ngoại lệ.
5.2.2.2.3. Nano XML
Đây là một bộ phân tích khác cho KVM, nĩ hoạt động theo kiểu push-parsing. Nĩ
cĩ một tính năng riêng cho việc hiệu chỉnh tài liệu và viết tài liệu trở vào stream. Bởi vì
tính năng này khơng cĩ ích lắm cho MID, bộ phân tích này khơng được dùng nhiều. Tuy
nhiên, một khi tính năng này được chấp nhận trong đặc tả MID, nĩ sẽ là một bộ phân tích
quan trọng cho truyền thơng vơ tuyến.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
44
5.2.2.3. Làm việc với kXML
Ta chọn sử dụng bộ phân tích kXML. Ta sẽ khảo sát cách làm việc với kXML.
Các lớp và gĩi trong bộ phân tích kXML:
Lớp Attribute: Lớp này thể hiện thuộc tính của thẻ. Khi ta gọi phương thức
StartTag.getAttribute, nĩ sẽ trả về một đối tượng cĩ kiểu là Attribute là thuộc tính của thẻ
đĩ. Lớp này cĩ bốn phương thức. Phương thức getName() trả về tên của thuộc tính, ta
cũng cĩ thể lấy giá trị của thuộc tính bằng cách gọi phương thức getValue() của nĩ.
Phương thức toString() sẽ trả về dạng biểu diễn chuỗi của đối tượng Attribute.
Lớp XML: Lớp này biểu diễn dữ liệu XML. Lớp này được dùng bởi bộ
phân tích. Tất cả các phương thức trong lớp này đều là tĩnh (static). Nĩ cĩ một số trường
để bộ phân tích sử dụng, ví dụ như START-TAG, TEXT, END-TAG,...
Lớp PrefixMap: Lớp này biểu diễn PrefixMap của thẻ. Khi bạn gọi
phương thức StartTag.getPrefixMap(), nĩ sẽ trả về một đối tượng PrefixMap. Lớp này cĩ
ba phương thức: phương thức getNamespace(), trả về namespace của prefix này, phương
thức getPrefix(), trả về chuỗi biểu diễn của prefix, và phương thức PrefixEnumeration().
5.2.2.4. Gĩi org.kxml
Gĩi này chứa các lớp liên quan đến việc phân tích dữ liệu XML.
AbstractXMLParser: Đây là một lớp trừu tượng (abstract class). Tất cả các lớp phân
tích XML đều kế thừa lớp này. Để bắt đầu phân tích dữ liệu, ta phải gọi phương thức
read() của lớp này. Phương thức này phát sinh một đối tượng của lớp ParseEvent. Tất cả
các phương thức khác sẽ được bộ phân tích sử dụng.
XmlParser: Lớp này kế thừa lớp AbstractXmlParser. Hàm tạo của lớp này
cần một đối tượng lớp reader, từ đĩ nĩ bắt đầu đọc dữ liệu XML và trong khi phân tích dữ
liệu, đồng thời nĩ sẽ phát sinh các sự kiện phân tích (parse event). Lớp này kế thừa tất cả
các phương thức của lớp AbstractXmlParser.
Lớp ParseEvent: Đây là một lớp trừu tượng, thể hiện các sự kiện được
phát sinh bởi bộ phân tích trong lúc phân tích dữ liệu XML.
Lớp StartTag: Lớp này kế thừa lớp ParseEvent. Đối tượng của lớp này
được phát sinh khi bộ phân tích tìm thấy bắt đầu của một thẻ – ví dụ:
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
45
Hello How are you
Trong khi phân tích tài liệu XML, bộ phân tích bắt gặp thẻ , nĩ sẽ phát sinh
một sự kiện StartTag, phương thức getName() của lớp này sẽ trả về Hello, là tên của thẻ.
Lớp TextEvent: Lớp này cũng kế thừa lớp ParseEvent. Đối tượng của lớp
này được phát sinh khi bộ phân tích tìm thấy dữ liệu văn bản của thẻ. Ví dụ, khi bộ phân
tích bắt gặp Hello How are you, nĩ sẽ phát sinh một sự kiện text. Phương thức getText()
của lớp này sẽ trả về Hello How are you, là text của thẻ.
Lớp EndTag: Đây là lớp con của lớp ParseEvent. Đối tượng của lớp này
được phát sinh khi bộ phân tích tìm thấy kết thúc của một thẻ. Ví dụ, khi bộ phân tích bắt
gặp thẻ , nĩ sẽ phát sinh một sự kiện EndTag. Phương thức getName() của lớp
này sẽ trả về Hello, tên của thẻ kết thúc.
EndDocument: Đây cũng là một lớp con của lớp ParseEvent. Đối tượng
của lớp này được phát sinh khi bộ phân tích tìm thấy kết thúc của tài liệu – nghĩa là, kết
thúc của tập tin XML.
5.2.2.5. Gĩi org.kxml.io
Gĩi này chứa các lớp để ghi dữ liệu XML.
AbstractXmlWriter: Lớp này là lớp cơ bản (base class) của lớp XmlWriter
và cung cấp các chức năng cho lớp XmlWriter. Lớp này cĩ các phương thức dùng để ghi
tài liệu XML; các phương thức như attribute(), endTag(), và startTag() được dùng để tạo
tài liệu XML.
LookAheadReader: Lớp này giống như một lớp reader, nhưng cĩ hàm
peek() để chỉ ký tự kế tiếp, lớp này cũng khơng ném ra ngoại lệ IOException.
XmlWriter: Lớp này lấy chức năng từ lớp AbstractXmlWriter. Lớp này cĩ
thêm các phương thức checkPending(), close(), và write(char c) ngồi các phương thức kế
thừa từ lớp AbstractXmlWriter.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
46
Chương 6. Tổng quan về chương trình ứng dụng thử nghiệm
6.1. Web Services
Web Services là nơi cung cấp và quản lý nội dung của bên cung cấp dịch vụ, sau
đĩ nĩ được kết nối với thiết bị di động của người dùng.
6.1.1. Giới thiệu khung xử lý hệ thống
Lược đồ xử lý trên trang services:
Hình 19 : Quá trình xử lý trên web services.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
47
Những module quan trọng của hệ thống được đặt trong một thư mục chính, dưới đây
là các module và thư mục chứa những module quan trọng trong việc xử lý logic của hệ
thống:
index.php: đây là đầu vào khởi đầu, và duy nhất của ứng dụng. Ở đây, các
biến hệ thống, bảo mật được định nghĩa, cũng từ đây sẽ triệu gọi đến các gĩi hỗ trợ để cấu
hình biến cần thiết trong quá trình hệ thống xử lý.
ajax: đây là thư mục chứa tồn bộ các module trong quá trình xử lý của hệ
thống với kiểu làm việc ajax, trong thư mục này, cĩ chia làm hai phần tách biệt cho ứng
dụng với admin hoặc bên ngồi cho người dùng hoặc khách.
route.php: đây là nơi điều hướng của ứng dụng, từ đây sẽ xác định xem khu
vực ứng dụng nào được triệu gọi, của admin hay bên ngồi trang.
admin.layout.php: giao diện chuẩn của ứng dụng cho admin.
site.layout.php: giao diện bên ngồi trang.
config.php: định nghĩa các thơng số chung được dùng trong tồn bộ ứng
dụng.
admin: thư mục xử lý riêng biệt nếu người dùng muốn truy xuất vào phần
ứng dụng dành cho admin thì phải qua bước kiểm tra hợp lệ với tài khoản admin.
help: thư mục chứa các module để trợ giúp trong quá trình làm việc của hệ
thống.
languages: thư mục định nghĩa ngơn ngữ sử dụng trong hệ thống, và nếu là
hỗ trợ đa ngơn ngữ. Hoặc khơng sẽ sử dụng ngơn ngữ mặc định là Tiếng Anh.
controller: thư mục điều hướng chính trong quá trình xử lý MVC, trong thư
mục này được tách biệt giữa hai trạng thái người sử dụng là admin và bên ngồi trang.
model: thư mục chứa các truy vấn về cơ sở dữ liệu nĩi chung trong quá
trình hệ thống xử lý theo kiểu MVC.
class: định nghĩa các lớp hay dùng trong quá trình xử lý của hệ thống.
js: thư mục chứa các file javascript được dùng trong hệ thống.
template: thư mục chứa các file css để xây dựng giao diện dùng trong hệ
thống.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
48
6.1.2. Xây dựng cơ sở dữ liệu cho hệ thống
Cơ sở dữ liệu dùng trong hệ thống gồm 8 bảng:
tbl_user tbl_user_ group
tbl_
layout
tbl_
language
tbl_
component
tbl_
componen
t_
group
tbl_
category_
content
tbl_
content
id
username
password
email
firstName
lastName
middleNa
me
gender
dob
joinTime
lastLoginT
ime
lastLoginIp
status
groupId
id
groupNa-
me
descriptio-
n
id
name
version
createdTime
description
authorName
authorEmail
authorOrg
authorUrl
encoding
metaTitle
metaKeyword
metaDescripti
on
applied
id
name
version
createdTime
description
authorName
authorEmail
authorUrl
authorOrg
applied
id
name
version
createdTime
description
authorName
authorEmail
authorUrl
authorOrg
editable
action
task
controller
ordering
status
groupId
id
name
ordering
status
id
parent_id
name
link
ordering
seo_name
wooden_leg
publish
id
createdDa
te
ordering
status
title
descriptio
n
content
source
cat_id
Và biểu đồ thực thể liên kết:
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
49
Hình 20 : Biểu đồ thực thể liên kết của hệ thống.
6.1.3. Quá trình hoạt động của hệ thống
6.1.3.1. Phần quản trị nội dung
Đây là phần tổng hợp dành cho người quản trị hệ thống, trong phần này người quản
trị nĩi chung cĩ thể tạo, sửa, xĩa nội dung cung cấp xuống thiết bị di động.
6.1.3.1.1. Khu vực người quản trị đăng nhập vào hệ thống
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
50
Hình 21: Người quản trị đăng nhập vào hệ thống.
6.1.3.1.2. Khu vực chung
Người quản trị cĩ thể làm mới nội dung đưa xuống thiết bị di động, mỗi danh mục
sẽ được hệ thống lựa chọn 10 bản ghi mới nhất.
Hình 22: Khu vực mặc định của hệ thống
6.1.3.1.3. Khu vực thao tác với các danh mục tin
Người quản trị cĩ thể tạo mới, sửa, xĩa các danh mục tin. Các danh mục cĩ thể tạo
đa cấp, cấp cao nhất thuộc cấp con của –root
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
51
Hình 23: Khu vực hiển thị danh mục của hệ thống.
6.1.3.1.4. Khu vực quản lý nội dung
Người quản trị cĩ thể thao tác với các bản ghi của từng danh mục liên quan, các
quyền cơ bản như tạo, sửa, xĩa, chuyển trạng thái (publish, unpublish) …
Hình 24: Khu vực hiển thị nội dung bản tin.
6.1.3.2. Phần dành cho người quản trị
Phần này dành cho người quản trị cấp cao nhất là super admin.
6.1.3.2.1. Phần menu bên trái
Đây là phần dùng để truy xuất đến tất cả các chức năng ở trong hệ thống, nhà quản
trị cĩ thể tương tác với các chức năng liên quan như nhĩm người dùng (users group),
nhĩm thực đơn (menus group), thành phần (components), ngơn ngữ (languages).
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
52
Hình dưới minh họa phần tùy chọn bên trái:
Hình 25: Phần tùy chọn bên trái của hệ thống.
6.1.3.2.2. Phần quản lý nhĩm người dùng
Người dùng root (super administrator) cĩ thể tạo ra những người dùng khác với các
nhĩm như: administrator, moderator, member tùy vào từng ngữ cảnh của hệ thống và ứng
dụng.
Hình 26: Phần quản lý nhĩm người dùng.
6.1.3.2.3. Phần quản lý nhĩm thực đơn
Super administrator cĩ thể tạo ra các thực đơn với tên khác nhau dùng để gom nhĩm
các thành phần với nhau. Ví dụ: Category và Content ở dưới thực đơn là Content
Manager.
Hình 27: Phần quản lý nhĩm thực đơn.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
53
6.1.3.2.4. Phần quản lý các nhĩm Component
Supper administrator tạo ra các Component này là các thành phần trực tiếp trong hệ
thống, các thành phần riêng biệt với các biến điều khiển trong hệ thống là $controller,
$action, $task.
Hình 28: Phần quản lý Component.
6.1.3.2.5. Phần quản lý ngơn ngữ hiển thị
Super administrator cĩ thể chọn ngơn ngữ mặc định hiển thị trong hệ thống. Mặc
định là English, file ngơn ngữ được tạo với định dạng english.php hoặc vietnammese.php
tương ứng với tên ngơn ngữ đĩ trong khu vực quản trị. File này được đặt trong thư mục
languages của hệ thống. Bên trong file được định nghĩa các biến ngơn ngữ.
Ví dụ:
$aXYLang['ADD'] = 'Thêm';
$aXYLang['DELETE'] = 'Xĩa';
$aXYLang['_SAVE'] = 'Lưu';
Hay
$aXYLang['ADD'] = 'Add';
$aXYLang['DELETE'] = 'Delete';
$aXYLang['_SAVE'] = 'Save';
Hình 29: Khu vực quản lý ngơn ngữ hiển thị trong hệ thống.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
54
6.1.3.3. Phần xuất bản nội dung định dạng XML
6.1.3.3.1. Xuất bản nội dung các danh mục tin
Khi URL này được truy xuất, nội dung sẽ được xuất bản dưới định dạng XML:
Hình 30: Kết quả thu được với trình duyệt Mozilla Firefox 3.5.
6.1.3.3.2. Xuất bản các bản tin trong cùng danh mục
Khi URL này được truy xuất, nội dung sẽ được xuất bản dưới định dạng XML:
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
55
Hình 31: Kết quả thu được với trình duyệt Mozilla Firefox 3.5.
6.2. Trên thiết bị di động
6.2.1. Quy trình hoạt động
Màn hình khởi động ứng dụng
Hình 32: Màn hình khởi động của ứng dụng
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
56
Tiếp đĩ người dùng sẽ vào phần tùy chọn ứng dụng
Hình 33: Màn hình tùy chọn ứng dụng.
Câu hỏi yêu cầu cho phép kết nối với dịch vụ mạng?
Hình 34: Yêu cầu cho phép kết nối tới dịch vụ.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
57
Sau đĩ là các thơng tin chi tiết hơn
Hình 35: Các quá trình khi xem tin tức với ứng dụng.
6.3. Các module chính trong ứng dụng
6.3.1. Web Services
Cĩ rất nhiều gĩi tin liên quan trong ứng dụng web services này, trong khuơn khổ tài
liệu chỉ giới thiệu các module điển hình:
Default component: đây là component mặc định của hệ thống khi các biến điều
khiển chưa được xác lập. Đây cũng là component bắt buộc phải được cài đặt để hệ thống
cĩ thể hoạt động. Khu vực điều khiển được đặt trong thư mục /controller/site/default:
default.index.php: file điều hướng chính của component.
template: thư mục chứa giao diện html.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
58
display.tpl.php: file chứa giao diện html.
view: thư mục chứa file xử lý dữ liệu và xuất bản nội dung.
view.php: file xử lý.
js: thư mục chứa file javascript của component.
default.site.js: file mặc định bắt buộc chứa mã javascipt của component.
Để tương tác với cơ sở dữ liệu, chức năng model của mơ hình MVC trong component
được đặt ở thư mục /model/site/default:
default
default.model.php: file tương tác với cơ sở dữ liệu.
default.index.php:
<?php
1. defined( "XY_SYS" ) or die( "Restricted access" );
2. eval( getGlobalVar() );
3. loadFile (XY_CONT.'view/view');
4. $oController = new CDefault();
5. $oXYLayout->setTitle('Dang Dinh Hung J2ME Web services');
6. switch($action)
7. {
8. default:
9. case 'show':
10. {
11. switch($task)
12. {
13. default:
14. case 'view':
15. $oController->show();
16. break;
17. }
18. }
19. break;
20. }
?>
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
59
(3). Dịng lệnh dùng để tránh truy cập trực tiếp file php.
(4). Thiết lập các biến cục bộ của hệ thống.
(5). Gọi module xử lý logic của component.
(6). Khởi tạo đối tượng.
(7). Thiết lập Title của trang HTML trên trình duyệt.
(8)÷(22). Xử lý điều hướng của component.
view.php:
<?php
1. defined( "XY_SYS" ) or die( "Restricted access" );
2. class CDefault
3. {
4. var $oUri;
5. function CDefault()
6. {
7. loadFile('help/CUri.class');
8. $this->oUri = new CUri();
9. }
10. function show( )
11. {
12. eval(getGlobalVar());
13. $oUri = $this->oUri;
14. $link = $aConfig["admin_pos"];
15. $oXYTemp->assign ('link',$link);
16. loadFile(XY_CONT.'template/display.tpl');
17. }
18. }
?>
(2). Khởi tạo lớp CDefault
(15). Truyền giá trị của biến xuống template.
(16). Gọi module xử lý xuất bản html.
display.tpl.php:
1. <?php
2. defined( "XY_SYS" ) or die( "Restricted access" );
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
60
3. eval( getGlobalVar() );
4. $link = $oXYTemp->get('link');
5. ?>
6.
7. <!--
8. body {
a. background-color: #000040;
9. }
10. body,td,th {
a. font-size: 36px;
b. color: #FFFFFF;
11. }
12. -->
13.
14. WEB SERVICES
15. Xin chào đã viếng thăm
WEB SERVICES,
16. để đăng nhập phần quản
trị
17. vui lòng nhấn " style="color:#fff;" >
18. vào đây.
19.
20. Trang web phục vụ khóa luận
tốt nghiệp,
21. chủ đề J2ME và
22. ứng dụng dịch vụ trực tuyến.
23.
24. ĐẶNG ĐÌ
25. NH HÙNG giữ toàn quyền
26. Hà Nội, 2010
(4). Lấy nội dung biến được truyền từ khu vực controller truyền xuống.
(6)÷(13). Định nghĩa trực tiếp CSS trong template.
(14)÷(26). Giao diện được xuất bản html.
default.site.js:
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
61
default.model.php:
do logic của component này khơng yêu cầu nên hai file này khơng chứa nội dung xử lý.
6.3.2. Trên thiết bị di động
Thư mục /src chứa các module .java của chương trình:
src
com
sun
lwuit: thư mục chứa mã nguồn của thư viện lwuit ở dạng tập tin.
newsonline
news: thư mục chứa các gĩi .java để hoạt động chương trình.
util: thư mục chứa các gĩi thư viện hỗ trợ.
NewsOnlineMIDlet.java: file gốc của chương trình.
Thư mục /res chứa các nguồn media:
res
images: chứa các ảnh .png.
Thư mục /lib chứa các gĩi thư viện hỗ trợ:
lib: chứa các gĩi hỗ trợ kxlm2.zip, LWUIT.jar.
Cịn những thư mục khác là do trình biên dịch khi tạo project bên trong netbean.
NewsOnlineMIDlet.java:
1. package newsonline;
2. import com.sun.lwuit.Command;
3. import com.sun.lwuit.Display;
4. import com.sun.lwuit.Form;
5. import com.sun.lwuit.List;
6. import com.sun.lwuit.animations.CommonTransitions;
7. import com.sun.lwuit.animations.Transition;
8. import com.sun.lwuit.events.ActionEvent;
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
62
9. import com.sun.lwuit.events.ActionListener;
10. import com.sun.lwuit.layouts.BorderLayout;
11. import com.sun.lwuit.list.DefaultListCellRenderer;
12. import com.sun.lwuit.list.DefaultListModel;
13. import com.sun.lwuit.plaf.UIManager;
14. import com.sun.lwuit.util.Resources;
15. import java.io.IOException;
16. import javax.microedition.midlet.*;
17. import newsonline.news.ConfirmExit;
18. import newsonline.news.HelpContact;
19. import newsonline.news.News;
20. public class NewsOnlineMIDlet extends MIDlet implements ActionListener {
21. private static final Command selectCommand = new Command("Chọn", 0);
22. private static final Command exitCommand = new Command("Thốt", 1);
23. public static Form mainForm;
24. private static List listMemu;
25. public void startApp() {
26. // VKBImplementationFactory.init();// Tao ban phim ao cho cac dong may
cam ung
27. Display.init(this);
28. try {
29. Resources res = Resources.open("/newsonlineresources.res");
30. UIManager.getInstance().setThemeProps(res.getTheme(res.getThemeResourceNa
mes()[0]));
31. mainForm = new Form("Tin Tức");
32. mainForm.setLayout(new BorderLayout());
33. //disable the scroll on the Form.
34. mainForm.setScrollable(false);
35. String[] menu = {"Tin Tức","Trợ Giúp", "Liên Hệ"};
36. DefaultListModel dlModel = new DefaultListModel(menu);
37. listMemu = new List(dlModel);
38. //create a ListCellRenderer and install
39. DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
40. listMemu.setListCellRenderer(dlcr);
41. // dlcr.setShowNumbers(false);
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
63
42. listMemu.setFixedSelection(List.FIXED_NONE_CYCLIC);// Cho phep select
vong tron
43. listMemu.setSmoothScrolling(false);
44. listMemu.getStyle().setBgTransparency(0);
45. listMemu.addActionListener(new ActionListener() {
46. public void actionPerformed(ActionEvent ae) {
47. Transition out;
48. out =
CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL,
false, 500);
49. setTransition(null, out);
50. switch (listMemu.getSelectedIndex()) {
51. case 0:
52. if (News.listNewsCategory != null) {
53. News.newsForm.show();
54. } else {
55. new News(mainForm);
56. }
57. break;
58. case 1:
59. new HelpContact(mainForm, "Trợ Giúp", "Dùng phím lên, xuống và OK để
chọn\nhoặc cĩ thể dùng phím select và cancel\n");//
60. break;
61. case 2:
62. new HelpContact(mainForm, "Liên Hệ", "Liên hệ 19001234 để được giải đáp");
63. break;
64. }
65. }
66. });
67. mainForm.addComponent(BorderLayout.CENTER, listMemu);
68. mainForm.addCommand(selectCommand);
69. mainForm.addCommand(exitCommand);
70. mainForm.setCommandListener(this);
71. mainForm.show();
72. } catch (IOException ioex) {
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
64
73. ioex.printStackTrace();
74. }
75. }
76. public static void setTransition(Transition in, Transition out) {
77. mainForm.setTransitionInAnimator(in);
78. mainForm.setTransitionOutAnimator(out);
79. }
80. public static Resources getResource(String name) throws IOException {
81. return Resources.open("/" + name + ".res");
82. }
83. public void pauseApp() {
84. }
85. public void destroyApp(boolean unconditional) {
86. notifyDestroyed();
87. }
88. public void actionPerformed(ActionEvent ae) {
89. Command cmd = ae.getCommand();
90. switch (cmd.getId()) {
91. case 0:
92. Transition out;
93. out =
CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL,
false, 500);
94. setTransition(null, out);
95. switch (listMemu.getSelectedIndex()) {
96. case 0:
97. if (News.listNewsCategory != null) {
98. News.newsForm.show();
99. } else {
100. new News(mainForm);
101. }
102. break;
103. case 1:
104. new HelpContact(mainForm, "Trợ Giúp","Dùng phím lên, xuống và OK để
chọn\nhoặc cĩ thể dùng phím select và cancel\n");//
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
65
105. break;
106. case 2:
107. new HelpContact(mainForm, "Liên Hệ", "Liên hệ 19001234 để được giải
đáp");//
108. break;
109. }
110. break;
111. case 1:
112. setTransition(null, null);
113. new ConfirmExit(mainForm, this, "Tin Tức");
114. break;
115. }
116. }
117. }
(1)÷(19): gọi các gĩi, thư viện, các lớp trong module.
(20) ÷(117): xử lý logic trong ứng dụng thơng qua các module.
6.4. Mã nguồn tham khảo
6.4.1. kxml2
Đây là gĩi hỗ trợ phân tách dữ liểu định dạng XML, gĩi này được lấy tại địa chỉ:
6.4.2. Convert UTF-8
Đây là module hỗ trợ định dạng utf8, được tham khảo tại địa chỉ:
6.4.3. LWUIT
Đây là bộ thư viện chính được dùng trong ứng dụng chương trình, nĩ hỗ trợ xây
dựng giao diện mạnh mẽ, được lấy tại địa chỉ:
https://lwuit.dev.java.net/
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
66
Chương 7. Cài đặt ứng dụng thử nghiệm
7.1. Web Services
7.1.1. Cài đặt phần giả lập máy chủ Web trên máy tính cá nhân
Để giả lập máy chủ web trên PC cĩ rất nhiều phần mềm, tính năng tổng hợp
được chú ý cao nhất cho các phần mềm cài đặt đủ cả 3 bộ tiện ích là php, mySql và
phpmyAdmin. Wamp là một phần mềm với giao diện đơn giản, dễ sử dụng và hội tụ đủ
các điều kiện trên. Tiến hành cài đặt gĩi Wamp 1.5 đính kèm trong đĩa chương trình, cài
đặt theo thơng số mặc định của phần mềm.
Cuối cùng thu được các cấu hình cơ bản:
Hosting url: localhost
User name: root
Password:
7.1.2. Cấu hình gĩi ứng dụng Web Services
Sau khi cài đặt chương trình giả lập, tiến hành cài đặt cơ sở dữ liệu, truy cập vào địa
chỉ:
Hình 36: Tạo cơ sở dữ liệu trong phpmyadmin.
Nhập tên cơ sở dữ liệu và tạo.
Tiếp đĩ tiến hành import cơ sở dữ liệu cĩ sẵn được đính kèm trong đĩa chương trình
Hình 37: Quá trình nhập cơ sở dữ liệu.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
67
Sau đĩ copy tồn bộ thư mục /services được đính kèm trong đĩa chương trình vào
thư mục /www của chương trình wamp.
Trong thư mục /services, mở file config.php ở chế độ edit (đơn giản cĩ thể dùng
notepad để sửa), thay vào các tham số phù hợp theo thứ tự: dbHost, dbUser, dbPass,
dbName:
$ar = array( "localhost", "root", "", "services" );
Như vậy là hồn tất quá trình cài đặt, truy cập ứng dụng web services tại địa chỉ:
Tài khoản administrator mặc định ban đầu là admin/abc123.
7.2. Trên thiết bị di động
7.2.1. Cài đặt phần mềm mơ phỏng
o netbeans-6.7.1: đây là IDE để xây dựng ứng dụng J2ME ở mức cơ bản.
o sun_java_wireless_toolkit-2.5.2_01: đây là trình biên dịch mã java và tạo mơ hình
mơ phỏng thiết bị di động trên máy tính.
Hai gĩi này đều được đính kèm theo đĩa chương trình.
7.2.2 . Cấu hình ứng dụng thử nghiệm
Trong netbean IDE tạo New Project hoặc nhấn Ctrl+Shift+N.
Hình 38: Bước đầu tạo Project mới.
Chọn Mobile Application, rồi Next.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
68
Hình 39: Cấu hình ban đầu.
Project Name: lựa chọn một tên bất kỳ, bỏ chọn Create Hello MIDlet, rồi Next.
Hình 40: Cấu hình chi tiết.
Ở tùy chọn Emulator Platform chọn Sun Java( TM ) Wireless Toolkit 2.5.2_01 for
CLDC rồi Finish.
Copy tồn bộ thư mục /News đính kèm theo đĩa chương trình vào thư mục tạo
project của netbean, /My Documents/NetBeansProjects/News.
Như vậy việc cấu hình ứng dụng đã hồn tất, tiếp theo tiến hành Clean & Build và
chạy chương trình mơ phỏng.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
69
Kết luận
Khĩa luận được chia làm bảy chương mục và tập trung vào hai điều chính, thứ nhất,
làm rõ lý thuyết, tiếp cận cơng nghệ J2ME và các cơng nghệ hỗ trợ một cách tổng quát,
đồng bộ nhất. Thứ hai, nghiên cứu và thử nghiệm ứng dụng viết trên J2ME và tương tác
với Web Services dùng giao thức XML.
Chương một, cung cấp một cái nhìn sơ bộ nhất về cơng nghệ lập trình trên di động
nĩi chung, và các cơng nghệ phổ biến nhất hiện nay nĩi riêng. Cũng trong chương này, ta
cĩ cái nhìn mang tính xu hướng và tương lai của ngành cơng nghiệp lập trình trên di
động.
Chương hai, giới thiệu cơng nghệ lập trình trên thiết bị di động với ngơn ngữ J2ME.
Một cách tổng quát nhất về ngơn ngữ J2ME, các đặc điểm của ngơn ngữ này và sự so
sánh một số đặc điểm của ngơn ngữ J2ME và anh em của nĩ là J2SE.
Chương ba, cung cấp cho người đọc cái nhìn rõ hơn về bản chất của cơng nghệ lập
trình với ngơn ngữ J2ME. Tuy vậy, đây là kiến thức mang bản chất cơng nghệ, nĩ khơng
phục vụ trong việc lập trình nhiều lắm mà nĩ giúp những người phát triển hiểu được bản
chất một cách cặn kẽ nhất về những việc họ làm khi thực hiện các project trong triển khai
ứng dụng.
Chương bốn, đi sâu vào một số cơng nghệ trong lập trình với ngơn ngữ J2ME. Đây
là những cơng nghệ cụ thể và chi tiết trong ngơn ngữ J2ME. Chương này giúp đỡ người
lập trình một cách trực tiếp và mạnh mẽ nhất.
Chương năm, sau khi cĩ cái nhìn và hiểu biết tương đối về cơng nghệ lập trình trên
thiết bị di động với ngơn ngữ lập trình J2ME, chương này sẽ dẫn dắt người đọc về ứng
dụng thử nghiệm cụ thể. Ngồi ra, nĩ cịn giới thiệu các cơng nghệ liên quan dùng trong
chương trình ứng dụng thử nghiệm. Đây là những cơng nghệ phổ biến bên ngồi, hiện
đang được cộng đồng sử dụng và hỗ trợ mạnh mẽ.
Chương 6, giới thiệu ứng dụng thử nghiệm. Ứng dụng được chia thành hai phần
chính nếu xét về phương diện chức năng và phân chia đối tượng sử dụng. Thứ nhất, đĩ là
phần Web Services, phần này dùng riêng cho những người quản trị nội dung. Nĩ cung cấp
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
70
các chức năng để người quản trị thao tác quản lý nội dung để đưa xuống thiết bị di động
của người dùng…
Chương bảy, đây là chương cuối cùng, chương này giúp người đọc cài đặt và cấu
hình thành cơng ứng dụng thử nghiệm.
Như vậy, khĩa luận đã tập trung làm rõ được cơng nghệ lập trình J2ME và xây dựng
được ứng dụng thử nghiệm. Đĩ là thành quả của một quá trình nỗ lực cố gắng trong việc
nghiên cứu lý thuyết cũng như lập trình ứng dụng thử nghiệm, nĩ là kết quả của một quá
trình vừa học vừa làm và vừa làm vừa học. Tuy thành tựu đạt được là khơng nhỏ nhưng
do khuơn khổ thời gian cũng như khả năng cịn hạn chế nên vẫn cĩ những thiếu sĩt chưa
được khắc phục… Nếu cĩ thuận lợi về thời gian và nhân lực thì ứng dụng demo này hồn
tồn cĩ thể đem ra phục vụ thực tế. Ít nhất phần Web Services cần được bổ xung chức
năng Web Crawler để giải phĩng sức người trong việc quản lý và xuất bản nội dung, bên
cạnh đĩ cũng cần bổ sung các chức năng cao cấp hơn trong phần quản trị của super
administrator.
Để hồn thành nội dung của khĩa luận này đặc biệt chương ba, chương bốn thì cĩ
phần đĩng gĩp khơng nhỏ của những blogger về J2ME [9], [10] ngồi những cá nhân đã
nêu ở phần đầu. Một lần nữa xin chân thành cảm ơn những người vì sự phát triển chung
của cơng nghệ, vì tình yêu đối với khoa học, họ đã đĩng gĩp rất lớn cho những người đi
sau trong việc tiếp cận tri thức một cách nhanh chĩng và cĩ hệ thống. Việc kế thừa và
phát triển tiếp kiến thức hàn lâm làm nên một thế giới mang tính cộng đồng rất cao. Tất cả
bắt nguồn từ tình yêu đối với Tổ quốc, tình yêu , sự chia sẻ và mong muốn cùng tiến bộ
trong khoa học kỹ thuật.
ứu cơng nghệ J2ME và thử nghiệm lập trình ứng dụng trên thiết bị di động
71
Tài liệu tham khảo
Tài liệu tiếng Anh:
[1] Andi Gutmans, Stig Sỉther Bakken, and Derick Rethans, PHP 5 Power
Programming, 2004
[2] Anura Guruge, Corporate Portals Empowered with XML and Web Services,
Publisher Digital Press, October 15, 2002
[3] Biswajit Sarkar, Packt - LWUIT 1.1 for Java ME Developers, 2009
[4] BrianPfaffenberger, StevenM.Schafer, CharlesWhite, BillKarow, HTML,
XHTML, & CSS Bible, 3rd Edition, 2004
[5] Ethan Cerami, Web Services Essentials, 2/2002
[6] Kim Topley, J2ME in a Nutshell, Edition March 2002
[7] Robert Hablutzel, Developing Web Services with Java APIs for XML, 2005
Tài liệu tiếng Việt:
[8] Lập trình J2ME cơ bản, Nguyễn Ngọc Minh, javavietnam.org
Website tham khảo:
[9]
[10]
Các file đính kèm theo tài liệu này:
- LUẬN VĂN-NGHIÊN CỨU CÔNG NGHỆ J2ME VÀ THỬ NGHIỆM LẬP TRÌNH ỨNG DỤNG TRÊN THIẾT BỊ DI ĐỘNG.pdf