Saturday, March 9, 2013

Mempersiapkan Sistem untuk Scala

Gw membuat Ngajak Jalan–sebuah situs jodoh untuk mencari pacar–dengan Scala. Minggu lalu gw menulis tentang perkenalan Scala dari Java yang menunjukkan bagaimana sebuah program Java jika ditulis ulang dengan Scala. Berdasarkan masukan, kali ini gw akan menjabarkan bagaimana mempersiapkan sistem kamu untuk development Scala.

0. Install Java Development Kit

Ambil Java terbaru dari http://www.oracle.com/technetwork/java/javase/downloads/index.html dan lakukan instalasi sesuai sistem kamu. Setelah selesai, cek instalasi kamu dengan menjalankan java -version dan javac -version:

septerra:~ wiradikusuma$ java -version
java version "1.7.0_13"
Java(TM) SE Runtime Environment (build 1.7.0_13-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

septerra:~ wiradikusuma$ javac -version
javac 1.7.0_13

1. Install Scala Development Kit

Ambil Scala terbaru dari http://www.scala-lang.org/downloads dan lakukan instalasi sesuai sistem kamu. Setelah selesai, cek instalasi kamu dengan menjalankan scala -version:

septerra:~ wiradikusuma$ scala -version
Scala code runner version 2.10.0 -- Copyright 2002-2012, LAMP/EPFL

Kalau kamu melihat pesan kesalahan seperti "command not found", masukkan direktori bin dari instalasi Scala kamu ke dalam PATH.

2. Install IntelliJ IDEA Community Edition

Langkah ini opsional, tapi sangat disarankan.

Ambil IntelliJ IDEA Community Edition terbaru dari http://www.jetbrains.com/idea/download/ dan lakukan instalasi sesuai sistem kamu. Setelah selesai, buka programnya.

Di menu Quick Start, pilih Configure lalu Plugins. Klik Browse repositories… lalu pilih Scala dari daftar. Klik ikon Download and Install di sudut kiri atas dan unduh plugin Scala untuk IDEA. Setelah selesai, klik Close lalu OK. Pilih Restart ketika diberikan pilihan. Tunggu sebentar dan kamu akan melihat kembali tampilan menu awal.

Klik Create New Project dan pilih Scala Module. Masukkan hello-world untuk Project name, tentukan Project location sesuai yang kamu inginkan, lalu klik New… untuk membuat Project SDK baru—arahkan ke lokasi Java Development Kit kamu.

Klik di bagian Set Scala Home dan arahkan ke lokasi Scala Development Kit kamu. Centang Make global libraries. Klik Finish dan biarkan IDEA menyiapkan struktur awal proyekmu.

IntelliJ IDEA CE Scala blank project

Klik-kanan src, pilih New > Scala Class lalu masukkan scala0.HelloWorld (tanpa spasi) untuk Name dan Object untuk Kind. Klik OK. Kamu akan melihat class HelloWorld dalam package  scala0 yang disimpan dalam file HelloWorld.scala dalam direktori src/scala0. Kalau familiar dengan Java, kamu pasti bergumam, "Oh, mirip ya." Buka HelloWorld dan ganti isinya dengan ini:

package scala0

/**
 * Menampilkan "Hello World" di layar.
 *
 * @author Thomas Wiradikusuma
 */
object HelloWorld extends App {
  println("Hello World")
}

Jangan lupa ganti nama gw dengan namamu :)

Arahkan kursor ke teks HelloWorld di dalam dokumen yang sedang terbuka, klik-kanan dan pilih Run 'HelloWorld.main()'. IDEA akan mengompilasi program kamu, menjalankannya dan menampilkan hasilnya di bawah. Hore, program Scala pertama kamu!

Hello World

Process finished with exit code 0

Untuk menjalal Scala, kita tidak perlu membuat file apalagi proyek seperti di atas. Buka Command Prompt (atau program ekuivalen seperti Shell atau Terminal) dan ketik scala.

septerra:~ wiradikusuma$ scala
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_13).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

Sekarang kamu masuk ke dalam Scala REPL (Read-Evaluate-Print Loop), ini adalah lingkungan interaktif untuk menjajal kode. Ketik println("Hello World") di kursor.

scala> println("Hello World")
Hello World

Dengan REPL, kamu bisa menjalal kode tanpa menunggu proses kompilasi yang lambat (compiler Scala memang lambat, kita akan membahasnya di hari lain termasuk cara mengatasinya). Coba masukkan 1 + 1 atau Math.cos(30), seperti kalkulator!

Sementara menunggu tulisan berikutnya, kalau kamu masih jomblo, silakan mampir ke Ngajak Jalan, tempat untuk mencari TTM, pacar sampai istri.

Saturday, March 2, 2013

Perkenalan Scala dari Java

Belakangan ini gw sibuk mengembangkan Ngajak Jalan, sebuah situs jodoh untuk mencari pacar. Karena sedang belajar Scala, gw membuat Ngajak Jalan dengan Scala.

Banyak yang bilang bahwa Scala adalah "Java yang lebih baik". Terlepas dari benar atau tidaknya, gw akan menunjukkan bagaimana sebuah program Java ditulis dalam Scala. Oh ya, iklan dulu: Untuk yang jomblo, jangan lupa bergabung di Ngajak Jalan. OK, lanjut :)

Andaikan kita punya input.txt dengan isi sebagai berikut:

Nama	Usia
Thomas	30
Budi	28
Wati	25
Jojon	38
Santi	20

Kita ingin membaca dokumen tersebut lalu menampilkan isinya jika usia lebih kecil atau sama dengan 30. Berikut ini tampilan yang diharapkan:

Thomas = 30
Budi = 28
Wati = 25
Santi = 20

Dengan Java:

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Program {
    public static void main(String args[]) throws Exception {
        Scanner scanner = new Scanner(new File("input.txt"));
        List<String> lines = new ArrayList<String>();

        scanner.useDelimiter("\n");

        while (scanner.hasNext())
            lines.add(scanner.next());

        scanner.close();

        lines = lines.subList(1, lines.size());

        for (String line : lines) {
            String[] tokens = line.split("\t");
            String name = tokens[0];
            int age = Integer.parseInt(tokens[1]);

            if (age <= 30)
                System.out.println(name + " = " + age);
        }
    }
}

Mari kita "Scala-kan" program di atas. Agar mudah dimengerti, mari kita lakukan bertahap. Tahap pertama adalah menghilangkan titik koma dan men-Scala-kan elemen yang terpaksa harus diubah (agar tidak compile error):

import java.io.File
import java.util.Scanner
import collection.mutable.ListBuffer

object Program {
    def main(args: Array[String]) {
        val scanner = new Scanner(new File("input.txt"))
        var lines = new ListBuffer[String]()

        scanner.useDelimiter("\n")

        while (scanner.hasNext())
            lines.+=(scanner.next())

        scanner.close()

        lines = lines.slice(1, lines.size)

        lines.foreach(line => {
            val tokens = line.split("\t")
            val name = tokens(0)
            val age = Integer.parseInt(tokens(1))

            if (age <= 30)
                System.out.println(name + " = " + age)
        })
    }
}

Ini program Scala lho, mirip Java kan? Bagaimana rasanya tanpa titik koma? Lebih enak dilihat? Mari kita hilangkan beberapa noise:

import java.io.File
import java.util.Scanner
import collection.mutable.ListBuffer

object Program {
    def main(args: Array[String]) {
        val scanner = new Scanner(new File("input.txt"))
        var lines = new ListBuffer[String]()

        scanner useDelimiter "\n"

        while (scanner.hasNext)
            lines += scanner.next

        scanner.close()

        lines = lines slice(1, lines.size)

        lines.foreach(line => {
            val tokens = line split "\t"
            val name = tokens(0)
            val age = tokens(1).toInt

            if (age <= 30)
                println(s"$name = $age")
        })
    }
}

Mirip program sebelumnya, tapi sedikit lebih "bersih". Kita juga menggunakan fitur baru di Scala 2.10 bernama string interpolation. Mari kita peringkas lagi dengan lebih idiomatik:

import io.Source._

object Program extends App {
    val lines = fromFile("input.txt").getLines().toList drop 1
    val tokens = lines.map(_ split '\t').map(arr => (arr(0), arr(1).toInt))

    tokens.foreach(
        _ match {
            case (name, age) if age <= 30 => println(s"$name = $age")
            case _ =>
        }
    )
}

OK, ini mulai terlihat asing—mari kita bahas.

  • extends App adalah shortcut untuk main() yang biasa kamu kenal.
  • fromFile adalah metode dari io.Source untuk membaca file.
  • map adalah fungsi yang mentransformasi sebuah koleksi ke koleksi lain. 
  • map yang pertama mengubah list String ke list Array ([Nama,Usia],[Thomas,30],…). 
  • map yang kedua mengubah list Array ke list Tuple ((Nama,Usia),(Thomas,30),…). Tuple ini dibutuhkan untuk match-case.

Kalau program kita diubah ke bahasa manusia:

  • Baca input.txt baris per baris, taruh di list dan buang elemen pertama.
  • Untuk setiap elemen di list, pisahkan dengan TAB, lalu buat berpasangan (nama-usia).
  • Untuk setiap elemen di list, namai name untuk data kiri dan age untuk data kanan, tapi hanya kalau elemennya merupakan sebuah pasangan dan age lebih kecil atau sama dengan 30. Tampilkan di layar.

Bagaimana? Menarik? Kalau ada yang belum jelas, mohon tulis di komentar supaya bisa gw jawab. Kalau peminatnya banyak, gw akan melanjutkan blognya. Jangan lupa kasih ide apa yang perlu dibahas :) Eh tunggu, iklan lagi deh: Ngajak Jalan adalah tempat untuk mencari TTM, pacar sampai istri. Jangan lupa di-share kalau bermanfaat (tulisannya, bukan soal cari TTM-nya)!

Wednesday, August 18, 2010

English is maybe more suitable

I once wrote that I want to post blog entries in two languages, namely English and Bahasa Indonesia. My motivation was to explain conceptual topics in Bahasa Indonesia to help fellow Indonesians grasp important basic concepts, but judging from traffic and comments posted, people don't seem to care.

I was idealistic, but then I realize I don't have all the time in the world to do time-consuming-but-insignificant work. From now on I'm going to stick on using English.

Thursday, August 12, 2010

Programmer dan tukang jahit

Profesi programmer agak mirip dengan profesi tukang jahit. Keduanya bisa bekerja di industri yang terkomoditas, atau bekerja di industri yang lebih menghargai mereka sebagai individu. Gw kasih contoh.

Tukang jahit, yang just like another tukang jahit, bekerja di pabrik konveksi bersama ratusan just another tukang jahit lainnya. Kita sebut mereka Tipe A. Di tempat lain, tukang jahit berpakaian casual di kantor, naik pesawat ke berbagai daerah untuk bertemu klien, dan gajinya lebih besar dibanding kolega mereka yang bekerja di pabrik. Kita sebut mereka Tipe B.

Kenapa Tipe B terlihat lebih beruntung? Karena mereka not just another tukang jahit. Mereka masih perlu menjahit, dan harus bagus dalam menjahit, tapi menjahit bukanlah satu-satunya tugas/kemampuan mereka. Mereka merancang baju, memberikan saran kepada klien, dan mungkin menulis artikel di majalah fashion. Mereka memiliki nilai tambah yang menjadikan mereka lebih dari tukang jahit.

Demikian juga dengan programmer. Baru-baru ini ada diskusi di milis JUG Indonesia yang meng-undervalue pekerjaan programmer dibanding analyst. Sampai ada yang menyesal, "Harusnya gw jangan lama-lama jadi programmer. Harusnya jadi analyst." Hmm.. programmer yang seperti apa dulu?

Kalau kamu jadi programmer yang hanya tahu bagaimana (how) melakukan sesuatu tanpa tahu kenapa (why) kamu harus begitu, kamu tidak ada bedanya dengan tukang jahit di pabrik konveksi. Di dunia Java, tidak hanya persaingan yang ketat, tapi ada puluhan framework bermunculan setiap hari seperti upil. Kalau kamu tidak menguasai konsep, kamu akan kewalahan.

Tidak hanya harus mumpuni di bidang spesifik kamu (coding dalam bahasa Java), kamu juga harus familiar dengan siklus software engineering dari pengumpulan requirements sampai User Acceptance Test (UAT). Banyak hal lain yang harus dikuasai, yang untungnya (atau sayangnya?) tidak begitu berhubungan dengan coding.

Secara umum, seorang programmer yang memiliki nilai tambah harus:
  • Menguasai bahasa dan API platform spesialisasinya.
  • Menguasai satu atau dua framework populer.
  • Mengetahui konsep beberapa framework lain yang kamu tidak kuasai (supaya kamu tahu ada solusi lain untuk masalah yang lain).
  • Familiar dengan siklus software engineering.
  • Berpartisipasi aktif dengan analyst, jangan hanya terima mentah-mentah.
  • (Soft-skill) Mampu mengerti motivasi dibalik requirements dari klien (Kenapa mereka mau itu? Kenapa solusi yang kita tawaran begitu? Kenapa bukan yang lain?).
Jangan jadi just another programmer, jadilah programmer dengan nilai tambah.

Note: Tulisan ini tidak bermaksud mendiskreditkan tukang jahit apalagi yang bekerja di pabrik konveksi.

Wednesday, August 4, 2010

Java dan istri tua

Baru-baru ini muncul diskusi hangat di milis JUG Indonesia, judulnya seru: "Ask pemrograman yng keren selain java". Inti diskusinya, "Java konsumsi memory-nya besar (Isu #1) dan fitur bahasanya tidak semenarik bahasa-bahasa modern lain (Isu #2)". Blog ini adalah komentar gw soal diskusi itu.

Ingat bahwa Java(tm) terdiri dari tiga komponen:
- Java Virtual Machine (JVM)
- Java API
- Bahasa pemrograman Java (syntax)

Untuk Isu #1, Endy Muhardin berkomentar, "Ah yang bener". Gw setuju dengan Endy. Kita pakai analogi yuk. Anggaplah JVM sebagai mobil dan platform lain yang konsumsi memory-nya jauh lebih kecil sebagai motor. Untuk keliling kompleks perumahan atau ke warung, motor memang lebih ideal. Tapi kalau dari Jakarta ke Semarang, masak naik motor?

Meski ke luar kota bisa naik motor (dan beberapa orang melakukannya), bukan berarti itu cara yang ideal. Demikian juga dengan software. Untuk beberapa aplikasi mungkin kita tidak memerlukan semua bells-and-wistle sebuah JVM sehingga overhead-nya tidak bisa kita terima, tapi untuk kebanyakan aplikasi bisnis, JVM (atau secara umum, VM, seperti CLI untuk .NET) adalah platform yang ideal.

Sekarang Isu #2: Bahasa pemrograman Java tidak seksi lagi.

Java diciptakan pada tahun 1995, bahasa-bahasa lain yang lebih seksi baru muncul belakangan ini. Ini seperti membandingkan bintang film tahun 1980 dengan artis muda jaman sekarang, atau lebih tepatnya membandingkan istri tua dengan istri muda. Mereka tidak bisa dibandingkan langsung—masing-masing ada kelebihan dan kekurangannya, "penggunaannya" pun berbeda (Catatan: bukan berarti gw mendukung poligami lho).

Ada opini untuk "meremajakan" Java dengan memasukkan fitur-fitur seksi ke dalam Java. Ini seperti memaksa istri tua kita untuk operasi plastik dan pengencangan payudara. Bisa sih. Tapi apakah perlu?

Ingat bahwa bahasa pemrograman Java digunakan oleh banyak orang—istri tua kita di-sharing ramai-ramai! Beberapa orang mungkin tidak nyaman kalau sang istri sejuta umat itu diubah-ubah. They like her the way she is. Kemungkinannya ada dua:
  • Alasan psikologis. "Gw malas ah belajar yang baru lagi."
  • Alasan bisnis. Bagaimana dengan compatibility? Training? Semakin banyak fitur tentu semakin banyak yang dipelajari dan semakin banyak yang perlu di-maintain (arguably).
Jadi, untuk beberapa orang, lebih baik membiarkan istri tuanya apa adanya. Untuk beberapa kasus, selingkuh (dengan bahasa / platform lain) lebih disarankan.

UPDATE: Hira Sirojudin mengeluh, "saat suatu aplikasi diminta untuk handling hingga ribuan user bahkan diatas 100ribu connected users, investasi infrastrukturnya mahal berlipat, ngak cukup hanya dengan 1 mesin berprosesor xeon 8core dan mengandalkan cluster&balancing di sana sini.intinya dirasa antara performance dan costnya ngak seimbang, walopun itu ngak semuanya mesti disalahkan sama javanya". Keluhan diterima. Tapi sebelum menyalahkan Java, mungkin harus dilihat aplikasinya dulu. Kalau biaya rumah tangga membengkak, belum tentu itu karena salah istri tua kita kan? :)

Wednesday, July 28, 2010

Konsep: Application server

Siapapun yang belajar Java pasti tahu sebuah program Java dimulai dari main, misalnya seperti ini:


Menurut penjelasan di buku, setelah source code (.java) di-compile menjadi bytecode (.class), kita tinggal menjalankannya dari command prompt dengan perintah:

java Kelasku

Lalu apa gunanya application server seperti Apache Tomcat? Bukannya kita tinggal membuka port 80 dari dalam main? OK, anggaplah kita memulai semua dari nol alias "semuanya kita yang mengurus", maka program yang kita buat harus:

  1. Membuka server socket yang mendengarkan port 80 (HTTP).
  2. Ketika seseorang membuka http://alamat_kita, program kita harus tahu cara membaca request tersebut. Dengan kata lain, program kita harus mengimplementasikan protokol HTTP.
  3. Memproses request tersebut sesuai logika bisnis yang kita miliki, misalnya mengambil data dari database atau menghitung bonus penjualan.
  4. Mengembalikan respon, misalnya menghasilkan halaman berikutnya.

Perlu diingat, program tersebut harus bisa "salome"—satu lubang (port) ramai-ramai, karena "http://alamat/admin" dan "http://alamat/" mungkin ditangani oleh program yang berbeda (namun keduanya berada di port 80). Program yang kita buat juga harus mendukung multi-theading agar bisa diakses serempak oleh banyak orang. Terlihat ribet kan?

Itulah gunanya application server. Kita tidak perlu repot membuat semua dari awal. Yang perlu kita lakukan adalah membuat program sesuai "perjanjian", dalam hal ini kita membuat Servlet. Urutannya menjadi:

  1. Ada request masuk.
  2. Dilihat apakah ada program ("webapp") yang di-setting untuk menangani request ini.
  3. Kalau tidak ada, tampilkan pesan kesalahan.
  4. Kalau ada, panggil fungsi doGet/doPost dari program tersebut (yang merupakan sebuah Servlet), sambil memberikan data-data dari request.
  5. Kembalikan hasil pemrosesan poin 4 ke sumber yang meminta request.

Pemrograman Web menggunakan teknologi Java selalu seperti ini. JSP, JSF, Struts, Spring MVC dan berbagai framework lainnya adalah "teknologi tambahan" yang berjalan di atas Servlet. Untuk alasan mengapa menggunakan framework dapat dilihat di blog sebelumnya.

Selain fungsi dasar di atas (melayani HTTP request), biasanya application server juga ada plus-plusnya. Umumnya program kita membutuhkan koneksi ke DB, sehingga application server menyediakan fungsi untuk itu. Application server juga mungkin menyediakan fungsi untuk mengirim email. Application server yang menyediakan fungsi-fungsi itu biasanya disebut "application server", sedangkan application server yang basic biasanya disebut "servlet container".

Tuesday, July 27, 2010

Konsep: IDE

Coba lihat dapurmu. Umumnya sebuah dapur berisi peralatan standar seperti kompor, kulkas, oven, tempat mencuci piring, tempat menaruh piring, dan lain sebagainya. Kalau dapurmu bergaya barat, mungkin tata letaknya akan seperti gambar ini:


Di dapur seperti ini urusan masak-memasak menjadi lebih nyaman. Semua di satu tempat. Itulah gunanya IDE (Integrated Development Environment) dalam membuat program.

Tentu, kita bisa coding hanya dengan Notepad dan command-line tool dari SDK pilihan kita (misalnya Java Development Kit). Kita juga bisa masak tanpa dapur yang lengkap seperti gambar di atas. Tapi mana yang lebih nyaman?

IDE yang bagus juga bisa dikustomisasi, misalnya tata letak panelnya diganti, sama seperti dapur yang lokasi kulkas dan kompornya sesuai selera orang yang menggunakannya.



Di dunia Java, ada beberapa IDE yang populer, misalnya Eclipse, NetBeans dan IntelliJ. Dua yang pertama gratis. Mana yang lebih baik? Seperti soal dapur, semua kembali ke selera. Umumnya pemula lebih menyukai NetBeans karena "semua tinggal pakai". Eclipse biasanya dipilih karena banyak pilihan plugin dan lebih ringan. IntelliJ tetap menjadi favorit bagi yang tidak keberatan membayar.

Namun demikian, meskipun dapur kamu keren banget, tetap sang koki dan bumbu masaknya yang menentukan masakan itu enak atau tidak. Demikian juga dalam membuat program. Meski IDE-nya canggih, tetap programmer dan API-nya (Application Programming Interface) yang menentukan program yang dihasilkan bagus atau tidak.

Mixed language, campur sari

Those who follow my old technology blog know that most of the time I wrote posts in English. It serves two purposes: targeting wider audience and building my reputation. But the majority of people in my country don't speak English and have a hard time understanding topics written in English, so I left them in the cold. Since my motivation of blogging is also to help my people, I decided to blog:

- basic, conceptual topics in Bahasa Indonesia
- advanced and trending topics in English

Why the "easy" part in Bahasa Indonesia? From my observation, most "newbie" questions are centered around concepts and how to get started. By taking this approach, I hope I can satisfy both sides.

Tuesday, July 13, 2010

Beginning GWT UiBinder

Those who (want to) use Google Web Toolkit (GWT) and following its development must have known that starting version 2, GWT supports declarative (e.g. using markup a'la HTML) user interface building. That technology is called UiBinder.

I'm having a hard time understanding the technology, so I'm going to blog my experience to get a better understanding. Feel free to drop comments so we can learn together.

So what is UiBinder? UiBinder is a feature of GWT to build the "view" (things that are shown to user) of our GWT applications using XML/HTML instead of Java code. You can still use the old way (code) if you want to (e.g. you're a Swing developer).

Let's get down with example. I'm going to build a Web page like this:


I'm using Eclipse with Google Plugin, but basically you can use any IDE (actually I use IntelliJ more). Let's create a new Web Application Project named uibinder-demo.


You can use any package (mine is com.wiradikusuma.tutorial.uibinder), but don't check "Use Google App Engine"—I'm just going to focus on GWT. Click "Finish" to have everything generated, then click the green "play" icon to run it (or right click on the project, "Run As -> Web Application"). Open your browser and verify that your application is indeed running. Good, leave the server running.

Now we're going to add some UiBinder stuff. Open Uibinder_demo.html and empty its body element:



Right click on package com.wiradikusuma.tutorial.uibinder.client and create a new UiBinder named Main. Make sure the UI is based on "GWT widgets" and "Generate sample content" is checked. Click "Finish". Open Uibinder_demo.java in the editor and replace the contents of onModuleLoad to:



Refresh your browser and see that the view has changed to something simpler. Now open Main.ui.xml and replace its contents with this:



Refresh your browser again. Sweet. Now you might be wondering, "Can you show me the Java code equivalent?" Sure! Let's revisit Uibinder_demo.java in the editor and replace the contents of onModuleLoad to:



Refresh your browser and see the same layout, except the content is now Yahoo homepage (to show that we're actually looking at the Java code version). Nice. Let's revert our changes. Open Uibinder_demo.java in the editor and replace the contents of onModuleLoad back to:



So far our useless webapp is working, but ugly. Let's put some style. Open Main.ui.xml and insert the following code just before g:docklayoutpanel:



As you can see, it's pretty much standard CSS. Let's apply the header class:



And the footer class:



Refresh your browser. You can see it's now styled (still ugly, but you get the picture).

Monday, July 5, 2010

DisplayTag and SiteMesh

A friend of mine asked how to use DisplayTag in a Spring-powered webapp decorated with SiteMesh. DisplayTag has been around for a long time and its development has been stopped, but it's still a useful library if you want to quickly generate fancy tables in JSP. This short tutorial's objective is to make something like this:


I assume you're familiar with Java webapps and know to use Maven. Let's get started. First create a webapp project using Maven archetype:

mvn archetype:create -DgroupId=com.wiradikusuma.tutorial -DartifactId=displaytag-sitemesh-demo -DarchetypeArtifactId=maven-archetype-webapp

Edit the generated pom.xml by adding dependencies to Servlet API, JSP API, Spring MVC, SiteMesh and DisplayTag. We don't really need Spring for this very simple demo, but I include it anyway since most likely you will use it in your real webapps. The resulting pom.xml should look like this:


Don't forget to adjust your web.xml to include Spring and SiteMesh:


As for the table itself, here's the code:


name is the model name specified in IndexController. id is to specify variable name for each row (e.g. so you can do ${data.name} inside display:column). export means you want it to allow exporting. requestURI is required if your JSP file is not directly mapped to URL (e.g. stored inside WEB-INF).

You can download the self contained final project here. You can open it from Eclipse (with Maven plugin installed), IntelliJ or NetBeans IDE.