Posts Tagged ‘Programming’

Belajar Wicket: Model

Seperti M pada MVC, Model berfungsi sebagai data holder bagi setiap komponen yang menyertakannya. Berbeda dengan Model pada MVC, maka Model pada wicket tidak bertanggung jawab terhadap persistensi data aplikasi, tetapi merupakan bagian dari View. Well sebenarnya Model pad MVC-pun tidak bertanggung jawab terhadap persistensi, tapi merupakan representasi dari data aplikasi.

Kembali ke Model-nya Wicket, setiap komponen, baik komponen sederhana seperti Label atau Input, sampai yang lebih komplek seperti untuk DropDownChoice atau DataView (komponen untuk menampilkan data-data pada table dan punya kemampuan paging) memerlukan object penampung data dan Model ini adalah object tersebut.

Constructor untuk komponen salah satunya adalah new Component(String s, Model m), jadi rasanya sangat jelas fungsi dari Model. Beberapa Model yang sering digunakan adalah PropertyModel, CompoundPropertyModel dan Model itu sendiri.

PropertyModel digunakan untuk menampung data input dalam html dengan menggunakan field yang ada pada class. Contohnya adalah :
public class Test extends WebPage {
private String hello;
public Test() {
TextField hello = new TextField("hello",new PropertyModel(this,"hello");
add(hello);
}
public String getHello() {
return this.hello;
}
public void setHello(String hello) {
this.hello = hello;
}
}

Ketika input hello diisi satu nilai kemudian disubmit, field hello pada class Test akan otomatis terisi nilai seperti pada pagenya. Jika ada proses, nilai hello dapat diambil dengan getHello. It’s that simple :D

CompoundPropertyModel adalah model yang menggunakan object lain sebagai data holder bagi page. Model ini sangat mempermudah development aplikasi karena kita bisa definisi data sebelum page dibuat. contoh: public class TestData {
private String hello;
public String getHello() {
return this.hello;
}
public void setHello(String hello) {
this.hello = hello;
}
}
public class Test extends WebPage {
public Test() {
TestData data = new TestData();
CompoundPropertyModel model = new CompoundPropertyModel(data);
Form form = new Form("testForm",model);
form.add(new TextField("hello"));
add(form);
}
}

Cukup rumit jika hanya digunakan untuk satu field, tapi akan sangat terasa kalau class datanya punya banyak field. Dan akan sangat handy karena class data dapat digunakan sebagai parameter pada submit.

Masih ada beberapa point yang belum dibahas.. jadi masih bersambung ;)

Tags: , ,

Belajar wicket

Membuat aplikasi berbasis web dengan wicket relatif mudah. Yang perlu dilakukan adalah :

  • Download wicket dari sini
  • Setup project dengan IDE favorit. (bisa Idea, Eclipse, Netbeans, ataupun yang lainnya.. Emacs, Vim :D )
  • Extract wicket dan tambahkan library ke project. ( wicket, wicket-extensions, slf4j-api: yang ini harus search deh )
  • Set web.xml. Untuk versi 1.3, wicket sudah memakai filter, selain pilihan menggunakan servlet. contohnya adalah :
    <web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns<img src='http://catatankecil.masdrag.com/smilies/yahoo_love.gif' alt='&#58;&#120;' class='wp-smiley' width='18' height='18' title='&#58;&#120;' />si="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
    &lt;display-name&gt;Contoh App&lt;/display-name&gt;
    &lt;description&gt;;Contoh Aplikasi&lt;/description&gt;
    &lt;filter&gt;
    &lt;filter-name&gt;AppFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.apache.wicket.protocol.http.WicketFilter&lt;/filter-class&gt;
    &lt;/filter&gt;
    &lt;init-param&gt;
    &lt;param-name&gt;applicationClassName&lt;/param-name&gt;
    &lt;param-value&gt;contoh.ContohApplication&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;filter-mapping&gt;
    &lt;filter-name&gt;AppFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&amp;&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
    &lt;/web-app&gt;
  • Buat class contoh.ContohApplication, seperti para web.xml diatas. File ini adalah pintu dari aplikasi dengan framework wicket. Class ini nantinya akan memanggil class lain yang merupakan turunan dari WebPage untuk menjadi page pertama yang muncul dari aplikasi. Contoh :
    package contoh;
    import org.apache.wicket.protocol.http.WebApplication;
    import org.apache.wicket.Session;
    import org.apache.wicket.Request;
    import org.apache.wicket.Response;
    import contoh.Hello;
    public class ContohApplication extends WebApplication {
    @Override
    public Class getHomePage() {
    return Hello.class;
    }
    }
  • Seperti dapat dilihat diclass ContohApplication, ada method getHomePage yang di override untuk mengeluarkan Hello.class. Secara defaul, aplikasi akan memanggil method getHomePage, jadi selanjutnya adalah membuat class Hello yang merupakan turunan dari WebPage. Contoh :
    package contoh;
    import org.apache.wicket.markup.html.basic.Label;
    class Hello extends WebPage {
    public Hello() {
    add(new Label("hello","HELLO"));
    }
    }
  • Langkah terakhir adalah membuat html page sebagai tampilan dari page yang sudah kita buat. Wicket akan mencari file html dengan nama yang sama dengan class yang tadi kita bikin. Jadi sekarang kita buat file Hello.html.
    &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
    &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
    &lt;head&gt;
    &lt;title&gt;Hello&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
    &lt;span wicket:id="hello"&gt;[Hello]&lt;/span&gt;
    &lt;/body&gt;

There you go. Aplikasi siap dijalankan.

Sedikit penjelasan, ketika html di parse oleh wicket, wicket akan mencari id yang sama dengan yang ada di class, jadi seperti contoh diatas, pada class ada deklakasi penambahan komponen Label ke page add(new Label("hello","HELLO")) dan pada html <span wicket:id="hello">[Hello]</span>. Secara otomatis, wicket akan merubah wicket:id=”hello” menjadi string Hello.

Enjoy.

Tags: , ,

Kenalan Wicket yuk..

Wicket adalah java framework untuk develop aplikasi berbasis web. Kalau mau baca-baca sumbernya langsung atau sekalian donlot dan coba, bisa dicari disini.

Yang membuat saya merasa senang dengan framework ini adalah bahwa wicket berbasis komponen, yang berarti komponen web seperti input, tombol dan sebagainya sudah ada di framework. Dan diharapkan juga nanti ada komponen semacam table, grid dan komponen lain yang lebih komplek.

Dan juga karena wicket menggunakan event sebagai flow dari aplikasi, bukan controller-action, maka aplikasi dari wicket akan lebih berbau aplikasi desktop daripada aplikasi web. Jadi setiap komponen dalam aplikasi yang dibangun dengan wicket juga merupakan event-source dari behavior aplikasi. Ketika tombol saya tekan, maka aplikasi akan bereaksi terdapat penekanan tombol tersebut.

Penekanan terakhir terhadap framework ini adalah bahwa aplikasi yang dibangun akan bersifat stateful. Jadi berbeda dengan framework lain, wicket akan menyimpan state dari page yang tampil di layar. Drawbacknya adalah setiap perubahan dilayar juga harus dilakukan di server. Untuk perubahan static (seperti form entry) tidak berbeda dengan aplikasi lain, tapi untuk form yang lebih komplek, misalnya list yang akan mengupdate field lain, hal ini akan membuat aplikasi lebih komplek karena harus selalu diupdate ke server.. hmm.. which is sebenarnya sih sama saja ya.. bahkan menjadi lebih mudah.

Dengan didukungnya AJAX out of the box ( langsung bisa dipakai ), development aplikasi menjadi jauh lebih cepat dan menyenangkan. Penggunaan AJAX bahkan tanpa perlu kita tau javascript ;) komponen AJAX sudah tersedia di wicket.

Oh ya, yang paling penting malah terlupakan. Wicket menggunakan teknologi java yang paling kuno, yaitu pure OOP. Page adalah sebuah class yang diturunkan dari class lain..

Jadi bagi yang kuat konsep OOP-nya, akan sangat gampang mempelajari wicket.

Tags: , ,

Singleton vs static

Kedua jenis class ini sangat mirip dalam penggunaannya, dengan perbedaan jika class singleton, dalam satu sesi aplikasi, hanya ada satu object yang diinstantiate, sedangkan static class ( class yang hanya terdiri dari static method ) tidak pernah ada instance yang dibuat, sesuai dengan sifat method-nya. Satu lagi, karena static class tidak pernah di instantiate, maka static class tidak dapat menyimpan state, atau bisa saja dengan menggunakan variabel static. Hmm.. jadi tidak bisa dibilang berbeda dong haha.. Tapi kalau tidak salah variabel tersebut tidak bisa diakses karena class tidak di instantiate, yang berarti variabel tersebut tidak pernah ada.

Hanya saja karena kemiripan penggunaan, yaitu kebutuhan akan instance yang hanya satu (atau tidak ada instance sama sekali) pada satu sesi aplikasi, maka kadangkala bingung juga mana yang harus dipakai.

Setelah luntang lantung ke beberapa situs ( lewat google hehe ) ternyata ada satu hal yang harus digunakan dalam mempertimbangkan metode yang dipakai. Yaitu perbedaan siat keduanya, penyimpanan state, dan satu lagi polymorphism.
Jika state class diperlukan dalam aplikasi, atau jika pada satu saat nanti class akan di extend, singleton lebih layak dipakai. Jika method hanya digunakan untuk memproses data, tapi penyimpanan data dalam class, pakai static method.

There you go!

( biar gak lupa hehe )

Tags: , , ,

Java Transaction….. *sigh*

Sudah beberapa minggu saya mencoba mencari tahu apa itu Java Transaction API dan bagaimana menerapkannya pada pekerjaan saya.

Situasinya adalah seperti ini, selama ini saya membangun program pada J2EE box, yang telah menerapkan Distributed Transaction secara transparan. Yang saya kerjakan selama ini adalah

  • Panggil startTransaction
  • Transaksi yang saya definisikan
  • Jika berhasil panggil commitTransaction, jika gagal rollbackTransaction

dengan parameter nama transaksi. Karena selama ini apa yang saya kerjakan masih dalam scope diatas, maka tidak ada masalah.

Masalah datang ketika API dari satu database gagal setiap kali dieksekusi. Setelah dicoba berkali-kali tidak juga membawa hasil, maka saya membuat satu program kecil yang langsung mengeksekusi API dari JDBC, terpisah dari platform box aplikasi. That leads us to our current problem… karena dibuat pada JDBC yang terpisah, maka proses tersebut tidak termasuk dalam platform transaksi diatas, jadi ketika ada masalah disalah satu traksaksi, transaksi yang bersangkutan tidak bisa rollback. Sangat menyalahi konsep Distributed Transaction, Atomicity, yang pada intinya mengatakan sebuah traksaksi hanya menghasilkan satu keluaran, semua berhasil atau semua gagal, dan jika ada bagian dari transaksi yang gagal, state system harus dikembalikan pada keadaan sebelum transaksi. Darn. :shock:

Jadi kembali ke masa sekarang :roll:, setelah beberapa google kemudian, rasanya gambaran tentang Distributed Transaction sudah mulai nampak… dan rumit :neutral:

Tags: , ,