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

Để 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.

pdf83 trang | Chia sẻ: lylyngoc | Lượt xem: 2949 | Lượt tải: 1download
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:

  • pdfLUẬ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