Top Banner
Tutorial J2ME Membangun aplikasi client-server dan koneksi dengan database di server Amri Shodiq ( [email protected] ) 20 Juni 2009
37

Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Jul 04, 2015

Download

Documents

Frends Aiw
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Tutorial J2ME Membangun aplikasi client-server dan

koneksi dengan database di server

Amri Shodiq (amrishodiqgmailcom)

20 Juni 2009

Pada satu siang seorang teman menelpon dari Surabaya menanyakan realisasi janji saya beberapa waktu sebelumnya Pada waktu itu saya menjanjikan akan memberikan semacam tutorial tentang bagaimana mengakses (menambah mengubah dan menghapus) data di server dengan Java Micro Edition

Latar belakangnya begini rekan saya tersebut Pak Sugeng (sebut saja begitu) ingin membuat aplikasi ponsel yang bisa digunakan untuk menampilkan data-data pelanggan kemudian mengeditnya sembari di lokasi pelanggan hingga menyimpannya kembal Yang menjadi masalah adalah fasilitas penyimpanan data di ponsel sangat terbatas Saat ini teknologi yang bisa digunakan di ponsel adalah RMS Namun RMS memiliki banyak kekurangan jika dibandingkan dengan tujuan ini

1 RMS bukanlah database relational yang mengijinkan kita melakukan query SQL RMS jika boleh saya gambarkan lebih mirip dengan database masa lampau yang hanya dapat diakses per record dengan menyebutkan id-nya

2 Masalah yang lain adalah bahwa data yang disimpan di dalam RMS hanya tersimpan di ponsel Jika kita ingin kemudian mentransfer data tersebut ke server database atau ke komputer kita maka kita harus membuat program untuk pengirimannya (ini masalah karena berarti dua kali kerja

Pada tutorial ini saya akan mengajak Anda mencoba skema akses database di server menggunakan J2ME

Dalam tutorial ini kita akan mempelajari rancang bangun aplikasi client-server dengan menggunakan beberapa teknologi yaitu PHP MySQL dan J2ME Di sini kita akan belajar melakukan koneksi PHP ke database MySQL membuat fungsi dan menangani HTTP Request

Aplikasi

Modul server

PHP

Koneksi database Fungsi HTTP

Request

MySQL

Modul client

J2ME

Koneksi HTTP Thread Interface

GET Sedangkan untuk sisi client kita akan mempelajari bagaimana melakukan koneksi jaringan dengan protocol HTTP bagaimana membuat aplikasi bisa berjalan secara threading dan bagaimana menggunakan interface

Seperti yang Anda lihat dalam tutorial ini beberapa software lain saya butuhkan Begitu juga Anda jika ingin mencoba menerapkan isi tutorial ini Anda harus melakukan beberapa persiapan Untuk melakukannya saya perlu melakukan persiapan terlebih dahulu Justru ini yang sedang saya lakukan (sampe begadang-begadang padahal keesokan paginya harus meeting dari pagi sampai sore hiks) Berikut ini yang perlu saya persiapkan

1 IDE (Integrated Development Environment untuk coding J2ME dan PHP) Dalam tutorial ini saya menggunakan dua software IDE Netbeans 65 dan Easy Eclipse for PHP 122

bull Netbeans 65 Netbeans adalah IDE yang sangat populer untuk Java Netbeans memiliki beberapa pilihan paket untuk didownload Dalam tutorial ini Anda membutuhkan Netbeans 65 Mobility (atau Anda juga bisa menggunakan Netbeans 65 Full tapi saya tidak menyarankannya karena Anda harus download lebih besar dan karena dalam paket ini termasuk server aplikasi Glassfish yang kalau tidak dimatikan bisa membuat beban komputer Anda menjadi besar)

bull Easy Eclipse for PHP 122 Jangan heran jika saya menyarankan Anda menggunakan Easy Eclipse for PHP Apa hubungannya PHP dengan tutorial J2ME Kok OOT (out of topic) sih Akan saya jelaskan Kita akan membangun software client-server Tentu kita membutuhkan server aplikasi (aplikasi client akan kita buat menggunakan J2ME) Untuk membangun server kita harus menentukan teknologi apa yang akan kita gunakan termasuk protokolnya Aplikasi client-server pada masa lalu (hingga kini pun masih) menggunakan socket programming dan ptotokol proprietary murni (protokol yang khusus digunakan untuk software yang dibangun) Ada pendekatan lain yaitu menggunakan Web Service Dengan web service aplikasi client akan terhubung ke server hanya dengan protocol HTTP Ini mereduksi waktu yang dibutuhkan untuk membangun protocol Kelebihan yang lain adalah bahwa karena berjalan di atas HTTP maka kemungkinan koneksi ini ditutup oleh firewall operator (ingat kita membangun aplikasi client-server yang berjalan di atas J2ME yang berarti pula kita akan menggunakan jaringan internet melalui operator ponsel) Contoh implementasi Web Service adalah SOAP Atau ada juga pendekatan yang lebih simple yaitu XML-RPC yang mengijinkan client memanggil fungsi di server kemudian mendapatkan output dari fungsi tersebut

Mana yang akan kita gunakan Karena tutorial ini ditujukan untuk pemula dan intermediate (bukan expert) maka kita akan mencoba membuat sesuatu yang mirip dengan Web Service hanya saja jauh lebih sederhana Kita akan membuat aturan main sederhana yang melibatkan J2ME sebagai client dan web server Saya memilih PHP untuk digunakan sebagai server kita Kenapa tidak Java (Servlet atau JSP) Alasannya mudah saja saya tidak menemukan layanan hosting yang menyediakan Java hampir semua layanan hosting yang saya temui menggunakan PHP Maka saya menggunakan PHP untuk menghilangkan resiko nantinya scenario ini tidak jalan hanya karena tidak ada server yang bisa mengimplementasikan server side script saya Lalu mengapa hosting Jawabannya mudah Saya tidak punya server sendiri yang bisa diakses dari internet Ya perlu hosting kan Karena dengan ponsel nantinya kita tidak bisa menggunakan localhost Localhost hanya berjalan di emulator Kita juga tidak bisa menggunakan IP local dalam satu network (misalnya kita bekerja di LAN) karena belum banyak ponsel yang mendukung WiFi selain juga area penggunaannya jadi sangat terbata di luar scope kasus kita yang akan menggunakan aplikasi ini di lokasi pelanggan

2 Database server (MySQL) Saya suka MySQL Alasannya sama dengan pengguna MySQL lain gratis cepat dan mudah dipelajari (terutama jika dikaitkan dengan program yang akan saya gunakan untuk mengaksesnya PHP) Kita akan menggunakan MySQL untuk menyimpan data pelanggan yang nantinya akan diakses oleh aplikasi J2ME yang kita buat

3 Server side scripting (PHP) Sebelumnya pada item pertama (Easy Eclipse for PHP 122) saya sudah jelaskan sedikit tentang apa yang akan kita buat dan latar belakang digunakannya PHP PHP umumnya digunakan di atas web server dari Apache (tidak menutup kemungkinan digunakan web server lain) Untuk implementasi kita saya menyarankan

bull Pengguna Windows menggunakan Xampp Anda dapat menggunakan paket Xampp yang di dalamnya sudah tercakup Apache MySQL dan PHP Download saja Bayar gak Tentu saja free open source

bull Pengguna Linux menginstall paket Apache MySQL dan PHP Beberapa distro Linux sudah menyediakan repository dalam bentuk DVD Saya sendiri sebagai pengguna Ubuntu menggunakan repository yang disupport oleh salah satu server ternama Kambing Tentang kambing tidak akan dijelaskan lebih lanjut intinya Kambing adalah server penyedia software-software open source Untuk pengguna Ubuntu silakan tiru saja perintah ini

$ sudo apt-get install apache2 php5-mysql libapache2-mod-php5 mysql-server Perintah ini saya gunakan dengan Ubuntu 904 dan nampaknya juga kompatibel dengan versi-versi yang lain Perintah tersebut digunakan untuk mendownload langsung Apache2 MySQL dan PHP5 sekaligus menginstallnya di sistem kita

4 Sebuah mekanisme remote procedure call atau fungsi di server yang bisa dipanggil dari

client Untuk memudahkan penyebutkan konsep ini saya sebut saja sebagai remote procedure call Yang kita lakukan melalui remote procedure ini adalah insert update dan delete

Menggunakan Netbeans 65 Mobility Membuat project J2ME dengan Netbeans Menu File | New Project | J2ME Project

Yang perlu Anda lakukan untuk membuat project J2ME baru adalah mengklik File | New Project kemudian dari dialog yang muncul pilih J2ME Project

Berikan nama yang baik dan seterusnya Secara default Anda akan mendapatkan file Mainjava yang berupa Visual Midlet (buat jika tidak ada) Dengan Visual Midlet Anda bisa membuat flow aplikasi J2ME dengan cara drag and drop

Menentukan flow aplikasi Menu View | Editors | Flow

Netbeans Mobility dilengkapi dengan Flow Editor untuk mengedit urutan jalannya aplikasi J2Me nantinya Agar lebih mudah perhatikan ketika kita menambahkan sebuah Form

Untuk menambahkan sebuah Form klik kanan pada Flow View pilih NewAdd | Form Drag sebuah flow dari Mobile Device (Midlet) ke form atau apapun nama yang Anda berikan untuk Form yang baru Anda tambahkan (defaultnya form) Jika Anda tidak terbiasa dengan istilah drag lakukan sebagai berikut

bull Klik kiri pada Mobile Device bull Tahan kemudian seret mouse hingga menyentuh form bull Lepaskan klik

Akan terbentuk sebuah garis dan tanda panah dari arah Mobile Device ke form yang baru Anda buat

Klik kanan pada title bar form kemudian NewAdd | Ok Command dan command-command lain yang Anda butuhkan

Sekarang Anda sudah tahu bagaimana membuat flow dari Mobile Device ke form Sekarang buatlah flow dari form ke Mobile Device Mudah bukan

Jika sudah berarti saat ini jika program dijalankan maka yang akan muncul adalah tampilan form Sayang Anda belum member komponen apapun di atas form

Menambahkan komponen ke atas form Menu Klik kanan | NewAdd | Text Field dll atau

View | Editors | Screen

Berikutnya klik title bar form kemudian klik Screen View (persis di bagian atas diagram) Di bawah tab-tab nama file Akan ditampilkan bentuk ponsel yang bisa Anda tambahkan komponen-komponen dan tombol Komponen-komponen tersebut bisa Anda lihat pada window Pallete (sebelah kanan) Atau Anda bisa juga menambahkan komponen ke atas suatu form dengan cara meng-klik kanan form-nya kemudian memilih NewAdd | ltkomponen-yang-Anda-ingin-tambahkangt

Nah Anda sudah bisa menambahkan komponen yang Anda perlukan Coba tambahkan lima buah TextField dan tiga buah Command hingga hasilnya seperti gambar di atas Mudah bukan

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 2: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Pada satu siang seorang teman menelpon dari Surabaya menanyakan realisasi janji saya beberapa waktu sebelumnya Pada waktu itu saya menjanjikan akan memberikan semacam tutorial tentang bagaimana mengakses (menambah mengubah dan menghapus) data di server dengan Java Micro Edition

Latar belakangnya begini rekan saya tersebut Pak Sugeng (sebut saja begitu) ingin membuat aplikasi ponsel yang bisa digunakan untuk menampilkan data-data pelanggan kemudian mengeditnya sembari di lokasi pelanggan hingga menyimpannya kembal Yang menjadi masalah adalah fasilitas penyimpanan data di ponsel sangat terbatas Saat ini teknologi yang bisa digunakan di ponsel adalah RMS Namun RMS memiliki banyak kekurangan jika dibandingkan dengan tujuan ini

1 RMS bukanlah database relational yang mengijinkan kita melakukan query SQL RMS jika boleh saya gambarkan lebih mirip dengan database masa lampau yang hanya dapat diakses per record dengan menyebutkan id-nya

2 Masalah yang lain adalah bahwa data yang disimpan di dalam RMS hanya tersimpan di ponsel Jika kita ingin kemudian mentransfer data tersebut ke server database atau ke komputer kita maka kita harus membuat program untuk pengirimannya (ini masalah karena berarti dua kali kerja

Pada tutorial ini saya akan mengajak Anda mencoba skema akses database di server menggunakan J2ME

Dalam tutorial ini kita akan mempelajari rancang bangun aplikasi client-server dengan menggunakan beberapa teknologi yaitu PHP MySQL dan J2ME Di sini kita akan belajar melakukan koneksi PHP ke database MySQL membuat fungsi dan menangani HTTP Request

Aplikasi

Modul server

PHP

Koneksi database Fungsi HTTP

Request

MySQL

Modul client

J2ME

Koneksi HTTP Thread Interface

GET Sedangkan untuk sisi client kita akan mempelajari bagaimana melakukan koneksi jaringan dengan protocol HTTP bagaimana membuat aplikasi bisa berjalan secara threading dan bagaimana menggunakan interface

Seperti yang Anda lihat dalam tutorial ini beberapa software lain saya butuhkan Begitu juga Anda jika ingin mencoba menerapkan isi tutorial ini Anda harus melakukan beberapa persiapan Untuk melakukannya saya perlu melakukan persiapan terlebih dahulu Justru ini yang sedang saya lakukan (sampe begadang-begadang padahal keesokan paginya harus meeting dari pagi sampai sore hiks) Berikut ini yang perlu saya persiapkan

1 IDE (Integrated Development Environment untuk coding J2ME dan PHP) Dalam tutorial ini saya menggunakan dua software IDE Netbeans 65 dan Easy Eclipse for PHP 122

bull Netbeans 65 Netbeans adalah IDE yang sangat populer untuk Java Netbeans memiliki beberapa pilihan paket untuk didownload Dalam tutorial ini Anda membutuhkan Netbeans 65 Mobility (atau Anda juga bisa menggunakan Netbeans 65 Full tapi saya tidak menyarankannya karena Anda harus download lebih besar dan karena dalam paket ini termasuk server aplikasi Glassfish yang kalau tidak dimatikan bisa membuat beban komputer Anda menjadi besar)

bull Easy Eclipse for PHP 122 Jangan heran jika saya menyarankan Anda menggunakan Easy Eclipse for PHP Apa hubungannya PHP dengan tutorial J2ME Kok OOT (out of topic) sih Akan saya jelaskan Kita akan membangun software client-server Tentu kita membutuhkan server aplikasi (aplikasi client akan kita buat menggunakan J2ME) Untuk membangun server kita harus menentukan teknologi apa yang akan kita gunakan termasuk protokolnya Aplikasi client-server pada masa lalu (hingga kini pun masih) menggunakan socket programming dan ptotokol proprietary murni (protokol yang khusus digunakan untuk software yang dibangun) Ada pendekatan lain yaitu menggunakan Web Service Dengan web service aplikasi client akan terhubung ke server hanya dengan protocol HTTP Ini mereduksi waktu yang dibutuhkan untuk membangun protocol Kelebihan yang lain adalah bahwa karena berjalan di atas HTTP maka kemungkinan koneksi ini ditutup oleh firewall operator (ingat kita membangun aplikasi client-server yang berjalan di atas J2ME yang berarti pula kita akan menggunakan jaringan internet melalui operator ponsel) Contoh implementasi Web Service adalah SOAP Atau ada juga pendekatan yang lebih simple yaitu XML-RPC yang mengijinkan client memanggil fungsi di server kemudian mendapatkan output dari fungsi tersebut

Mana yang akan kita gunakan Karena tutorial ini ditujukan untuk pemula dan intermediate (bukan expert) maka kita akan mencoba membuat sesuatu yang mirip dengan Web Service hanya saja jauh lebih sederhana Kita akan membuat aturan main sederhana yang melibatkan J2ME sebagai client dan web server Saya memilih PHP untuk digunakan sebagai server kita Kenapa tidak Java (Servlet atau JSP) Alasannya mudah saja saya tidak menemukan layanan hosting yang menyediakan Java hampir semua layanan hosting yang saya temui menggunakan PHP Maka saya menggunakan PHP untuk menghilangkan resiko nantinya scenario ini tidak jalan hanya karena tidak ada server yang bisa mengimplementasikan server side script saya Lalu mengapa hosting Jawabannya mudah Saya tidak punya server sendiri yang bisa diakses dari internet Ya perlu hosting kan Karena dengan ponsel nantinya kita tidak bisa menggunakan localhost Localhost hanya berjalan di emulator Kita juga tidak bisa menggunakan IP local dalam satu network (misalnya kita bekerja di LAN) karena belum banyak ponsel yang mendukung WiFi selain juga area penggunaannya jadi sangat terbata di luar scope kasus kita yang akan menggunakan aplikasi ini di lokasi pelanggan

2 Database server (MySQL) Saya suka MySQL Alasannya sama dengan pengguna MySQL lain gratis cepat dan mudah dipelajari (terutama jika dikaitkan dengan program yang akan saya gunakan untuk mengaksesnya PHP) Kita akan menggunakan MySQL untuk menyimpan data pelanggan yang nantinya akan diakses oleh aplikasi J2ME yang kita buat

3 Server side scripting (PHP) Sebelumnya pada item pertama (Easy Eclipse for PHP 122) saya sudah jelaskan sedikit tentang apa yang akan kita buat dan latar belakang digunakannya PHP PHP umumnya digunakan di atas web server dari Apache (tidak menutup kemungkinan digunakan web server lain) Untuk implementasi kita saya menyarankan

bull Pengguna Windows menggunakan Xampp Anda dapat menggunakan paket Xampp yang di dalamnya sudah tercakup Apache MySQL dan PHP Download saja Bayar gak Tentu saja free open source

bull Pengguna Linux menginstall paket Apache MySQL dan PHP Beberapa distro Linux sudah menyediakan repository dalam bentuk DVD Saya sendiri sebagai pengguna Ubuntu menggunakan repository yang disupport oleh salah satu server ternama Kambing Tentang kambing tidak akan dijelaskan lebih lanjut intinya Kambing adalah server penyedia software-software open source Untuk pengguna Ubuntu silakan tiru saja perintah ini

$ sudo apt-get install apache2 php5-mysql libapache2-mod-php5 mysql-server Perintah ini saya gunakan dengan Ubuntu 904 dan nampaknya juga kompatibel dengan versi-versi yang lain Perintah tersebut digunakan untuk mendownload langsung Apache2 MySQL dan PHP5 sekaligus menginstallnya di sistem kita

4 Sebuah mekanisme remote procedure call atau fungsi di server yang bisa dipanggil dari

client Untuk memudahkan penyebutkan konsep ini saya sebut saja sebagai remote procedure call Yang kita lakukan melalui remote procedure ini adalah insert update dan delete

Menggunakan Netbeans 65 Mobility Membuat project J2ME dengan Netbeans Menu File | New Project | J2ME Project

Yang perlu Anda lakukan untuk membuat project J2ME baru adalah mengklik File | New Project kemudian dari dialog yang muncul pilih J2ME Project

Berikan nama yang baik dan seterusnya Secara default Anda akan mendapatkan file Mainjava yang berupa Visual Midlet (buat jika tidak ada) Dengan Visual Midlet Anda bisa membuat flow aplikasi J2ME dengan cara drag and drop

Menentukan flow aplikasi Menu View | Editors | Flow

Netbeans Mobility dilengkapi dengan Flow Editor untuk mengedit urutan jalannya aplikasi J2Me nantinya Agar lebih mudah perhatikan ketika kita menambahkan sebuah Form

Untuk menambahkan sebuah Form klik kanan pada Flow View pilih NewAdd | Form Drag sebuah flow dari Mobile Device (Midlet) ke form atau apapun nama yang Anda berikan untuk Form yang baru Anda tambahkan (defaultnya form) Jika Anda tidak terbiasa dengan istilah drag lakukan sebagai berikut

bull Klik kiri pada Mobile Device bull Tahan kemudian seret mouse hingga menyentuh form bull Lepaskan klik

Akan terbentuk sebuah garis dan tanda panah dari arah Mobile Device ke form yang baru Anda buat

Klik kanan pada title bar form kemudian NewAdd | Ok Command dan command-command lain yang Anda butuhkan

Sekarang Anda sudah tahu bagaimana membuat flow dari Mobile Device ke form Sekarang buatlah flow dari form ke Mobile Device Mudah bukan

Jika sudah berarti saat ini jika program dijalankan maka yang akan muncul adalah tampilan form Sayang Anda belum member komponen apapun di atas form

Menambahkan komponen ke atas form Menu Klik kanan | NewAdd | Text Field dll atau

View | Editors | Screen

Berikutnya klik title bar form kemudian klik Screen View (persis di bagian atas diagram) Di bawah tab-tab nama file Akan ditampilkan bentuk ponsel yang bisa Anda tambahkan komponen-komponen dan tombol Komponen-komponen tersebut bisa Anda lihat pada window Pallete (sebelah kanan) Atau Anda bisa juga menambahkan komponen ke atas suatu form dengan cara meng-klik kanan form-nya kemudian memilih NewAdd | ltkomponen-yang-Anda-ingin-tambahkangt

Nah Anda sudah bisa menambahkan komponen yang Anda perlukan Coba tambahkan lima buah TextField dan tiga buah Command hingga hasilnya seperti gambar di atas Mudah bukan

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 3: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

GET Sedangkan untuk sisi client kita akan mempelajari bagaimana melakukan koneksi jaringan dengan protocol HTTP bagaimana membuat aplikasi bisa berjalan secara threading dan bagaimana menggunakan interface

Seperti yang Anda lihat dalam tutorial ini beberapa software lain saya butuhkan Begitu juga Anda jika ingin mencoba menerapkan isi tutorial ini Anda harus melakukan beberapa persiapan Untuk melakukannya saya perlu melakukan persiapan terlebih dahulu Justru ini yang sedang saya lakukan (sampe begadang-begadang padahal keesokan paginya harus meeting dari pagi sampai sore hiks) Berikut ini yang perlu saya persiapkan

1 IDE (Integrated Development Environment untuk coding J2ME dan PHP) Dalam tutorial ini saya menggunakan dua software IDE Netbeans 65 dan Easy Eclipse for PHP 122

bull Netbeans 65 Netbeans adalah IDE yang sangat populer untuk Java Netbeans memiliki beberapa pilihan paket untuk didownload Dalam tutorial ini Anda membutuhkan Netbeans 65 Mobility (atau Anda juga bisa menggunakan Netbeans 65 Full tapi saya tidak menyarankannya karena Anda harus download lebih besar dan karena dalam paket ini termasuk server aplikasi Glassfish yang kalau tidak dimatikan bisa membuat beban komputer Anda menjadi besar)

bull Easy Eclipse for PHP 122 Jangan heran jika saya menyarankan Anda menggunakan Easy Eclipse for PHP Apa hubungannya PHP dengan tutorial J2ME Kok OOT (out of topic) sih Akan saya jelaskan Kita akan membangun software client-server Tentu kita membutuhkan server aplikasi (aplikasi client akan kita buat menggunakan J2ME) Untuk membangun server kita harus menentukan teknologi apa yang akan kita gunakan termasuk protokolnya Aplikasi client-server pada masa lalu (hingga kini pun masih) menggunakan socket programming dan ptotokol proprietary murni (protokol yang khusus digunakan untuk software yang dibangun) Ada pendekatan lain yaitu menggunakan Web Service Dengan web service aplikasi client akan terhubung ke server hanya dengan protocol HTTP Ini mereduksi waktu yang dibutuhkan untuk membangun protocol Kelebihan yang lain adalah bahwa karena berjalan di atas HTTP maka kemungkinan koneksi ini ditutup oleh firewall operator (ingat kita membangun aplikasi client-server yang berjalan di atas J2ME yang berarti pula kita akan menggunakan jaringan internet melalui operator ponsel) Contoh implementasi Web Service adalah SOAP Atau ada juga pendekatan yang lebih simple yaitu XML-RPC yang mengijinkan client memanggil fungsi di server kemudian mendapatkan output dari fungsi tersebut

Mana yang akan kita gunakan Karena tutorial ini ditujukan untuk pemula dan intermediate (bukan expert) maka kita akan mencoba membuat sesuatu yang mirip dengan Web Service hanya saja jauh lebih sederhana Kita akan membuat aturan main sederhana yang melibatkan J2ME sebagai client dan web server Saya memilih PHP untuk digunakan sebagai server kita Kenapa tidak Java (Servlet atau JSP) Alasannya mudah saja saya tidak menemukan layanan hosting yang menyediakan Java hampir semua layanan hosting yang saya temui menggunakan PHP Maka saya menggunakan PHP untuk menghilangkan resiko nantinya scenario ini tidak jalan hanya karena tidak ada server yang bisa mengimplementasikan server side script saya Lalu mengapa hosting Jawabannya mudah Saya tidak punya server sendiri yang bisa diakses dari internet Ya perlu hosting kan Karena dengan ponsel nantinya kita tidak bisa menggunakan localhost Localhost hanya berjalan di emulator Kita juga tidak bisa menggunakan IP local dalam satu network (misalnya kita bekerja di LAN) karena belum banyak ponsel yang mendukung WiFi selain juga area penggunaannya jadi sangat terbata di luar scope kasus kita yang akan menggunakan aplikasi ini di lokasi pelanggan

2 Database server (MySQL) Saya suka MySQL Alasannya sama dengan pengguna MySQL lain gratis cepat dan mudah dipelajari (terutama jika dikaitkan dengan program yang akan saya gunakan untuk mengaksesnya PHP) Kita akan menggunakan MySQL untuk menyimpan data pelanggan yang nantinya akan diakses oleh aplikasi J2ME yang kita buat

3 Server side scripting (PHP) Sebelumnya pada item pertama (Easy Eclipse for PHP 122) saya sudah jelaskan sedikit tentang apa yang akan kita buat dan latar belakang digunakannya PHP PHP umumnya digunakan di atas web server dari Apache (tidak menutup kemungkinan digunakan web server lain) Untuk implementasi kita saya menyarankan

bull Pengguna Windows menggunakan Xampp Anda dapat menggunakan paket Xampp yang di dalamnya sudah tercakup Apache MySQL dan PHP Download saja Bayar gak Tentu saja free open source

bull Pengguna Linux menginstall paket Apache MySQL dan PHP Beberapa distro Linux sudah menyediakan repository dalam bentuk DVD Saya sendiri sebagai pengguna Ubuntu menggunakan repository yang disupport oleh salah satu server ternama Kambing Tentang kambing tidak akan dijelaskan lebih lanjut intinya Kambing adalah server penyedia software-software open source Untuk pengguna Ubuntu silakan tiru saja perintah ini

$ sudo apt-get install apache2 php5-mysql libapache2-mod-php5 mysql-server Perintah ini saya gunakan dengan Ubuntu 904 dan nampaknya juga kompatibel dengan versi-versi yang lain Perintah tersebut digunakan untuk mendownload langsung Apache2 MySQL dan PHP5 sekaligus menginstallnya di sistem kita

4 Sebuah mekanisme remote procedure call atau fungsi di server yang bisa dipanggil dari

client Untuk memudahkan penyebutkan konsep ini saya sebut saja sebagai remote procedure call Yang kita lakukan melalui remote procedure ini adalah insert update dan delete

Menggunakan Netbeans 65 Mobility Membuat project J2ME dengan Netbeans Menu File | New Project | J2ME Project

Yang perlu Anda lakukan untuk membuat project J2ME baru adalah mengklik File | New Project kemudian dari dialog yang muncul pilih J2ME Project

Berikan nama yang baik dan seterusnya Secara default Anda akan mendapatkan file Mainjava yang berupa Visual Midlet (buat jika tidak ada) Dengan Visual Midlet Anda bisa membuat flow aplikasi J2ME dengan cara drag and drop

Menentukan flow aplikasi Menu View | Editors | Flow

Netbeans Mobility dilengkapi dengan Flow Editor untuk mengedit urutan jalannya aplikasi J2Me nantinya Agar lebih mudah perhatikan ketika kita menambahkan sebuah Form

Untuk menambahkan sebuah Form klik kanan pada Flow View pilih NewAdd | Form Drag sebuah flow dari Mobile Device (Midlet) ke form atau apapun nama yang Anda berikan untuk Form yang baru Anda tambahkan (defaultnya form) Jika Anda tidak terbiasa dengan istilah drag lakukan sebagai berikut

bull Klik kiri pada Mobile Device bull Tahan kemudian seret mouse hingga menyentuh form bull Lepaskan klik

Akan terbentuk sebuah garis dan tanda panah dari arah Mobile Device ke form yang baru Anda buat

Klik kanan pada title bar form kemudian NewAdd | Ok Command dan command-command lain yang Anda butuhkan

Sekarang Anda sudah tahu bagaimana membuat flow dari Mobile Device ke form Sekarang buatlah flow dari form ke Mobile Device Mudah bukan

Jika sudah berarti saat ini jika program dijalankan maka yang akan muncul adalah tampilan form Sayang Anda belum member komponen apapun di atas form

Menambahkan komponen ke atas form Menu Klik kanan | NewAdd | Text Field dll atau

View | Editors | Screen

Berikutnya klik title bar form kemudian klik Screen View (persis di bagian atas diagram) Di bawah tab-tab nama file Akan ditampilkan bentuk ponsel yang bisa Anda tambahkan komponen-komponen dan tombol Komponen-komponen tersebut bisa Anda lihat pada window Pallete (sebelah kanan) Atau Anda bisa juga menambahkan komponen ke atas suatu form dengan cara meng-klik kanan form-nya kemudian memilih NewAdd | ltkomponen-yang-Anda-ingin-tambahkangt

Nah Anda sudah bisa menambahkan komponen yang Anda perlukan Coba tambahkan lima buah TextField dan tiga buah Command hingga hasilnya seperti gambar di atas Mudah bukan

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 4: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Mana yang akan kita gunakan Karena tutorial ini ditujukan untuk pemula dan intermediate (bukan expert) maka kita akan mencoba membuat sesuatu yang mirip dengan Web Service hanya saja jauh lebih sederhana Kita akan membuat aturan main sederhana yang melibatkan J2ME sebagai client dan web server Saya memilih PHP untuk digunakan sebagai server kita Kenapa tidak Java (Servlet atau JSP) Alasannya mudah saja saya tidak menemukan layanan hosting yang menyediakan Java hampir semua layanan hosting yang saya temui menggunakan PHP Maka saya menggunakan PHP untuk menghilangkan resiko nantinya scenario ini tidak jalan hanya karena tidak ada server yang bisa mengimplementasikan server side script saya Lalu mengapa hosting Jawabannya mudah Saya tidak punya server sendiri yang bisa diakses dari internet Ya perlu hosting kan Karena dengan ponsel nantinya kita tidak bisa menggunakan localhost Localhost hanya berjalan di emulator Kita juga tidak bisa menggunakan IP local dalam satu network (misalnya kita bekerja di LAN) karena belum banyak ponsel yang mendukung WiFi selain juga area penggunaannya jadi sangat terbata di luar scope kasus kita yang akan menggunakan aplikasi ini di lokasi pelanggan

2 Database server (MySQL) Saya suka MySQL Alasannya sama dengan pengguna MySQL lain gratis cepat dan mudah dipelajari (terutama jika dikaitkan dengan program yang akan saya gunakan untuk mengaksesnya PHP) Kita akan menggunakan MySQL untuk menyimpan data pelanggan yang nantinya akan diakses oleh aplikasi J2ME yang kita buat

3 Server side scripting (PHP) Sebelumnya pada item pertama (Easy Eclipse for PHP 122) saya sudah jelaskan sedikit tentang apa yang akan kita buat dan latar belakang digunakannya PHP PHP umumnya digunakan di atas web server dari Apache (tidak menutup kemungkinan digunakan web server lain) Untuk implementasi kita saya menyarankan

bull Pengguna Windows menggunakan Xampp Anda dapat menggunakan paket Xampp yang di dalamnya sudah tercakup Apache MySQL dan PHP Download saja Bayar gak Tentu saja free open source

bull Pengguna Linux menginstall paket Apache MySQL dan PHP Beberapa distro Linux sudah menyediakan repository dalam bentuk DVD Saya sendiri sebagai pengguna Ubuntu menggunakan repository yang disupport oleh salah satu server ternama Kambing Tentang kambing tidak akan dijelaskan lebih lanjut intinya Kambing adalah server penyedia software-software open source Untuk pengguna Ubuntu silakan tiru saja perintah ini

$ sudo apt-get install apache2 php5-mysql libapache2-mod-php5 mysql-server Perintah ini saya gunakan dengan Ubuntu 904 dan nampaknya juga kompatibel dengan versi-versi yang lain Perintah tersebut digunakan untuk mendownload langsung Apache2 MySQL dan PHP5 sekaligus menginstallnya di sistem kita

4 Sebuah mekanisme remote procedure call atau fungsi di server yang bisa dipanggil dari

client Untuk memudahkan penyebutkan konsep ini saya sebut saja sebagai remote procedure call Yang kita lakukan melalui remote procedure ini adalah insert update dan delete

Menggunakan Netbeans 65 Mobility Membuat project J2ME dengan Netbeans Menu File | New Project | J2ME Project

Yang perlu Anda lakukan untuk membuat project J2ME baru adalah mengklik File | New Project kemudian dari dialog yang muncul pilih J2ME Project

Berikan nama yang baik dan seterusnya Secara default Anda akan mendapatkan file Mainjava yang berupa Visual Midlet (buat jika tidak ada) Dengan Visual Midlet Anda bisa membuat flow aplikasi J2ME dengan cara drag and drop

Menentukan flow aplikasi Menu View | Editors | Flow

Netbeans Mobility dilengkapi dengan Flow Editor untuk mengedit urutan jalannya aplikasi J2Me nantinya Agar lebih mudah perhatikan ketika kita menambahkan sebuah Form

Untuk menambahkan sebuah Form klik kanan pada Flow View pilih NewAdd | Form Drag sebuah flow dari Mobile Device (Midlet) ke form atau apapun nama yang Anda berikan untuk Form yang baru Anda tambahkan (defaultnya form) Jika Anda tidak terbiasa dengan istilah drag lakukan sebagai berikut

bull Klik kiri pada Mobile Device bull Tahan kemudian seret mouse hingga menyentuh form bull Lepaskan klik

Akan terbentuk sebuah garis dan tanda panah dari arah Mobile Device ke form yang baru Anda buat

Klik kanan pada title bar form kemudian NewAdd | Ok Command dan command-command lain yang Anda butuhkan

Sekarang Anda sudah tahu bagaimana membuat flow dari Mobile Device ke form Sekarang buatlah flow dari form ke Mobile Device Mudah bukan

Jika sudah berarti saat ini jika program dijalankan maka yang akan muncul adalah tampilan form Sayang Anda belum member komponen apapun di atas form

Menambahkan komponen ke atas form Menu Klik kanan | NewAdd | Text Field dll atau

View | Editors | Screen

Berikutnya klik title bar form kemudian klik Screen View (persis di bagian atas diagram) Di bawah tab-tab nama file Akan ditampilkan bentuk ponsel yang bisa Anda tambahkan komponen-komponen dan tombol Komponen-komponen tersebut bisa Anda lihat pada window Pallete (sebelah kanan) Atau Anda bisa juga menambahkan komponen ke atas suatu form dengan cara meng-klik kanan form-nya kemudian memilih NewAdd | ltkomponen-yang-Anda-ingin-tambahkangt

Nah Anda sudah bisa menambahkan komponen yang Anda perlukan Coba tambahkan lima buah TextField dan tiga buah Command hingga hasilnya seperti gambar di atas Mudah bukan

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 5: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

$ sudo apt-get install apache2 php5-mysql libapache2-mod-php5 mysql-server Perintah ini saya gunakan dengan Ubuntu 904 dan nampaknya juga kompatibel dengan versi-versi yang lain Perintah tersebut digunakan untuk mendownload langsung Apache2 MySQL dan PHP5 sekaligus menginstallnya di sistem kita

4 Sebuah mekanisme remote procedure call atau fungsi di server yang bisa dipanggil dari

client Untuk memudahkan penyebutkan konsep ini saya sebut saja sebagai remote procedure call Yang kita lakukan melalui remote procedure ini adalah insert update dan delete

Menggunakan Netbeans 65 Mobility Membuat project J2ME dengan Netbeans Menu File | New Project | J2ME Project

Yang perlu Anda lakukan untuk membuat project J2ME baru adalah mengklik File | New Project kemudian dari dialog yang muncul pilih J2ME Project

Berikan nama yang baik dan seterusnya Secara default Anda akan mendapatkan file Mainjava yang berupa Visual Midlet (buat jika tidak ada) Dengan Visual Midlet Anda bisa membuat flow aplikasi J2ME dengan cara drag and drop

Menentukan flow aplikasi Menu View | Editors | Flow

Netbeans Mobility dilengkapi dengan Flow Editor untuk mengedit urutan jalannya aplikasi J2Me nantinya Agar lebih mudah perhatikan ketika kita menambahkan sebuah Form

Untuk menambahkan sebuah Form klik kanan pada Flow View pilih NewAdd | Form Drag sebuah flow dari Mobile Device (Midlet) ke form atau apapun nama yang Anda berikan untuk Form yang baru Anda tambahkan (defaultnya form) Jika Anda tidak terbiasa dengan istilah drag lakukan sebagai berikut

bull Klik kiri pada Mobile Device bull Tahan kemudian seret mouse hingga menyentuh form bull Lepaskan klik

Akan terbentuk sebuah garis dan tanda panah dari arah Mobile Device ke form yang baru Anda buat

Klik kanan pada title bar form kemudian NewAdd | Ok Command dan command-command lain yang Anda butuhkan

Sekarang Anda sudah tahu bagaimana membuat flow dari Mobile Device ke form Sekarang buatlah flow dari form ke Mobile Device Mudah bukan

Jika sudah berarti saat ini jika program dijalankan maka yang akan muncul adalah tampilan form Sayang Anda belum member komponen apapun di atas form

Menambahkan komponen ke atas form Menu Klik kanan | NewAdd | Text Field dll atau

View | Editors | Screen

Berikutnya klik title bar form kemudian klik Screen View (persis di bagian atas diagram) Di bawah tab-tab nama file Akan ditampilkan bentuk ponsel yang bisa Anda tambahkan komponen-komponen dan tombol Komponen-komponen tersebut bisa Anda lihat pada window Pallete (sebelah kanan) Atau Anda bisa juga menambahkan komponen ke atas suatu form dengan cara meng-klik kanan form-nya kemudian memilih NewAdd | ltkomponen-yang-Anda-ingin-tambahkangt

Nah Anda sudah bisa menambahkan komponen yang Anda perlukan Coba tambahkan lima buah TextField dan tiga buah Command hingga hasilnya seperti gambar di atas Mudah bukan

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 6: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

bull Klik kiri pada Mobile Device bull Tahan kemudian seret mouse hingga menyentuh form bull Lepaskan klik

Akan terbentuk sebuah garis dan tanda panah dari arah Mobile Device ke form yang baru Anda buat

Klik kanan pada title bar form kemudian NewAdd | Ok Command dan command-command lain yang Anda butuhkan

Sekarang Anda sudah tahu bagaimana membuat flow dari Mobile Device ke form Sekarang buatlah flow dari form ke Mobile Device Mudah bukan

Jika sudah berarti saat ini jika program dijalankan maka yang akan muncul adalah tampilan form Sayang Anda belum member komponen apapun di atas form

Menambahkan komponen ke atas form Menu Klik kanan | NewAdd | Text Field dll atau

View | Editors | Screen

Berikutnya klik title bar form kemudian klik Screen View (persis di bagian atas diagram) Di bawah tab-tab nama file Akan ditampilkan bentuk ponsel yang bisa Anda tambahkan komponen-komponen dan tombol Komponen-komponen tersebut bisa Anda lihat pada window Pallete (sebelah kanan) Atau Anda bisa juga menambahkan komponen ke atas suatu form dengan cara meng-klik kanan form-nya kemudian memilih NewAdd | ltkomponen-yang-Anda-ingin-tambahkangt

Nah Anda sudah bisa menambahkan komponen yang Anda perlukan Coba tambahkan lima buah TextField dan tiga buah Command hingga hasilnya seperti gambar di atas Mudah bukan

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 7: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Berikutnya klik title bar form kemudian klik Screen View (persis di bagian atas diagram) Di bawah tab-tab nama file Akan ditampilkan bentuk ponsel yang bisa Anda tambahkan komponen-komponen dan tombol Komponen-komponen tersebut bisa Anda lihat pada window Pallete (sebelah kanan) Atau Anda bisa juga menambahkan komponen ke atas suatu form dengan cara meng-klik kanan form-nya kemudian memilih NewAdd | ltkomponen-yang-Anda-ingin-tambahkangt

Nah Anda sudah bisa menambahkan komponen yang Anda perlukan Coba tambahkan lima buah TextField dan tiga buah Command hingga hasilnya seperti gambar di atas Mudah bukan

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 8: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Menambahkan kode program pada event tertentu Menu Klik kanan pada component | Go To Source

Komponen seperti tombolCommand tidak ditambahkan hanya untuk memperindah tampilan Melainkan komponen tersebut ditambahkan karena suatu tujuan misalnya tombol Exit Command ditambahkan untuk keluar dari program sedangkan tombol Edit (dari OK Command yang diubah Text-nya menjadi ldquoEditrdquo) digunakan untuk meminta program mengedit data pengguna dengan nomor ID tertentu

Untuk keperluan tersebut maka kita perlu menambahkan event click pada komponen tersebut Caranya mudah sekali Klik pada

komponen yang ingin ditambahkan event-nya Klik kanan kemudian pilih Go To Source pada pop up menu yang muncul Berikutnya Anda akan dihadapkan pada Source Code Editor dimana Anda dipersilakan menambahkan kode program yang Anda inginkan

Menjalankan program Menu Klik kanan nama project | Run

Untuk mencoba menjalankan prototype software yang kita bangun caranya mudah sekali Klik kanan pada nama project kita di Project Naviagator window (sebelah kiri) Kemudian pada pop up menu yang muncul pilihlah Run

Setelah Anda tekan Run tunggu sebentar Netbeans akan menginisiasi Sun Wireless Toolkit yang sudah terbundle bersama Netbeans Mobility

Menggunakan Easy Eclipse for PHP 122 Easy Eclipse sebenarnya adalah pemaketan kembali Eclipse IDE project Eclipse terkenal dengan banyaknya plugins untuk berbagai keperluan Sayangnya instalasi plugins-plugins ini kadang menjadi masalah karena ada beberapa yang cukup sukar Salah satunya adalah plugins untuk coding PHP dengan Eclipse

Nah Easy Eclipse dipaket dalam bentuk yang mudah diinstall Kita bisa menambahkan plugins lain dengan cukup mendownload dari plugins directory di website Easy Eclipse kemudian mengklik dua kali file plugins tersebut layaknya file executable

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 9: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Jika Anda sudah mendownload file instalasinya Anda bisa menginstall dengan cukup mudah Pengguna Windows cukup mengklik dua kali file tersebut dari Windows Explorer kemudian mengikutinya seperti instalasi aplikasi Windows pada umumnya Sedangkan pengguna Linux bisa menggunakan Easy Eclipse versi Linux Versi Linux adalah file-file yang terkompresi saja jadi Anda cukup mengekstrak file yang Anda download Anda bisa langsung menjalankan file eclipse (file binary) dengan mengklik-nya dua kali jika di system Anda sudah terinstal Java Runtime

Beginilah tampilan welcome Easy Eclipse

Membuat project PHP baru Menu File | New | PHP Project

Pada dialog New PHP project isikan Project name bebas (buat yang sesuai dengan project yang Anda kerjakan misalnya tutorial) dan direktori yang benar pada Location Nama project akan menjadi nama direktori aplikasi web kita Dalam hal ini nantinya saya bisa browsing dengan browser saya ke alamat httplocalhostTutorial

Jika Anda menggunakan Windows silakan Browse saja ke lokasidirektori root directory Xampp (direktori ini mengandung htdocs misalnya cxampphtdocs)

Sedangkan jika Anda menggunakan Linux silakan buat direktori baru di home direktori Anda kemudian tambahkan entry virtual directory pada file konfigurasi web server httpdconf Rekomendasi dari saya (untuk pengguna Ubuntu dan Linux yang lain mungkin) lakukan dengan urutan sebagai berikut

1 Buat direktori Projects tepat di bawah home directory Anda (jika username Anda adalah pokemon maka home directory Anda adalah homepokemon) Jadi akan ada direktori baru dengan path homepokemonProjects

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 10: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

2 Edit file konfigurasi Apache (httpdconf) Tambahkan entry virtual directory 3 Isikan homepokemonProjects pada Location (di dialog New PHP project) Kemudian

klik check Use default location agar Anda tidak perlu mengulang langkah ini pada project-project berikutnya

Klik Finish

Perhatikan gambar di atas

Di bagian sebelah kiri Anda bisa melihat Project Navigation Di sana Anda bisa melihat project-project Anda Jika Anda expand sebuah project dengan mengklik tanda plus (+) di sebelah kiri nama project Anda Anda bisa mendapati semua file yang ada dalam project Anda tersebut

Bagian tengah IDE (yang berwarna abu-abu) adalah editor Kita akan mengedit file-file PHP kita di sini

Di bagian kanan pada tab Outline kita bisa melihat fungsi-fungsi yang kita buat nantinya di sana

Di bagian bawah IDE Anda bisa melihat browser untuk preview pekerjaan Anda secara realtime Jadi ketika Anda save file PHP Anda preview-nya akan muncul di bagian tersebut

Menambahkan file PHP Menu File (atau klik kanan pada nama project) | New | PHP File

Masukkan File name yang Anda inginkan (default filephp) dan biarkan lokasi Container-nya Lokasi Container ini relative terhadap workspace (yang Anda set pada Location di langkah sebelumnya)

Secara default Anda akan mendapatkan file berisi

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 11: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

ltphp Created on Jun 17 2009 To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates gt

Anda dapat mengubah default template ini melalui menu Window | Preferences | PHPeclipse | PHP | Code Templates Akan muncul dialog seperti ini

Untuk menambahkan variabel atau melakukan yang lainnya klik saja Edit

Anda bisa mulai menuli kode program Anda tepat di bawah penutup komentar ( ) Saya juga umumnya menghapus baris berikut

To change the template for this generated file go to Window - Preferences - PHPeclipse - PHP - Code Templates dari file baru tersebut meskipun tanpa mengubah template-nya

Setelah Anda melakukan beberapa perubahan pada kode sumber program Anda selalu simpan dengan menekan tombol Ctrl+S Lakukan ini secara rutin

Melihat bagaimana program Anda berjalan Jika Anda bekerja di lingkungan Windows dan Anda telah men-set lokasi workspace Anda di root directory webserver Anda (htdocs) maka tidak akan terjadi masalah karena browser internal IDE Eclipse akan langsung mengenali path Project Anda Perhatikan di bagian bawah IDE Di sana terdapat window output yang memiliki tab PHP Browser PHP Browser memiliki address bar yang jika tidak ada masalah dalam setting Anda maka nilai default-nya adalah

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 12: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

httplocalhostltproject-Andagtltfile-yang-sedang-Anda-editgt

Sekiranya ada masalah maka ada beberapa kemungkinan

1 Web server Anda mati Gejalanya tampilan pada PHP Browser akan seperti ini

Solusi masalah ini sederhana saja nyalakan web server Anda Jika Anda menggunakan Xampp (dalam Windows) nyalakan xampp-controlexe ltlokasi-instalasi-xamppgtxampp-controlexe Akan muncul tampilan seperti berikut Klik tombol Start pada Apache dan MySQL dan pastikan tampilannya seperti ini

Kata Running dalam kotak highlight berwarna hijau terang menunjukkan Apache dan MySQL berjalan dengan baik

2 Setting project Anda salah

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 13: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Gejala yang terjadi jika setting project Anda salah adalah path yang ditunjukkan oleh address bar PHP Browser salah Solusinya Anda bisa meng-klik kanan pada nama project Anda kemudian pilih Properties

Klik PHP Project Settings Pilih radio button Use workspace settings kemudian klik Configure Workspace Settings hellip Pada window Preferences yang muncul isikan httplocalhost pada Localhost dan masukkan ltlokasi-instalasi-xamppgthtdocs pada DocumentRoot Pada kasus saya isinya adalah Cxampphtdocs Klik Apply kemudian OK

Jika setting sudah OK maka setiap Anda men-save perubahan yang Anda buat maka Anda bisa melihat preview-nya di PHP Browser

Menulis modul server

Skenario Begini rencananya Nanti kita akan membangun skema database (lengkap dengan table-table-nya) di mana kita bisa melakukan fungsi-fungsi insert-read-update-delete Saya berikutnya akan buat 4 fungsi dengan script PHP dalam sebuah file saja yaitu functionphp Fungsi-fungsi tersebut antara lain insertCustomerData() readCustomerData() updateCustomerData() dan deleteCustomerData() Keempat fungsi tersebut tentunya harus melakukan fungsinya dengan baik yaitu mengacak-

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 14: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

acak database tentu saja Nah kemudian saya harus juga menyediakan suatu cara agar fungsi-fungsi tersebut bisa diakses dengan ponsel Maka saya sediakan sebuah listener dengan PHP untuk mendengarkan jika ada permintaan fungsi maka functionphp akan mengecek apakah fungsi yang diminta terdapat di sistem atau tidak Jika ya cek lagi apakah parameternya lengkap atau tidak Jika ya jalankan fungsi yang diminta kemudian berikan hasilnya kepada peminta Peminta (dalam hal ini pengirim HTTP Request) yang saya maksud adalah ponsel Nah sampai pada point ini sisi server sudah selesai Saya kemudian akan membuat fungsimethod dengan J2ME untuk memanggil keempat fungsi tersebut fungsi tersebut adalah pemetaan dari tiap fungsi server berikut parameternya Di tahap ini materi sudah berpindah kea rah pengembangan modul client Setiap method tersebut nantinya akan dikirimkan dengan format tertentu ke server menggunakan protokol HTTP Berarti juga saya harus membuat method untuk mengirimkan data apapun melalui protokol HTTP Setelahnya saya juga harus menambahkan fungsi untuk parsing data dari ponsel ini di sisi servernya (functionphp) Hasil dari server akan dikembalikan ke ponsel dalam bentuk HTTP Response dari request yang dikirim Dalam format tertentu pula Maka pada ponsel pun harus disiapkan method untuk parsing response dari server ini Terakhir saya harus membuat tampilan program di ponsel untuk simulasi program ini Ini mudah sekali dilakukan dengan Netbeans 65 yang mempunyai fitur Visual MIDlet

Membangun skema database di sisi server Sebelum bisa punya mekanisme insert-read-update-delete tentu saja saya harus membuat terlebih dahulu databasenya juga table dan field-fieldnya Begini rencananya Saya akan membuat sebuah skema database bernama tutorial dengan server database MySQL Di dalamnya saya membuat tabel datapelanggan yang memiliki field-field idpelanggan nama alamat tagihan dan catatan Sebenarnya saya ingin menggunakan tool MySQL Query Browser untuk melakukannya karena saya rasa ini tool yang cukup baik Memang untuk keperluan ini MySQL Query Browser bukanlah pilihan yang terbaik Masih ada MySQL Yog MySQL Front dan Heidi SQL Saya suka MySQL Query Browser sebab tools ini dibuat sendiri oleh si produsen MySQL wwwMySQLnet

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 15: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Namun ada sedikit masalah ketika saya menjalankan MySQL Query Browser saya tidak bisa terhubung ke database MySQL di localhost Padahal saya sudah nyalakan servicenya Hmm aneh Saya coba tool lain deh mungkin PhpMyAdmin Tapi saya harus download aplikasi ini hiks Karena saat ini saya menggunakan Ubuntu maka saya gunakan APT-GET tools untuk men-download sekaligus menginstall aplikasi APT-GET berfungsi seperti AddRemove Programs pada Windows bedanya APT-GET berjalan pada console dan mampu memperoleh paket-paket software dari internet Begini caranya $ sudo apt-get install phpmyadmin

Untuk pengguna Xampp di WIndows Anda boleh gembira karena PhpMyAdmin sudah menyediakannya untuk Anda Nah sekarang anggap saja kondisinya saya sudah punya Apache HTTPD MySQL dan PHP juga PhpMyAdmin Meskipun entah kenapa MySQL Query Browser saya masih error Tidak masalah Saya akan betulkan nanti Hal pertama yang saya lakukan adalah membuat database-nya seperti yang dibicarakan tadi

Saya membuat sebuah skema database dengan nama tutorial Kemudian saya langsung membuat table di dalamnya dengan nama datapelanggan dengan jumlah field 5 Field-field yang dibuat antara lain idpelanggan (INT) nama (VARCHAR[50]) alamat (TEXT) tagihan (INT) dan catatan (TEXT)

Tabel di atas di buat menggunakan PhpMyAdmin Nampaknya tools ini adalah tools yang paling populer untuk mengelola database MySQL Mudah-mudahan Anda sudah cukup mengenalnya Setelah saya Save skema tersebut saya akan melanjutkan dengan membuat file PHP untuk servernya

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 16: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Menulis functionphp Semoga Anda masih ingat dengan rencana saya Ya saya akan membuat sebuah script PHP dengan nama functionphp di dalam project Tutorial Karena saat ini saya memakai Linux dan installasi Apache-nya menggunakan APT Maka ini yang saya lakukan

1 Membuat direktori Tutorial dalam direktori Projects (direktori tempat saya menyimpan proyek-proyek PHP saya Jika Anda ingat sub bab yang membahas penggunaan Easy Eclipse workspace saya ada di homepokemonProjects Pokemon adalah username saya di system operasi Jadi lokasinya kurang lebih seperti ini homepokemonProjectsTutorial

2 Membuat file functionphp di dalam direktori tersebut Di dalamnya saya membuat kerangka fungsi-fungsi yang dibutuhkan dan menambahkan koneksi ke MySQL yang sederhana di awalnya dan ditutup di akhir file Dalam kerangkan ini fungsi-fungsi masih kosong begitu juga dengan bagian untuk menangani HTTP Request GET

ltphp Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka) Bagian utama untuk menerima request HTTP GET if (isset ($_GET[function])) switch ($_GET[function]) Fungsi-fungsi function listCustomerData() function insertCustomerData($nama $alamat $tagihan $catatan) function readCustomerData($idPelanggan) function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) function deleteCustomerData($idPelanggan) Menutup koneksi mysql_close($link) gt

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 17: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

3 Mengubah file konfigurasi Apache agar bisa mendeteksi projek baru saya (Anda yang

pengguna Xampp di Windows tidak perlu melakukan langkah ini) $ sudo kate etcapache2apache2conf Perintah di atas berfungsi untuk membuka Kate (text editor sederhana di Kubuntu) dengan mode admin (root) Saya tambahkan entry berikut ini Alias Tutorial homepokemonProjectsTutorial AllowOverride None Options IncludesNoExec AddOutputFilter Includes html AddHandler type-map var Order allowdeny Allow from all LanguagePriority en cs de es fr it nl sv pt-br ro ForceLanguagePriority Prefer Fallback

4 Perhatikan di atas lokasi projek saya ditulis 2 kali Langkah ini gunanya adalah agar nanti jika saya mengetikkan httplocalhostTutorialfunctionphp maka script PHP yang dijalankan adalah homepokemonProjectsTutorialfunctionphp Jangan salah ya

5 Restart server Apache saya $ sudo etcinitdapache2 restart

Sampai tahap ini functionphp sudah diakses dan jika tidak ada pesan error ketika kita buka dengan Browser maka mestinya koneksi dengan MySQL sudah benar

Functionphp saya lengkapi dengan baris program yang meminta PHP untuk menggunakan skema database tutorial

Koneksi ke database MySQL $link = mysql_connect(localhost root ) if ($link) die(Koneksi database gagal mysql_error()) mysql_select_db(tutorial) or die(Database tidak dapat dibuka)

Sampai tahapan ini kita sudah memiliki koneksi ke skema database tutorial Jika tidak berhasil misalnya skema database belum dibuat maka akan muncul pesan Database tidak dapat dibuka

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 18: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Melengkapi fungsi-fungsi utama Berikutnya saya melengkapi program kita dengan fungsi-fungsi yang sudah dijanjikan pada bagian awal yaitu untuk insert read update dan delete data dalam tabel Oh ya sebagai tambahan saya juga berikan fungsi untuk menmperlihatkan daftar lengkap pelanggan Fungsi ini (listCustomerData()) saya tambahkan terakhir tetapi saya tulis paling awal Jangan bingung ya Silakan perhatikan kode program berikut

function listCustomerData() global $link $sql = SELECT idpelanggan nama FROM datapelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result)) $data = array () while ($row = mysql_fetch_assoc($result)) $buffer = array ( id =gt $row[idpelanggan] nama =gt $row[nama] ) array_push($data $buffer) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) function insertCustomerData($nama $alamat $tagihan $catatan) global $link $sql = INSERT INTO datapelanggan (nama alamat tagihan catatan) VALUES ($nama $alamat $tagihan $catatan) $result = mysql_query($sql) return $result function readCustomerData($idPelanggan) global $link $error = 0 $data = array () $sql = SELECT idpelanggan nama alamat tagihan catatan FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) if ($result) if (mysql_num_rows($result))

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 19: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

while ($row = mysql_fetch_assoc($result)) $data = array ( id =gt $row[idpelanggan] nama =gt $row[nama] alamat =gt $row[alamat] tagihan =gt $row[tagihan] catatan =gt $row[catatan] ) else Data tidak ditemukan $error = 2 else Query SQL gagal $error = 1 $result = array ( errorcode =gt $error data =gt $data ) return $result function updateCustomerData($idPelanggan $nama $alamat $tagihan $catatan) global $link $sql = UPDATE datapelanggan SET nama=$nama alamat=$alamat tagihan=$tagihan catatan=$catatan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result function deleteCustomerData($idPelanggan) global $link $sql = DELETE FROM datapelanggan WHERE idpelanggan=$idPelanggan $result = mysql_query($sql) return $result

Menangani HTTP Request GET Hingga tahap ini kita sudah memiliki fungsi-fungsi yang dibutuhkan Tetapi kapan fungsi ini digunakan Kita perlu melengkapi program kita dengan kode berikut untuk menangani permintaan GET Mengapa permintaan GET (bukan POST) Jika Anda berpengalaman kemungkinan Anda sudah berpengalaman dengan web based programming Dalam tutorial ini sengaja saya gunakan request GET agar tutorial ini lebih mudah dipahami karena modul untuk mengirimkan request POST dengan J2ME akan sedikit lebih sulit dibuat

Tidak masalah target kita kali ini hanyalah dasarnya saja

Fungsi utama untuk menerima request HTTP GET if (isset ($_GET[function]))

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 20: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

switch ($_GET[function]) case INSERT if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 4) $result = insertCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3]) echo $result break case READ if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = readCustomerData($parameters) if ($result) echo $result[errorcode] if ($result[errorcode] == 0) echo echo $result[data][id] || $result[data][nama] || $result[data][alamat] || $result[data][tagihan] || $result[data][catatan] break case UPDATE if (isset ($_GET[parameters])) $parameters = explode(|| $_GET[parameters]) if (count($parameters) == 5) $result = updateCustomerData($parameters[0] $parameters[1] $parameters[2] $parameters[3] $parameters[4]) echo $result else echo 3 3 adalah error code parameter tidak cocok break case DELETE if (isset ($_GET[parameters])) $parameters = $_GET[parameters] $result = deleteCustomerData($parameters) echo $result

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 21: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

break Selesai sudah script PHP sebagai server aplikasi kita Apakah Anda melihat ada yang kurang Jika Anda melihatnya berarti Anda memperhatikan Tetapi saya kurang yakin Nah jika Anda menemukan kekurangannya silakan kirim email kepada saya (alamat ada di bawah judul ebook) Anda bisa mengeceknya dengan mengetikkan URL berikut ini ke address bar browser Anda

bull httplocalhostTutorialfunctionphpfunction=INSERTampparameters=Nunik20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=UPDATEampparameters=1||Nunik20Kutoarjo20Yulianingsih||Perumahan20Kurnia20Alam20Permai20Blok20E20No20920Depok||150000||Lunas

bull httplocalhostTutorialfunctionphpfunction=READampparameters=1 bull httplocalhostTutorialfunctionphpfunction=DELETEampparameters=1

URL-URL di atas berturut-turut digunakan untuk menambah mengubah membaca dan menghapus data sebuah record di tabel pelanggan dalam skema database tutorial Penasaran Silakan mencoba Di bagian berikutnya kita akan mulai membuat projek J2ME-nya

Menulis modul client Hingga saat ini semestinya kita sudah punya file PHP untuk menangani permintaan HTTP GET yang dikirim dari ponsel Kalau belum nyambung silakan baca bagian sebelumnya

Dalam artikel kali ini kita akan melakukan

1 Membuka koneksi HTTP ke server dan mengambil hasilnya 2 Mem-parsing field-field dari String sederhana yang didapat dari Server 3 Menyimpan hasil parsing ke dalam sebuah variabel instance class yang khusus dibuat

untuk satu record 4 Menampilkan nilai field-field dalam record di tampilan ponsel semuanya dengan J2ME

Yang Anda butuhkan untuk melakukannya adalah

bull Netbeans Mobility (rekomendasi versi 65) dengan tambahan modul J2ME

bull File-file PHP yang telah disiapkan sebelumnya bersama database MySQL dan web server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 22: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Membuat Graphical User Interface Tadi kita sudah bicarakan tentang bagaimana memulai project baru dengan Netbeans 65 Anda sudah bisa kan Baik saya asumsikan Anda sudah membuat project baru bernama Tutorial dan di dalamnya sudah ada Mainjava yang berupa class Visual MIDlet

Berikutnya ubah view Anda ke mode Screen Editor dengan cara klik title bar form dari Flow Editor kemudian klik Screen View (persis di bagian atas diagram) di bawah tab-tab nama file Atau Anda bisa dapat juga melakukannya dengan memilih menu View | Editors | Screen Pada Screen Editor Anda bisa menambahkan beberapa komponen Untuk contoh kita ini saya tambahkan 5

buah TextField yang masing-masing saya beri nama (variabelnya)

1 textFieldId 2 textFieldName 3 textFieldAddress 4 textFieldBillValue 5 textFieldNotes

Anda sudah paham kan bagaimana mengubah nama komponen-komponen tersebut Mudah saja Pada Screen Editor klik kanan komponen yang ingin Anda ubah namanya kemudian pilih Rename dari menu pop up yang muncul

Selanjutnya seperti pada gambar silakan tambahkan juga 2 Ok Command dan 1 Exit Command

Membuat koneksi HTTP Untuk sementara kita tinggalkan dulu Screen Editor

Untuk melakukan koneksi HTTP ke server kita membutuhkan pengetahuan tentang class dan konsep Thread class Connector dan class HttpConnection Kita perlu membuat thread baru untuk melakukan koneksi dengan HTTP agar aplikasi kita tidak blocking (terrasa seperti hang) ketika koneksi berjalan Ya Anda tahu kan melakukan koneksi jaringan kadang membutuhkan waktu tertentu

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 23: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Class Connector diperlukan untuk membuat object HttpConnection pada J2ME Begitulah ringkasnya Detilnya silakan baca terus tutorial ini

HttpThreadjava

import javaioByteArrayOutputStream

import javaioIOException

import javaioInputStream

import javaxmicroeditionioConnector

import javaxmicroeditionioHttpConnection

author Amri Shodiq

public class HttpThread implements Runnable

String command =

String[] parameters = null

ThreadListenable parent = null

String server = localhost

public HttpThread(String command String[] parameters

ThreadListenable parent)

command digunakan untuk menentukan fungsi apa yang

akan dipanggil

thiscommand = command

parameters digunakan untuk memberikan parameter fungsi tersebut

thisparameters = parameters

thisparent = parent

public void run()

HttpConnection con = null

InputStream is = null

try

pada contoh ini kebetulan yang dijalankan hanya fungsi READ

yang menggunakan 1 parameter saja

silakan ubah sendiri jika Anda ingin menjalankan fungsi lainnya

con = (HttpConnection)

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 24: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Connectoropen(http+server+Tutorialfunctionphp+

function=+command+ampparameters= + parameters[0])

consetRequestMethod(HttpConnectionGET)

consetRequestProperty(Content-Type text plain)

consetRequestProperty(Connection close)

String str =

if (congetResponseCode() == HttpConnectionHTTP_OK)

is = conopenInputStream()

int len = (int) congetLength()

if (len = -1)

byte incomingData[] = new byte[len]

isread(incomingData)

str = new String(incomingData)

hanya untuk test

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

else

ByteArrayOutputStream bytestream =

new ByteArrayOutputStream()

int ch

while ((ch = isread()) = -1)

bytestreamwrite(ch)

str = new String(bytestreamtoByteArray())

hanya untuk testing

Systemoutprintln(String + str)

kirim hasilnya ke Midlet

parentsetHttpResult(str)

bytestreamclose()

else

Systemoutprintln(Server memberi jawaban tidak OK)

catch (IOException ex)

Systemoutprintln(exgetMessage())

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 25: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Perhatikan di atas kita membuat file HttpThread khusus untuk menangani koneksi HTTP dengan Thread kemudian mengirimkan hasilnya ke MIDlet (Mainjava) untuk ditampilkan Pada kasus ini kita menggunakan Thread yang mengimplement interface Runnable (artinya nanti class ini bisa diperlakukan sebagai thread)

Perhatikan pada kode program di atas saya berikan beberapa warna lain untuk menunjukkan baris-baris yang penting

bull Merah untuk baris program yang berkaitan dengan koneksi dengan HTTP (Internet GPRS)

bull Hijau membaca response dari server

bull Biru mengembalikan hasil ke MIDlet (Mainjava) untuk selanjutnya ditampilkan

Membuat interface ThreadListenable Perhatikan pada source code di atas (HttpThreadjava) kita menggunakan class ThreadListenable untuk variabel parent Kepada parent inilah HttpThread akan mengembalikan hasil Siapakah ThreadListenable Kita akan mengimplementasikan ThreadListenable untuk Main (Visual Midlet kita) agar sebuah variabel dalam midlet tersebut dapat diupdate oleh HttpThread

Inilah source code interfacenya ThreadListenablejava

author Amri Shodiq

public interface ThreadListenable

public void setHttpResult(String someString)

Dengan mengimplementasikan Interface ini kepada Mainjava artinya kita akan membuat Mainjava harus memiliki method setHttpResult() Method ini disediakan agar HttpThread dapat mengembalikan hasil

Mengapa tidak langsung saja memasukkan class Main sebagai input parameter untuk constructor HttpThread Anda bisa saja melakukannya Tetapi penggunaan interface di sini dianjurkan untuk implementasi yang baik Jika misalnya nanti aplikasi ini terdiri atas beberapa MIDlet kita masih dapat menggunakan HttpThread yang sama untuk menangani koneksi HTTP asal MIDlet tersebut mengimplementasikan interface ThreadListenable Detilnya tidak akan dijelaskan dalam tutorial ini

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 26: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Membuat class CustomerRecord Class ini akan kita gunakan sebagai Bean untuk menyimpan record yang kita dapat dari HTTP server Kode programnya sebagai berikut Sebentar saya akan beritahukan satu rahasia untuk Anda Untuk menulis kode program di bawah ini saya hanya menulis variabel-variabelnya saja (customerId customerName dll) Method-methodnya digenerate otomatis oleh Netbeans setelah saya block variabel-variabel yang saya tulis kemudian klik kanan Pilih Refactor | Encapsulate Fields Klik tombol Select All kemudian klik Refactor Selesai

public class CustomerRecord

private int customerId = 0

private String customerName =

private String address =

private int billValue = 0

private String billNotes =

public CustomerRecord()

public CustomerRecord(int id String name String address

int value String notes)

thiscustomerId = id

thiscustomerName = name

thisaddress = address

thisbillValue = value

thisbillNotes = notes

Ini saja yang perlu Anda tulis berikutnya Anda cukup klik kanan pada kode sumber Anda pilih Refactor kemudian Encapsulate Fields hellip pada menu pop up yang muncul Akan muncul dialog Encapsulate Fields Klik tombol Select All kemudian klik tombol Refactor

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 27: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Menyelesaikan Mainjava (Midlet utama) Saya menambahkan 2 variabel di dalam Mainjava

private String httpResult =

private CustomerRecord currentCustomer = null

Saya menambahkan beberapa method di dalam Mainjava seperti

1 split() Method ini berfungsi untuk memecah sebuah string berdasarkan separator yang ditentukan dalam parameternya Kita menggunakannya karena hasil dari HTTP request kita menggunakan format ini

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 28: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

2 setHttpResult() Method ini digunakan untuk mengupdate variabel httpResult dari HttpThread Lebih jauh di akhir method ini juga mengupdate variabel currentCustomer

3 showCurrentCustomer() Method ini digunakan untuk menampilkan nilai variabel currentCustomer ke dalam Form

Jika Anda perlu melihat kode sumber lengkap aplikasi ini Anda mendownloadnya di suatu tempat Jika Anda hanya ingin tahu kode program yang saya tambahkan ke Mainjava perhatikan kode program di bawah ini

private void showCurrentCustomer()

if (currentCustomer instanceof CustomerRecord)

try

Systemoutprintln(Id +

currentCustomergetCustomerId())

Systemoutprintln(Name +

currentCustomergetCustomerName())

Systemoutprintln(Address +

currentCustomergetAddress())

Systemoutprintln(Bill value +

currentCustomergetBillValue())

Systemoutprintln(Bill notes +

currentCustomergetBillNotes())

textFieldIdsetString(StringvalueOf(

currentCustomergetCustomerId()))

textFieldNamesetString(

currentCustomergetCustomerName())

textFieldAddresssetString(

currentCustomergetAddress())

textFieldBillValuesetString(StringvalueOf(

currentCustomergetBillValue()))

textFieldNotessetString(currentCustomergetBillNotes())

catch (Exception e)

eprintStackTrace()

Method di atas dipanggil ketika MIDlet menampilkan isi variable currentCustomer (pelanggan yang sedang dilihat datanya) ke dalam TextField-TextField

public void setHttpResult(String string)

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 29: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

httpResult = string

String[] result = split(string )

if (result[0]equals(0))

String[] texts = split(result[1] ||)

for (int i = 0 i lt textslength i++)

Systemoutprintln(i + + texts[i])

currentCustomer = new CustomerRecord(IntegerparseInt(texts[0])

texts[1] texts[2] IntegerparseInt(texts[3]) texts[4])

showCurrentCustomer()

else

Alert alert = new Alert(Ada yang tidak beres)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

Method setHttpResult() digunakan oleh HttpThread untuk mengembalikan hasil berupa response dari server kepada Mainjava (di dalam variable httpResult) Isi variable ini kemudian di-parsing untuk mendapatkan kode error dan response server dengan pemisah berupa lsquorsquo Jika kode error bernilai 0 (yang berarti koneksi HTTP berjalan lancar) response server yang tersimpan di dalam variabel result[1] kemudian diparsing dengan pemisah berupa lsquo||rsquo untuk mendapatkan nilai field-field dalam response tersebut Setelah diparsing field-field tersebut dimasukkan ke dalam variable text yang berrupa array text[0] berisi field pertama text[1] berisi field kedua dan seterusnya

Berikutnya kita akan menyimpan nilai field-field tersebut ke dalam variable instance dari class CustomerRecord yaitu currentCustomer Langkah ini ditulis pada baris program yang ditulis dengan warna merah

Baris-baris program di atas dua kali memanggil method split() Berikut adalah kode sumber method split()

private String[] split(String original String separator)

Vector nodes = new Vector()

Systemoutprintln(split start)

Parse nodes into vector

int index = originalindexOf(separator)

while (index gt= 0)

nodesaddElement(originalsubstring(0 index))

original = originalsubstring(index + separatorlength())

index = originalindexOf(separator)

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 30: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Get the last node

nodesaddElement(original)

Create splitted string array

String[] result = new String[nodessize()]

if (nodessize() gt 0)

for (int loop = 0 loop lt nodessize() loop++)

result[loop] = (String) nodeselementAt(loop)

Systemoutprintln(result[loop])

return result

Seperti yang Anda lihat method split() digunakan untuk memecah sebuah String menjadi beberapa sub String berdasarkan pemisah berupa String tertentu

Setelah kita memiliki ketiga method di atas kita perlu menambahkan event yang men-trigger pemanggilan httpThread Kita tambahkan baris-baris berikut pada method commandAction pada syarat untuk tombol yang berlabel Edit (pada kasus saya variabel tombolnya adalah okCommand1)

Kembali ke Screen Editor klik kanan okCommand1 pada Assigned Resources (sebelah kanan Device Screen) Pilih Go To Source Masukkan kode berikut

else if (command == okCommand1)

write pre-action user code here

mengirimkan request ke server dengan command = READ

dengan sebuah parameter sesuai isi textFieldId

HttpThread thread = new HttpThread(READ new

String[]textFieldIdgetString() this)

new Thread(thread)start()

Systemoutprintln(Http Result + httpResult)

write post-action user code here

Yang paling penting dalam potongan program di atas adalah isi parameter HttpThread yaitu ldquoREADrdquo dan parameter berikutnya textFieldIdgetString() Jadi kita akan membaca data pelanggan dengan id sesuai isi pada textField

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 31: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Sebenarnya pada kode sumber di atas baris yang dibutuhkan hanyalah baris program berwarna biru yaitu yang bertugas untuk menjalankan koneksi HTTP sekaligus mengembalikan hasilnya ke Mainjava

Test jalankan program Anda Hingga tahap i`ni Anda sudah memiliki modul server dan modul client (meskipun tetap bukan sebuah aplikasi yang lengkap karena fungsi yang jalan hingga saat ini di modul client hanyalah fitur READ) Tapi tak masalah toh Anda sudah cukup mengerti cara kerjanya bukan

Baik sekarang saatnya kita coba menjalankan program kita Anda ingat bukan bagaimana menjalankan program J2ME dengan Netbeans Ini sudah kita bahas di awal tutorial ini

Sebelumnya Anda harus pastikan server Apache dan MySQL sudah berjalan Berikutnya silakan klik kanan Project Anda kemudian pilih Run Mungkin Anda perlu menunggu beberapa detik hingga Wireless Toolkit (emulator ponsel Java) muncul Bagaimana hasilnya Menarik bukan Coba cek dengan PhpMyAdmin ada berapa idpelanggan yang Anda masukkan Ingat-ingat salah satu idpelanggan tersebut dan coba masukkan ke dalam TextField Id kemudian tekan tombol Menu (di bagian bawah kanan LCD emulator Anda)

Kemudian tekan tombol Action yang berada di tengah tombol panah kanan-kiri-atas-bawah Akan muncul pesan yang intinya berisi permintaan ijin Anda untuk melakukan koneksi jaringan internet Seperti gambar berikut

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 32: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Anda harus mengijinkannya dengan menjawab Yes Jika tidak maka program kita tidak bisa menghubungi server Nahhellip bagaimana hasilnya

Bagaimana memodifikasi program ini Saya sudah memberikan petunjuk cukup banyak Saatnya Anda mengembangkan kreatifitas Anda Apa yang ingin Anda tambahkan

Menambahkan fitur simpan pada modul client Hingga tahap ini aplikasi kita sudah jalan Tapi hanya sebatas jalan saya tidak bilang bugs free Aplikasi ini akan semakin sempurna seiring waktu Baik kita akan bahas bagaimana jika Anda ingin menambahkan fitur lain Dalam hal ini fitur yang ditambahkan adalah menyimpan data pelanggan yang sudah diubah Pada bagian sebelumnya kita sudah memiliki fitur membaca dan menampilkan data seorang pelanggan Data-data tersebut kita tampilkan dalam TextField Kita bisa mengedit data-data tersebut di TextField tetapi ketika kita menekan tombolCommand Simpan (kita sudah menambahkan command okCommand2 yang bertuliskan Simpan tetapi belum menambahkan proses apapun dalam event-nya) kita tidak mendapatkan apa-apa Ini karena kita memang belum menambahkan proses apapun kepada command tersebut

Meskipun ini proses yang sederhana tetapi kenyataannya cukup banyak yang akan kita tambahkan Ingat aplikasi ini masih jauh dari sempurna

Baik kita mulai saja Klik kanan pada okCommand2 (dalam Screen Editor) kemudian pilih Go To Source Tambahkan baris program berikut ini

HttpThread thread = new HttpThread(UPDATE new String[]

textFieldIdgetString() + || +

textFieldNamegetString() + || +

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 33: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

textFieldAddressgetString() + || +

textFieldBillValuegetString() + || +

textFieldNotesgetString()

this)

new Thread(thread)start()

di bawah baris program berikut (yang ditambahkan otomatis oleh Netbeans)

else if (command == okCommand2)

write pre-action user code here

Jangan salah ya penambahan ini berlaku kepada Mainjava Sedikit ya Betul penambahan pada Mainjava memang tidak banyak Tetapi bagaimana dengan HttpThreadjava Apakah perubahan yang perlu dilakukan

Sebelumnya kita memiliki fitur READ yang hanya menggunakan 1 parameter berupa String angka(integer) saja Bagaimana jika parameternya berrupa String yang mengandung spasi koma atau yang lain Ternyata kode program kita berresiko menimbulkan Exception alias error karena HTTP request menjadi tidak valid jika mengandung karakter tertentu seperti spasi Maka kita perlu mengimplementasikan URL Encoder URL Encoder berfungsi untuk mengubah String biasa menjadi String URL yang valid Misalnya mengubah spasi menjadi 20 Solusinya saya buat sebuah class baru bernama UrlEncoder yang memiliki satu fungsi static (bisa dipanggil tanpa harus membuat instance objectnya)

UrlEncoderjava

author Amri Shodiq

public class UrlEncoder

public static String urlEncode(String sUrl)

StringBuffer urlOK = new StringBuffer()

for (int i = 0 i lt sUrllength() i++)

char ch = sUrlcharAt(i)

switch (ch)

case lt

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 34: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

urlOKappend(3C)

break

case gt

urlOKappend(3E)

break

case

urlOKappend(2F)

break

case

urlOKappend(20)

break

case

urlOKappend(3A)

break

case -

urlOKappend(2D)

break

default

urlOKappend(ch)

break

return urlOKtoString()

Class ini kemudian saya gunakan di class HttpThread Saya melakukan perubahan pada proses instansiasi koneksi HTTP variable con

con = (HttpConnection) Connectoropen(

http + server + Tutorialfunctionphp +

UrlEncoderurlEncode(

function= + command + ampparameters= + parameters[0]))

Perubahan tersebut ditandai dengan warna hijau Tidak banyak

Kita tinggalkan dulu HttpThread dan kembali ke Mainjava untuk melihat method setHttpResult() Di sini akan kita lakukan penambahan karena ada penambahan fitur

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 35: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Ingat method tersebut sebelumnya hanya menangani satu fitur yaitu READ Kita akan menambahkan fitur lain yaitu UPDATE (digunakan untuk menyimpan perubahan data pelanggan) Implementasinya

1 Menambahkan sebuah variable di bawah class Main yaitu currentFunction Deklarasinya sebagai berikut (di bawah deklarasi httpResult)

private String currentFunction =

2 Mengubah deklarasi method setHttpResult yang berpengaruh pula pada HttpThread

karena memanggil method ini menjadi

public void setHttpResult(String string String function)

dan memasukkan function ke dalam variable currentFunction ketika method ini dipanggil

httpResult = string

currentFunction = function

3 Memberlakukan syarat untuk masing-masing fitur (READ dan UPDATE)

if (currentFunctionequals(READ))

String[] result = split(string )

hellip

else if (currentFunctionequals(UPDATE))

hellip

4 Menambahkan proses untuk fitur UPDATE Ada perbedaan antara fitur READ dengan

UPDATE Fitur READ diakhiri dengan menampilkan data yang sedang dibaca Tidak demikian dengan fitur UPDATE Fitur ini tidak perlu menampilkan data yang sedang diupdate tetapi justru harus diakhiri dengan pemberitahuan apakah proses UPDATE berhasil atau gagal (gagal bisa karena memang server mengembalikan pesan gagal misalnya idpelanggan tidak terdaftar atau gagal karena koneksi ke server tidak berhasil misalnya alamat server tidak ada atau server mati) Bagaimana menambahkan pemberitahuan tersebut Gunakan class Alert baik ketika response dari server berhasil maupun gagal Perhatikan potongan program berikut ini

else if (currentFunctionequals(UPDATE))

Systemoutprintln(Http result +httpResult)

if (httpResultequals(1))

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 36: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Alert alert = new Alert(Berhasil Data berhasil disimpan

null AlertTypeINFO)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

else

Alert alert = new Alert(Gagal Penyimpanan data gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

DisplaygetDisplay(this)setCurrent(alert)

5 Menambahkan pesan kegagalan ketika terjadi Exception di class HttpThread Seperti sudah saya katakan pada point sebelumnya kita perlu memberi tahu pengguna jika terjadi kegagalan termasuk jika modul client ini gagal menghubungi server misalnya karena pulsa habis alamat server salah server sedang down dll Penambahan itu berlaku pada statement catch yang ada di HttpThread

try

hellip

catch (IOException ex)

Systemoutprintln(exgetMessage())

Alert alert = new Alert(Gagal Koneksi dengan server gagal

null AlertTypeERROR)

alertsetTimeout(AlertFOREVER)

parentsetCurrentDisplay(alert)

6 Menambahkan method setCurrentDisplay() di interface ThreadListenable dan class Main

Ketika Anda menambahkan baris-baris program di atas Netbeans akan menunjukkan adanya kesalahan pada kode sumber program Ini terjadi karena interface ThreadListenable tidak memiliki method setCurrentDisplay() Kita akan menambahkannya sekarang Tambahkan method berikut dalam ThreadListenablejava

public void setCurrentDisplay(Displayable disp)

Juga tambahkan method berikut di akhir Mainjava

public void setCurrentDisplay(Displayable disp)

DisplaygetDisplay(this)setCurrent(disp)

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup
Page 37: Tutorial J2ME Membangun Aplikasi Client-server Dan Koneksi Dengan Database Di Server

Selesai 6 perubahan sudah kita lakukan pada project kita Anda sudah bisa mengetes-nya sekarang Jalankan program ini Coba baca idpelanggan yang sudah terdaftar di database Anda Jika hasilnya sudah tampil lengkap nama alamat dll Coba Anda ubah isi salah satu atau lebih field-fieldnya Kemudian tekan command Simpan di emulator Apa yang terjadi Sudah menampilkan pemberitahuan proses berhasil atau gagal bukan Sekarang coba matikan server Apache Anda Kemudian lakukan test sekali lagi Tekan command Edit Muncul pesan kegagalan bukan

Nah sampai tahap ini Anda sudah mampu menambahkan fitur lain ke dalam aplikasi ini Penambahan fitur yang lainnya mungkin tidak akan memerlukan usaha sebanyak ini

Penutup Buku ini dilengkapi dengan kode sumber program sebagai lampiran Sebaiknya Anda download file kode program tersebut agar Anda mendapatkan gambaran yang lebih baik tentang isi tutorial ii

Saya sadar ebook ini masih jauh dari sempurna Edisi ini adalah edisi pertama ebook ini dan ebook ini sangat terbuka untuk penambahan dan penyempurnaan Saya akan sangat menghargai kritik saran maupun pertanyaan yang ditujukan kepada saya berkaitan dengan meteri di dalam ebook ini

Silakan layangkan kritik saran maupun pertanyaan Anda ke email saya amrishodiqgmailcom Saya akan sangat menghargai masukan Anda

Terima kasih semoga tulisan saya yang sederhana ini dapat membantu kerja Anda

  • Menggunakan Netbeans 65 Mobility
    • Menentukan flow aplikasi
    • Menambahkan komponen ke atas form
    • Menambahkan kode program pada event tertentu
    • Menjalankan program
      • Menggunakan Easy Eclipse for PHP 122
        • Membuat project PHP baru
        • Menambahkan file PHP
        • Melihat bagaimana program Anda berjalan
          • Menulis modul server
            • Skenario
            • Membangun skema database di sisi server
            • Menulis functionphp
            • Melengkapi fungsi-fungsi utama
            • Menangani HTTP Request GET
              • Menulis modul client
                • Membuat Graphical User Interface
                • Membuat class CustomerRecord
                • Menyelesaikan Mainjava (Midlet utama)
                  • Test jalankan program Anda
                  • Bagaimana memodifikasi program ini
                    • Menambahkan fitur simpan pada modul client
                      • Penutup