Video Tutorial Pemrograman Database Menggunakan Java dan Hibernate Framework 4


Kode : VT007
Judul : Pemrograman Database Menggunakan Java dan Hibernate Framework 4
Pencipta : Eko Kurniawan Khannedy, S.Kom.
Kategori : Pemrograman Java, Sistem Basis Data
Tingkat Keterampilan : Mahir, Ahli
Harga : Rp.-
Rilis : Februari 2012 

Object Relational Mapping merupakan teknik pemrograman yang memetakan sebuah objek dengan database. ORM merupakan ‘jembatan’ penghubung antara objek yang dibuat dalam program dengan database. ORM membuat Anda tidak perlu lagi menggunakan querySQL untuk memanipulasi data di database. Anda hanya perlu memanipulasi objek, dan otomatis ORM akan memanipulasikan data di database sesuai dengan objek yang dimanipulasi.

Hibernate adalah salah satu framework opensource untuk Object Relational Mappingyang paling populer. Karena kehebatan Hibernate, banyak bahasa pemrograman lain yang mengimplementasikan arsitektur Hibernate, seperti NHibernate untuk .NET Framework dan Doctrine untuk PHP.

Video tutorial Pemrograman Database Menggunakan Java dan Hibernate Framework 4 merupakan panduan lengkap belajar pemrograman database menggunakan Java dan Hibernate Framework versi 4. Video ini akan memandu Anda belajar teknik ORM, konfigurasi Hibernate, pemetaan entitas, pemetaan relasi, melakukan query sampai optimisasi Hibernate. 

Lihat Daftar Isi Video Tutorial.

Iklan

Servlet 3 – Menambahkan Data ke Session


Session merupakan tempat yang dapat kita gunakan untuk menyimpan data, namun data yang ada dalah Session tidaklah permanen, data tersebut akan hilang secara otomatis ketika pengguna menutup aplikasi perambah yang digunakan atau jika pengguna lama tidak melakukan interaksi dengan website, misal selama 30 menit. Session biasa digunakan untuk menyimpan data sementara, contohnya dalam ecommerce biasanya terdapat keranjang belanja, dan biasanya keranjang belanja di simpan dalam sebuah session. Dan contoh-contoh yang lainnya. Kali ini kita akan mencoba melakukan proses penambahan data yang disimpan dalam session menggunakan Servlet 3.

Pertama kita buat halaman HTML untuk menampilkan form input data, misal data orang dengan input data “nama depan”, “nama belakang”, “tanggal lahir” dan “email”.

<!doctype html>
<html>
    <head>
        <title>Session</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <h1>Input Data</h1>
        <form action="Session" method="post">
            <table>
                <tbody>
                    <tr>
                        <td>Nama Depan :</td>
                        <td><input type="text" name="nama_depan"/></td>
                    </tr>
                    <tr>
                        <td>Nama Belakang :</td>
                        <td><input type="text" name="nama_belakang"/></td>
                    </tr>
                    <tr>
                        <td>Tanggal Lahir :</td>
                        <td><input type="text" name="tanggal_lahir"/></td>
                    </tr>
                    <tr>
                        <td>Email :</td>
                        <td><input type="text" name="email"/></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td><input type="submit" value="Simpan"/></td>
                    </tr>
                </tbody>
            </table>
        </form>
    </body>
</html>

Setelah itu kita buat Servlet untuk menampung data yang dimasukkan dari halaman HTML yang telah dibuat :

package khannedy.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "Session", urlPatterns = {"/Session"})
public class SessionServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        @SuppressWarnings("unchecked")
        List<Object[]> list = (List<Object[]>) request.getSession().getAttribute("data");

        if (list == null) {
            list = new ArrayList<Object[]>();
            request.getSession().setAttribute("data", list);
        }

        Object[] objects = new Object[4];
        objects[0] = request.getParameter("nama_depan");
        objects[1] = request.getParameter("nama_belakang");
        objects[2] = request.getParameter("tanggal_lahir");
        objects[3] = request.getParameter("email");

        list.add(objects);

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet SessionServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Daftar Data</h1>");
            out.println("<table border='1'>");
            out.println("<thead>");
            out.println("<tr>");
            out.println("<td>Nama Depan</td>");
            out.println("<td>Nama Belakang</td>");
            out.println("<td>Tanggal Lahir</td>");
            out.println("<td>Email</td>");
            out.println("</tr>");
            out.println("</thead>");
            out.println("<tbody>");

            for (Object[] data : list) {
                out.println("<tr>");
                out.println("<td>" + data[0] + "</td>");
                out.println("<td>" + data[1] + "</td>");
                out.println("<td>" + data[2] + "</td>");
                out.println("<td>" + data[3] + "</td>");
                out.println("</tr>");
            }

            out.println("</tbody>");
            out.println("</table>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

Hasilnya :

Screenshot-Session - Google Chrome

Screenshot-Session - Google Chrome

Screenshot-Servlet SessionServlet - Google Chrome

Screenshot-Servlet SessionServlet - Google Chrome

Konfigurasi Java Persistence API 2 Tanpa Menggunakan XML


Java Programming

Java Programming

Tadi ada yang bertanya, gimana caranya setting koneksi database secara dinamis di JPA, biasanya kan pake XML, dan setelah dibuild projectnya, maka gak bisa diubah lagi secara dinamis. Dia ingin menggunakan koneksi secara dinamis, jadi pengguna bisa menginputkan koneksi manual melalui form.

Ketika JPA versi 1, hal ini tidak dapat dilakukan. JPA 1 masih menggunakan XML untuk melakukan konfigurasinya. Namun sejak versi JPA 2, kita dapat melakukan konfigurasi secara dinamis tanpa menggunakan XML, Caranya?

Pertama biasanya kita Membuat persistence.xml seperti dibawah ini :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="DynamicJPAPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/sample"/>
      <property name="javax.persistence.jdbc.password" value="app"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.user" value="app"/>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

Sekarang hapus bagian konfigurasi koneksi ke database, sehingga menjadi seperti dibawah ini :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="DynamicJPAPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <properties>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

Sekarang, untuk membuat EntityManagerFactory-nya, maka kita perlu menggunakan parameter untuk melakukan koneksi, contohnya dibawah ini :

Map<String, String> map = new HashMap<String, String>();
map.put("javax.persistence.jdbc.url", "jdbc:derby://localhost:1527/sample");
map.put("javax.persistence.jdbc.password", "rahasia");
map.put("javax.persistence.jdbc.driver", "org.apache.derby.jdbc.ClientDriver");
map.put("javax.persistence.jdbc.user", "ekoganteng");

EntityManagerFactory factory = Persistence.createEntityManagerFactory("SamplePU", map);

Dan parameter-parameter tersebut bisa diisi melalui form atau apapun. Selamat mencoba 😀

Memanfaatkan ConcurrentLinkedQueue sebagai Manajeman Tugas yang Multithreaded


Membangun sistem yang multithreaded tidaklah mudah, banyak sekali yang harus diperhatikan, seperti syncronisasi resource yang digunakan antar thread sampai jangan sampai terjadi deadlock pada sistem yang dibangun. Contohnya jika kita membangun sebuah sistem berbasis client-server, maka otomatis server harus dapat menangani permintaan client yang terjadi secara bersamaan.

Misal ada sebuah Bank, bank tersebut tidak melakukan sistem antrian untuk nasabah yang datang ke Bank tersebut, sehingga nasabah dapat seenaknya datang ke teller. Bisa dibayangkan apa yang akan terjadi saat teller hanya ada 5 dan nasabah sekaligus datang sebanyak 50 orang, maka bisa dipastikan teller akan kewalahan menanganinya, bahkan bisa jadi teller salah melakukan pelayanan.

Namun berbeda jika Bank tersebut menggunakan sistem antrian, maka otomatis dengan begitu, satu teller akan menangani satu nasabah. Bahkan walaupun pada Bank tersebut hanya ada satu teller, maka jika yang datang ada 100, maka teller tersebut tetap dapat menanganinya karena adanya sistem antrian, sehingga hanya satu nasabah yang dapat datang ke teller, dan nasabah yang lainnya harus menunggu sampai nasabah yang berada didepannya selesai bertransaksi dengan teller.

Sekarang kembali ke topik…

Misal kita membangun sebuah sistem berbasiskan client-server, dimana terdapat sebuah server dan banyak client. Client dapat melakukan permintaan ke server, permintaan tersebut bisa berupa request data atau perintah menjalankan tugas. Request dari client bisa datang kapan saja, sehingga bisa saja pada saat yang bersamaan beberapa client melakukan request ke server. Jika kita tidak menggunakan sistem antrian, maka kejadian pada Bank sebelum menggunakan proses antrian dapat terjadi. Dengan begitu perlu dilakukan sistem antrian pada sistem server, sehingga proses request dari client dapat dieksekusi satu per satu oleh server.

Dalam java, struktur data antrian adalah Queue, namun Queue tidaklah thread safe. Karena sistem yang dibangun berbasiskan miltithread, maka kita dapat menggunakan ConcurrentLinkedQueue, yang merupakan Queue thread safe.

package khannedy.learning.queue;

import java.util.concurrent.ConcurrentLinkedQueue;

public class Server implements Runnable {

	private ConcurrentLinkedQueue<Tugas> queue = new ConcurrentLinkedQueue<Tugas>();
	private Thread thread;

	public Server() {
		thread = new Thread(this);
	}

	public void tambahTugas(Tugas tugas) {
		queue.offer(tugas);
	}

	public void startServer() {
		thread.start();
	}

	public void stopServer() {
		thread.interrupt();
	}

	@Override
	public void run() {
		while (!thread.isInterrupted()) {
			Tugas tugas = queue.poll();
			if (tugas != null) {
				// eksekusi tugas...
			}
		}
	}

}

Kode diatas adalah contoh sederhana dari sistem server, metode startServer() digunakan untuk menjalankan server, metode stopServer() digunakan untuk menghentikan server dan metode tambahTugas(Tugas) digunakan untuk menambah tugas, metode tambahTugas(Tugas) digunakan oleh client untuk menambahkan tugas ke server.

Insert Data Dengan ResultSet


Biasanya ResultSet digunakan untuk meload data hasil query, tapi tahukan bahwa ResultSet juga dapat digunakan untuk menambah data ke dalam database, sehingga kita tidak perlu lagi menggunakan perintah INSERT INTO BLA BLA BLA

Connection connection = DatabaseUtilities.createConnection();

Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet resultSet = statement.executeQuery("SELECT * FROM mahasiswa");

Saat createStatement diatas, kita menggunakan parameter ResultSet.TYPE_SCROLL_INSENSITIVE dan ResultSet.CONCUR_UPDATEABLE, TYPE_SCROLL_INSENSITIVE artinya bahwa result set yang akan kita buat tidak sensitive terhadap perubahan yang terjadi pada result set, sedangkan CONCUR_UPDATEABLE artinya bahwa result set yang kita buat dapat melakukan proses pengubahan data (dimana disini kita akan melakukan penambahan data).

resultSet.moveToInsertRow();
resultSet.updateString("nim", "10106033");
resultSet.updateString("nama_depan", "Eko Kurniawan");
resultSet.updateString("nama_belakang", "Khannedy");
resultSet.updateDate("tanggal_lahir",
new Date(System.currentTimeMillis()));
resultSet.insertRow();

Untuk menambah data sebuah baris, maka kita menggunakan metode moveToInsertRow() milik ResultSet. Setelah itu maka kita perlu menambahkan data-data tiap kolomnya, dimana pada kode diatas saya menambahkan data kolom nim, nama_depan, nama_belakang dan tanggal_lahir.

Jika proses penambahan data tiap kolomnya telah selesai, maka untuk menyimpan perubahan kita perlu memanggil mettode insertRow(). Dan setelah itu, otomatis data yang kita tambahkan akan masuk ke database tanpa menggunakan perintah INSERT INTO BLA BLA BLA

Full code :

Connection connection = DatabaseUtilities.createConnection();

Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet resultSet = statement.executeQuery("SELECT * FROM mahasiswa");

resultSet.moveToInsertRow();
resultSet.updateString("nim", "10106033");
resultSet.updateString("nama_depan", "Eko Kurniawan");
resultSet.updateString("nama_belakang", "Khannedy");
resultSet.updateDate("tanggal_lahir",
new Date(System.currentTimeMillis()));
resultSet.insertRow();

resultSet.close();
statement.close();
connection.close();

Servlet sebagai Controller dan JSP sebagai View


pada tulisan ini saya akan membahas tentang cara develop web yang baik jika menggunakan servlet + jsp. hampir mirip dengan konsep model view controller, dimana disini controller dibuat menggunakan servlet, view dibuat menggunakan jsp dan model nya adalah terserah anda, yang penting dia merepresentasikan sebuah data 😀

pertama, buatlah project java web application menggunakan netbeans. disini saya menggunakan glassfish versi 3, karena tomcat belum mendukung servlet 3.

kedua, karena saya menggunakan database, jadi saya buat koneksi ke database menggunakan jdbc, sengaja saya menggunakan jdbc, tidak menggunakan hibernate atau jpa, karena banyak temen-temen yang menyarankan untuk menggunakan jdbc saja, karena banyak yang belum mengerti jpa atau hibernate.

ketiga, saatnya membuat controller. seperti saya bilang sebelumnya, kalau controller menggunakan servlet, jadi disini anda perlu membuat servlet. servlet ini berguna untuk mengambil data dari database dan menyimpannya dalam model, dimana setelah itu data dalam model akan ditampilkan menggunakan jsp.

keempat, setelah data diambil dari database lewat servlet, tampilkan data tersebut menggunakan jsp, sehingga jsp disini berperan sebagai view.

terakhir, setelah semuanya selesai, saatnya menjalankan java web application tersebut.

teknik ini sangat baik digunakan, sehingga kode yang kita buat tidak bercampur aduk antar view dan controller. karena kebanyakan biasanya seseorang menumpuk proses bisnis logic seperti load data dalam jsp, sehingga kodenya akan bertumpuk seluruhnya di jsp. hal ini bisa dilakukan namun tidak direkomendasikan, karena jika web aplikasi sudah besar, maka hal ini akan membuat kode yang kita buat sulit dimengerti. oleh karena ini diperlukan pemisahan antara bisnis logic dan antarmuka, dimana bisnis logic dilakukan di servlet dan antarmuka dilakukan di jsp 😀

silahkan download sourcecodenya disini :

http://swing-usu.googlecode.com/files/hr.sql
http://swing-usu.googlecode.com/files/servlet-jsp.zip

Logging dalam Java, Apa dan Kenapa?


Logging? Penebangan? Haha, bukan itu maksudnya 😀

Logging yang dimaksud disini adalah cara yang sistematis dan terkendali untuk merepresentasikan keadaan tahapan-tahapan aplikasi pada saat aplikasi tersebut berjalan. Hmmm…. maksudnya? 😀

Sederhananya seperti ini, biasanya saat kita ingin mendeteksi apa yang terjadi dalam program, biasanya kita menampilkan tulisan pada console dengan perintah :

System.out.println(“isi informasi”);

misal, kita membuat program penjualan, biasanya agar kita mengetahui apa yang terjadi dalam program kita menyelipkan informasi logging seperti :

“membuat barang baru”
“barang baru berhasil dibuat”
“mengambil data barang dari database”

dan sebagainya, sesuai dengan yang kebutuhan kita 😀 Hal inilah yang dinamakan logging, artinya logging ini cara yang biasa kita gunakan untuk merepresentasikan keadaan tahapan-tahapan aplikasi yang sedang berjalan, tujuan dilakukan proses logging ini tentunya agar kita tau apa yang terjadi dalam program, sehingga jika ada kesalahan dalam program kita bisa mengetahuinya 😀

Kenapa Perlu Teknologi Lain?

kalo kita bisa menggunakan logging menggunakan perintah System.out.println(), kenapa kita perlu teknologi yang lainnya?

hal ini dikarenakan target untuk System.out.println() adalah console, artinya jika kita membuat program yang berbasiskan antarmuka, maka hasil dari System.out.println() tidak akan terlihat 😀 Hal ini karena memang kita tidak menggunakan console 😀

hal ini bisa kita akali dengan cara menggunakan Java IO, sehingga kita tidak menggunakan System.out.println() lagi, melainkan menggunakan Java IO, tapi itu artinya kita harus membuat proses logging yang baru lagi 😦

atau jika kita ingin seluruh proses logging ditampilkan dalam database, maka artinya kita harus menggunakan JDBC, dan artinya lagi-lagi kita harus buat proses logging dari awal lagi 😦

hal ini membuat proses logging secara manual seperti ini sangat melelahkan…. oleh karena itu kita perlu teknologi lain untuk proses logging, namanya Java Logging!

Java Logging

java logging merupakan teknologi logging yang secara default ada dalam jdk, sehingga tidak perlu menginstall plugin atau framework apapun untuk menggunakannya. seluruh class-class java logging terdapat pada paket java.util.logging.*

secara sederhana, java logging dapat digambarkan sebagai jembatan penghubung antara aplikasi dan target lokasi logging, artinya hanya dengan menggunakan java logging, kita dapat dengan mudah mengubah target loggingnya, misal kita ingin menjadikan console sebagai target loggingnya, artinya seluruh trace logging akan ditampilkan dalam console. atau kita ingin target loggingnya ke file, maka seluruh trace logging akan disimpan dalam file. selain itu kita juga dapat menggunakan target target yang berbeda secara bersamaan menggunakan java logging.

Java Logging

Java Logging

dengan fasilitas java logging yang seperti itu, maka proses logging akan sangat menyenangkan 😀 tidak lagi membosankan dan tidak akan memakan waktu lama 😀

Ingat! Tuliskan Seluruh Informasi Yang Diperlukan Pada Saat Membuat Logging, Agar Kita Tahu Apa Yang Sedang Terjadi Dengan Aplikasi Kita

Praktek!

misal saja kita membuat program yang sederhana, yaitu melakukan perulangan 0 sampai 9 😀

package khannedy.standard.logging;

import java.util.logging.Logger;

public class SimpleLogging {

	public static void main(String[] args) {
		Logger logger = Logger.getLogger("Eko Keren :D");
		logger.info("aplikasi berjalan");

		logger.info("melakukan perulangan");
		for (int i = 0; i < 10; i++) {
			logger.info("nilai i sekarang " + i);
		}
		logger.info("perulangan selesai");

		logger.info("aplikasi selesai");
	}

}

untuk membuat logger, caranya kita menggunakan kelas java.util.logging.Logger dengan menggunakan static class getLogger(“nama logger”). Dan untuk menampilkan informasi kita bisa menggunakan metode info(“informasi”), atau untuk menampilkan warning kita bisa menggunakan metode warning(“warning”) dan yang lainnya.

jika dijalankan, maka hasil programnya adalah :

May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: aplikasi berjalan
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: melakukan perulangan
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 0
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 1
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 2
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 3
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 4
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 5
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 6
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 7
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 8
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: nilai i sekarang 9
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: perulangan selesai
May 12, 2010 11:34:41 PM khannedy.standard.logging.SimpleLogging main
INFO: aplikasi selesai

secara default target lokasinya adalah console, tapi anda bisa merubahnya dengan cara mengubah Handler-nya :

package khannedy.standard.logging;

import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;

public class SimpleLogging {

	public static void main(String[] args) throws Exception {
		Logger logger = Logger.getLogger("Eko Keren :D");

		Handler handler = new FileHandler("file-log.log");
		logger.addHandler(handler);

		logger.info("aplikasi berjalan");

		logger.info("melakukan perulangan");
		for (int i = 0; i < 10; i++) {
			logger.info("nilai i sekarang " + i);
		}
		logger.info("perulangan selesai");

		logger.info("aplikasi selesai");
	}

}

dimana java logging support beberapa handler, yaitu :

  1. java.util.logging.FileHandler, ini menulis logging ke file
  2. java.util.logging.ConsoleHandler, ini menulis logging ke console
  3. java.util.logging.StreamHandler, ini menulis logging ke stream
  4. java.util.logging.MemoryHandler, ini menulis logging ke memory
  5. java.util.logging.SocketHandler, ini menulis logging ke jaringan socket menggunakan protokol TCP/IP.

bagaimana kalo kita ingin logging nya disimpan ke database?

kita bisa membuat class logging sendiri, dengan cara membuat class turunan baru dari class java.util.logging.Handler

😀

JAMU (Java MeetUp) JUG-Bandung 8 Mei 2010


Java User Meetup atau JaMU adalah acara yang diadakan oleh Java User Group untuk belajar bersama mengenai sebuah topik dalam teknologi berbasis Java. JUG Bandung juga akan menginisiasi pengadaan acara serupa secara rutin untuk komunitas pengguna Java di kota Bandung dan tidak tertutup juga untuk kota-kota lain di provinsi Jawa Barat.

Tema yang diangkat kali ini adalah mengenai Google Web Toolkit (GWT). GWT adalah sebuah perangkat pengembangan aplikasi internet menggunakan AJAX. Topik ini akan dibawa oleh Muhammad Ghazali (Pengurus JUG Bandung)

Selain dari sharing knowledge tersebut, akan ada acara ramah tamah anggota komunitas dan juga sharing/brainstorming visi, misi, dan kegiatan JUG Bandung.

Acara akan diadakan pada

Hari : Sabtu, 8 Mei 2010

Waktu : 09.00 pagi s.d. selesai

Tempat: Ruang 7602, Gedung Labtek Benny Subianto lt. 3 Institut Teknologi Bandung

Kehadiran tidak dipungut biaya.
Harap konfirmasi kehadiran di

http://www.facebook.com/event.php?eid=113889095314931

Milis JUG-Bandung :

http://groups.google.co.id/group/jug-bandung