Kamis, 25 November 2010

Simple Demo Jsp Servlet

Kita akan belajar membuat sebuah aplikasi web MVC mengunakan teknologi JSP dan Servlet. Kita akan mengunakan Eclipse (Download) sebagai Java Editor dan Tomcat 6 Download sebagai Web Container.

Aplikasi ini akan menunjukkan betapa mudahnya membuat sebuah aplikasi MVC menggunakan JSP dan Servlet. Aplikasi ini hanya memiliki fungsi login sebagai contoh.

Kita akan mengupas lebih dalam Konsep MVC seiring dengan proses pembuatan.


Baiklah mari segera kita mulai...

Langkah #1 : Membuat sebuah Dynamic Web Project. Buka Eclipse. Klik File -> New -> Other -> Web -> Dynamic Web Project.
 
Berikan nama Project "Simple Login". Klik Finish.

Langkah #2 : Buat halaman LoginEntry.jsp
Klik kanan pada project Pilih New -> JSP. Berikan nama LoginEntry.jsp


<html>
<head>
    <title>SimpleLoginDemo</title>
</head>
<body>
    <form action="LoginServlet" method="post">
        Masukan Nama dan Password<br/>
        Nama  <input type="text" name="txtName" /><br/>
        Password <input type="password" name="txtPassword"/><br/>
        <input type="submit" value="submit"/>  
    </form>
</body>
</html>

Langkah #3 : Buat halaman Sukses.jsp
<html>
<head>
<title>Login Berhasil</title>
</head>
<body>
    <H1>Login Berhasil</H1>
    Name Login : <%= request.getAttribute("name") %> <br/>
    Password Login : <%= request.getAttribute("password") %> <br/>
    Waktu Login : <%= request.getAttribute("logintime") %>    
</body>
</html>

Langkah #4 : Buat halaman Error.jsp
<html>
<head>
<title>Error</title>
</head>
<body>
    <H1>Login Gagal</H1>
    <a href="LoginEntry.jsp">Login Ulang</a>
</body>
</html>

Langkah #5 : Buat Servlet Berikan Nama : LoginServlet
 

 Tambahkan baris kode berikut pada LoginServlet.java yang baru saja dibuat.
package greenhornsjava.controller;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class LoginServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
       
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doPost(request, response);
 }

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String name = request.getParameter("txtName");
  String password = request.getParameter("txtPassword");
  
  if(!name.equals("admin") && !password.equals("admin")) {
   request.getRequestDispatcher("Error.jsp").forward(request, response);
  } else {
   SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
   String now = sdf.format(new Date(System.currentTimeMillis()));
   
   request.setAttribute("name", name);
   request.setAttribute("password", password);
   request.setAttribute("logintime", now);
   request.getRequestDispatcher("Sukses.jsp").forward(request, response);
  }
 }
}

Langkah #6 : Cek File yang berada di Folder WebContent -> WEB-INF -> web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>greenhornsjava.controller.LoginServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
</web-app>

Langkah #7 : Export File menjadi WAR dan deploy di Web Server Anda...
Silahkan mencoba...

Selasa, 23 November 2010

Spring : How to Declarative Transaction

Dalam tulisan ini kita akan mengekspose Spring declarative transaction dengan menggunakan fitur anotation (hanya support di java 1.5 dan seterusnya...)
dan penggunaan SimpleJdbcInsert.


Berikut contoh penggunaan :

BookManagerImpl merupakan class yang mengatur proses DML pada table 'book' pada database 'spring_book'. Object BookManagerImpl akan dibungkus dengan Transaction pada mode 'read-only' secara default. Method insertBooks(List books) akan dioverride dengan mode transaction yang berbeda sehingga setiap kali method ini dipanggil maka akan dibungkus dengan sebuah transaksi yang baru.


CREATE DATABASE spring_book;

CREATE TABLE `book` ( 
 `id`   varchar(10) NOT NULL,
 `name` varchar(50) NOT NULL,
 PRIMARY KEY(`id`)
);
package greenhornsjava.spring.entity;

public class Book {
 private String id;
 private String name;
 
 public Book(String id, String name) {
  this.id = id;
  this.name = name;
 }
 
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 } 
}


package greenhornsjava.spring.trx;

import java.util.List;

public interface BookManager {
 public void insertBooks(List books);
}
package greenhornsjava.spring.trx;

import greenhornsjava.spring.entity.Book;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * BookManagerImpl adalah contoh class yang mengimplementasikan
 * Kemampuan Spring dalam mengatur transaksi secara declarative.
 */
@Transactional(readOnly = true)
public class BookManagerImpl implements BookManager {
 // SimpleJdbcInsert adalah Object JDBC Template yang disediakan oleh Spring Framework 
 private SimpleJdbcInsert insertBook;
 
 public BookManagerImpl(DataSource dataSource) {
  insertBook = new SimpleJdbcInsert(dataSource).withTableName("book");
 }
 
 /**
  * Secara declarative menjadikan method ini 'terbungkus' oleh transaksi baru. 
  * Sehingga jika terjadi Exception maka keseluruhan proses insert pada method ini
  * akan di-rollback.
  */
 @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
 public void insertBooks(List books) {
  for(Object o : books) {
   Book b = (Book) o;
   Map parameters = new HashMap();
   parameters.put("id", b.getId());
   parameters.put("Name", b.getName());
   insertBook.execute(parameters);
  }
 }
 
 public static void main(String[] args) {  
  AbstractApplicationContext context = new FileSystemXmlApplicationContext(
    new String[] { "DataAccessContext.xml" });

  context.registerShutdownHook();

  final BeanFactory bf = (BeanFactory) context;
  BookManager bookManager = (BookManager) bf.getBean("bookManager");
  
  Book b1 = new Book("book1", "Harry Potter");
  Book b2 = new Book("book2", "The Lost Symbol");
  Book b3 = new Book("book3", "The Adv of Donald Duck");
  
  List books = new ArrayList();
  books.add(b1);
  books.add(b2);
  books.add(b3);
  
  // Proses Insert Book akan berhasil dan tercatat secara fisik di DB
  bookManager.insertBooks(books);
  
  Book b4 = new Book("Book4", "The Destination");
  
  List books2 = new ArrayList();
  books2.add(b4);
  books2.add(b1);
  
  // Proses Insert Book akan gagal dan Book dengan id:Book4 tidak akan tersimpan
  // karena method telah 'terbungkus' transaksi
  bookManager.insertBooks(books2);
 }
}

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
    
    <bean id="bookManager" class="greenhornsjava.spring.trx.BookManagerImpl">
        <constructor-arg ref="dataSource" />
    </bean>
    
    <!--  Bagian ini akan memberitahukan container agar men-scan semua
          object/method yang ber-anotasi @Transactional agar transaksinya dimanage
          oleh Spring -->
    <tx:annotation-driven transaction-manager="txManager"/>
    
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/spring_book" />
        <property name="username" value="root" />
        <property name="password" value="keriting" />
    </bean>
    
    <bean id="txManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

Catatan : Object yang akan menggunakan Spring Declarative Transaction HARUS mengimplement sebuah Interface dimana method2 yang dimaksudkan agar 'dibungkus' dengan transaksi dapat dimanage oleh Spring.

Senin, 22 November 2010

Spring : Depedency Injection Framework

Spring merupakan salah satu DI (Depedency Injection) Framework yang sukses dipakai dalam pembangunan Software berbasis Java.
Spring menjembatani class yang berkaitan erat dengan class dependency-nya melalui konfigurasi sehingga lebih loosely couple / tidak terikat.

Berikut contoh penggunaan Spring sebagai DI framework
Class Car dan Plane merupakan parameter constructor untuk class TransportationTest. Dengan menggunakan file external yang dimanage oleh Spring maka keterikatan class TransportationTest dapat dikonfigurasi di file external(xml).

public abstract class Vehicle { 
 public abstract void move(); 
}

public class Car extends Vehicle{ 
 public void move() {
  System.out.println("Driving fast..");  
 } 
}

public class Plane extends Vehicle{ 
 public void move() {
  System.out.println("Flying fast");  
 }
}

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TransportationTest {
 private Vehicle vehicle;
 
 public TransportationTest(Vehicle vehicle) {
  this.vehicle = vehicle;
 }
 
 public void testVehicle() {
  vehicle.move();
 }
 
 public static void main(String[] args) {
  /*  
  // dependency injection tanpa spring menyebabkan 
  // class TransportationTest terikat erat dengan class Car
  // pada saat instantiation  
  Car car = new Car();
  TransportationTest test = new TransportationTest(car);
  test.testVehicle();
  
  // dependency injection tanpa spring menyebabkan 
  // class TransportationTest terikat erat dengan class Plane
  // pada saat instantiation  
  Plane plane = new Plane();
  TransportationTest test2 = new TransportationTest(plane);
  test2.testVehicle();  
  */
  
  // load spring context
  AbstractApplicationContext context = new FileSystemXmlApplicationContext(
    new String[] {"ApplicationContext.xml"});
  
  // gunakan method ini utk mematikan spring container 
  // di lingkungan pengembangan desktop 
  context.registerShutdownHook();
  
  final BeanFactory bf = (BeanFactory)context;
  
  // dependency injection versi spring tidak menyebabkan 
  // class TransportationTest terikat erat dengan class yang 
  // menjadi parameter contructornya (Car ataupun Plane).
  // Parameter constructor dikonfigurasi di file yang di-manage oleh Spring
  TransportationTest test1 = (TransportationTest) bf.getBean("transportationTest1");  
  test1.testVehicle(); 
  
  TransportationTest test2 = (TransportationTest) bf.getBean("transportationTest2");  
  test2.testVehicle();
 }
}

file configurasi : ApplicationContext.xml, letakan di direktori yang sama dengan class TransportationTest
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    
    <bean id="car" class="Car" />
    <bean id="plane" class="Plane" />
    
    <bean id="transportationTest1" class="TransportationTest">
        <constructor-arg ref="car" />
    </bean>
    
    <bean id="transportationTest2" class="TransportationTest">
        <constructor-arg ref="plane" />
    </bean>        
</beans>

Minggu, 21 November 2010

Thread : How to wait() and notify()

Sebuah Thread dapat dihentikan sementara waktu dan memberika kesempatan pada thread yang lain untuk dieksekusi. Thread yang lain dapat men-notify agar thread dengan status 'wait' dapat dijalankan kembali prosesnya.

Berikut contoh penggunaan method wait() dan notify...

Terdapat 3 class masing-masing berfungsi untuk mengenerate Bilangan Ganjil, Genap dan Bulat. Thread Generator Bilangan Genap dan Bulat  akan berhenti jika telah mencapai batas angka tertentu sampai Ketika diakhir proses Generator Bilangan Ganjil akan me-notify Thread Generator Bilangan Bulat dan Genap untuk kembali melanjutkan prosesnya.

public class GeneratorBilanganBulat extends Thread{
 private int maxNumber = 0;
 private double sleepSec = 0;
 private int waitAt ;
 
 public volatile boolean finished = false;
 
 public GeneratorBilanganBulat(int max, double miliSecSleep, int waitAt) {
  maxNumber = max;
  sleepSec = miliSecSleep;
  waitAt = waitAt;
 }

 public void run() {
  try {
   int evenSeq = 1;
   for (int i = 0; i <= maxNumber; i++) {
    System.out.println("BULAT (" + evenSeq++ +") : " + i);
    if(i == waitAt) { 
     synchronized(this) {
      wait();
     }
    }
    sleep((long) (sleepSec*1000));
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}
public class GeneratorBilanganGenap extends Thread{
 private int maxNumber = 0;
 private double sleepSec = 0;
 private int waitFor;
 
 public GeneratorBilanganGenap(int max, double miliSecSleep, int waitFor) {
  maxNumber = max;
  sleepSec = miliSecSleep;
  this.waitFor = waitFor;
 }

 public void run() {
  try {
   int seq = 1;
   for (int i = 0; i <= maxNumber; i++) {
    if(i%2 == 0) {
     System.out.println("GENAP (" + seq++ +") : " + i);
     
     if (i == waitFor) {
      synchronized(this) {
       wait();
      }
     }
     // hentikan proses utk jangka waktu tertentu 
     // jika telah menemukan bilangan genap
     sleep((long) (sleepSec*1000));
    }
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 } 
}

public class GeneratorBilanganGanjil extends Thread{
 private int maxNumber = 0;
 private double sleepSec = 0;
 private GeneratorBilanganGenap genapThread;
 private GeneratorBilanganBulat bulatThread;
 
 public GeneratorBilanganGanjil(int max, double miliSecSleep, 
           GeneratorBilanganGenap genapThread, GeneratorBilanganBulat bulatThread) {
  maxNumber = max;
  sleepSec = miliSecSleep;
  this.genapThread = genapThread;
  this.bulatThread = bulatThread;
 } 
 
 public void run() {
  try {
   int evenSeq = 1;
   for (int i = 0; i <= maxNumber; i++) {
    if(i%2 == 1) System.out.println("GANJIL (" + evenSeq++ +") : " + i);
    
    sleep((long) (sleepSec*1000));
    
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
    
  synchronized(genapThread ) {
   System.out.println("Ganjil sudah selesai lanjutkan dengan yg Genap");
   genapThread.notify();
  }
  synchronized(bulatThread ) {
   System.out.println("Ganjil sudah selesai lanjutkan dengan yg Bulat");
   bulatThread.notify();
  }
 }
}

public class ThreadTest {
 public static void main(String[] args) throws InterruptedException {
  GeneratorBilanganGenap genapThread = new GeneratorBilanganGenap(30, 0.2, 10);
  GeneratorBilanganBulat bulatThread = new GeneratorBilanganBulat(30, 0.2, 20);
  GeneratorBilanganGanjil ganjilThread = new GeneratorBilanganGanjil(30, 0.2, genapThread, bulatThread);
  genapThread.start(); 
  bulatThread.start();
  ganjilThread.start();  
 }
}
untuk dapat menjalankan fungsi wait dan notify maka bentuk umumnya adalah sbb:
synchronized (someObject) {
    someObject.wait();
}

/* different thread / object */
synchronized (someObject) {
    someObject.notify();
}

Perkenalan Thread

Thread merupakan satuan kecil dari proses dalam pemograman Java. Dengan meng-extends Thread atau meng-implements Runnable maka sebuah Class dapat menjadi sebuah Proses yg bisa dieksekusi secara bersamaan dengan Main Thread (Thread utama yang terdapat pada class yg memiliki public static void Main(...) ketika meluncurkan program pertama kali).
Thread digunakan untuk melakukan instruksi khusus yang waktu eksekusinya dapat berbarengan dengan Main Thread.

Statement yang akan dijalankan oleh oleh sebuah Thread di tempatkan pada method run().

public class GeneratorBilanganGenap extends Thread{
 private int maxNumber = 0;
 private double sleepSec = 0;
 private String name;
 
 public GeneratorBilanganGenap(String name, int max, double miliSecSleep) {
  this.name = name;
  maxNumber = max;
  sleepSec = miliSecSleep;
 }

 public void run() {
  try {
   int seq = 1;
   for (int i = 0; i <= maxNumber; i++) {
    if(i%2 == 0) {
     System.out.println("Name : " + name + ", urutan(" + seq++ +") : " + i);
     
     // hentikan proses utk jangka waktu tertentu 
     // jika telah menemukan bilangan genap
     sleep((long) (sleepSec*1000));
    }
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 public static void main(String[] args) {
  // create thread masukan parameter constructor 
  GeneratorBilanganGenap generator1 = new GeneratorBilanganGenap("T1", 20, 0.2);
  GeneratorBilanganGenap generator2 = new GeneratorBilanganGenap("T2", 40, 0.2);
  
  // mulai jalankan thread / proses
  generator1.start();
  generator2.start();
 }
}


Dengan meng-create object Thread tidak serta merta akan menjalankan statement pada method Run(). Agar tereksekusi harus menjalankan method start() pada Thread tersebut.

Catatan : method sleep(long miliseconds), berguna untuk menghentikan proses yg dijalankan thread tersebut dalam jangka waktu tertentu dalam hitungan milisecond.

Selasa, 12 Oktober 2010

Object Inheritance (Bagian 2 - Akhir)

Pada bagian 1 kita telah sebuah super class dan 5 sub class yakni Hippo, Dog, Tiger, Cat, dan Lion. Jika kita melihat class Dog, Tiger, Cat dan Lion maka kita melihat bahwa ke 4 class tersebut memiliki method eat() yang  melakukan fungsi yang sama.
Langkah #3 : Cermati ulang peluang untuk abstraksi yang baru dengan menentukan dua class atau lebih yang memiliki Behavior yang sama.
Dari analisa diatas kita dapat mengetahui bahwa Cat, Lion, Tiger dan Dog dapat di kelompokan menjadi sebuah kelompok class yang baru yakni Carnivora, sedangkan Hippo dapat kita kelompokan sebagai Herbivora.
package greenhornsjava;

public class Carnivora extends Animal{
 public void eat() {
  System.out.println("I eat meats..");
 }
}
package greenhornsjava;

public class Herbivora extends Animal{
 public void eat() {
  System.out.println("I eat vegetables...");
 }
}

Karena method eat() telah kita pindahkan ke class yang baru maka kita dapat menghapus method eat() dari ke 5 class dan mengubah class agar meng-extends super class yang baru sesuai jenis makanan yang dikonsumsi.

package greenhornsjava;

public class Cat extends Carnivora{
 public void makeNoise() {
  System.out.println("Meong, Meong,...");
 } 
}
package greenhornsjava;

public class Dog extends Carnivora{
 public void makeNoise() {
  System.out.println("Guk, Guk,...");
 }
}

package greenhornsjava;

public class Lion extends Carnivora{
 public void makeNoise() {
  System.out.println("Roar, roar,...");
 }
}
package greenhornsjava;

public class Tiger extends Carnivora{
 public void makeNoise() {
  System.out.println("Hauuuum, Hauuum,...");
 }
}
package greenhornsjava;

public class Hippo extends Herbivora{
 public void makeNoise() {
  System.out.println("Guik, Guik,...");
 }
}

Untuk mengetahui prilaku hewan-hewan yang telah kita definisikan. Mari kita membuat sebuah program yang akan mencetak prilaku hewan - hewan di console.

package greenhornsjava;

import java.util.Scanner;

public class AnimalTester {
 public static void main(String[] args) {
  System.out.println("====== Animal Tester =======");
  System.out.println("1.Hippo");
  System.out.println("2.Lion");
  System.out.println("3.Tiger");
  System.out.println("4.Dog");
  System.out.println("5.Cat");
  System.out.println("6.Exit");
  while (true) {
   int option = 0;
   System.out.print("Pilih [1/2/3/4/5/6] : ");
   option = new Scanner(System.in).nextInt();
   switch (option) {
   case 1:
    Hippo hippo = new Hippo();
    System.out.print("makeNoise() : ");hippo.makeNoise();
    System.out.print("eat() : ");hippo.eat();
    System.out.print("sleep() : ");hippo.sleep();
    System.out.print("roam() : ");hippo.roam();
    break;
    
   case 2:
    Lion lion = new Lion();
    System.out.print("makeNoise() : ");lion.makeNoise();
    System.out.print("eat() : ");lion.eat();
    System.out.print("sleep() : ");lion.sleep();
    System.out.print("roam() : ");lion.roam();
    break;
    
   case 3:
    Tiger tiger = new Tiger();
    System.out.print("makeNoise() : ");tiger.makeNoise();
    System.out.print("eat() : ");tiger.eat();
    System.out.print("sleep() : ");tiger.sleep();
    System.out.print("roam() : ");tiger.roam();
    break;
    
   case 4:
    Dog dog = new Dog();
    System.out.print("makeNoise() : ");dog.makeNoise();
    System.out.print("eat() : ");dog.eat();
    System.out.print("sleep() : ");dog.sleep();
    System.out.print("roam() : ");dog.roam();
    break; 
   
   case 5:
    Cat cat = new Cat();
    System.out.print("makeNoise() : ");cat.makeNoise();
    System.out.print("eat() : ");cat.eat();
    System.out.print("sleep() : ");cat.sleep();
    System.out.print("roam() : ");cat.roam();
    break; 
   
   case 6 : return;
   }
  }
 }
}


Berikut Gambar ilustrasi dari method yang dieksekusi pada class yang menggunakan fitur inheritance.

Jadi apa kegunaan INHERITACE bagi kita?
  • Kita dapat menghindari code yang redundant (berulang-ulang didefinisikan). 
  • Tempatkan method yang memiliki kode yang sama ke sebuah super class yang baru dan biarkan subclass yang menjadi turunan dari superclass mewarisi method tersebut. Ketika kalian ingin mengubah behavior dari method, kalian hanya mengubah di subclass tertentu saja.
  • Anda dapat menentukan sebuah protocol umum untuk sekelompok class.
Sekian tutorial dari Inheritance. Semoga dapat membantu. Jika terdapat pertanyaan, silahkan tinggalkan komentar. Saya akan berusaha menjawab secepat mungkin.

Kamis, 07 Oktober 2010

Object Inheritance (Bagian 1)

Pada bagian ini kita akan belajar mengenai salah satu fitur umum dalam OOP yakni INHERITANCE.
Inheritance, dimaksudkan agar sebuah class dapat mewarisi state2x dan behavior dari object supernya. Agar dapat memahami dengan lebih gampang mari kita simak cerita berikut!

Anda diminta untuk membuat sebuah program simulasi prilaku hewan pada sebuah Kebun Binatang.

Langkah awal dalam pembuatan program adalah Design, sebuah sistem yang akan anda berikan nama :
"Sistem Kendali Prilaku Hewan"

Uncle Sam telah memberikan beberapa sample hewan yang akan dimasukan ke dalam sistem kita. Berikut sample-sample hewan yang diberikan :


Anda diberikan kebebasan dalam menentukan spesifikasi yang akan dimasukan ke dalam sistem anda. Mari kita kerjakan!

Langkah #1: Definisikan super class berdasarkan karakteristik umum dari semua hewan (Attribute dan Behaviour) 

Attribute umum dari hewan2 dalam sistem adalah :
picture (gambar hewan), food (jenis makanan yang dikonsumsi), hunger (tingkat lapar) dan location (posisi hewan dalam kebun binatang).

Method umum dari hewan2 dalam sistem adalah :
makeNoise(bersuara), eat(makan) , roam(cara hewan bergerak) dan sleep (cara hewan tidur)

package greenhornsjava;

import java.awt.Image;

public class Animal {
 private Image picture;
 private String food;
 private int hunger;
 private int location;
 
 public Image getPicture() {
  return picture;
 }
 public void setPicture(Image picture) {
  this.picture = picture;
 }
 public String getFood() {
  return food;
 }
 public void setFood(String food) {
  this.food = food;
 }
 public int getHunger() {
  return hunger;
 }
 public void setHunger(int hunger) {
  this.hunger = hunger;
 }
 public int getLocation() {
  return location;
 }
 public void setLocation(int location) {
  this.location = location;
 }
 
 public void makeNoise() { System.out.println("Animal Make Noise."); }
 public void eat() { System.out.println("Animal eat."); }
 public void roam() { System.out.println("Animal Roam.");}  
 public void sleep() { System.out.println("Animal Sleep.");}
}


Langkah #2 : Definisikan kembali method yang spesifik terhadap typenya
package greenhornsjava;

public class Hippo extends Animal{
 public void makeNoise() {
  System.out.println("Guik, Guik,...");
 }
 
 public void eat() {
  System.out.println("Hippo eats vegetables..");
 } 
}

package greenhornsjava;

public class Dog extends Animal{
 public void makeNoise() {
  System.out.println("Guk, Guk,...");
 }
 
 public void eat() {
  System.out.println("Dog eats meats...");
 }
}
package greenhornsjava;

public class Lion extends Animal{
 public void makeNoise() {
  System.out.println("Roar, roar,...");
 }
 
 public void eat() {
  System.out.println("Lion eats meats..");
 } 
}

package greenhornsjava;

public class Cat extends Animal{
 public void makeNoise() {
  System.out.println("Meong, Meong,...");
 }
 
 public void eat() {
  System.out.println("Cat eats meats..");
 } 
}
package greenhornsjava;

public class Tiger extends Animal{
 public void makeNoise() {
  System.out.println("Haummm, Haummm,...");
 }
 
 public void eat() {
  System.out.println("Tiger eats meats ...");
 } 
}
Sekian bagian pertama dari seri Inheritance... jika terdapat pertanyaan silahkan tinggalkan komentar. Terima kasih.

Struktur Class Java

Pada serie tulisan sebelumnya, kita telah membuat sebuah program Java N-Tier yang sedehana. Sekarang mari kita mundur beberapa langkah untuk mengulas dasar-dasar pemograman yang menjadi pondasinya.
Sebuah program pada platform Java tersusun dari berbagai jenis elemen file, misalnya : Java class, file properties, file Xml konfigurasi, dlcs (dan lainnya cari sendiri…). Pada bagian ini kita hanya akan fokus pada Java Class.

Sebuah class pada Java tersusun dari Variable atau State dan Method atau Behavior.
Variable menerangkan hal-hal yang sebuah object ‘ketahui’ (know), sedangkan Method merupakan hal-hal yang sebuah object dapat ‘lakukan’ (does).
"State dari sebuah object dapat mempengaruhi Behavior-nya."
Berikut contoh dari analogi diatas:
package greenhornsjava;

import java.util.Scanner;

public class Duke {
 private int age;

 public void setAge(int age) {
  this.age = age;
 }

 public int getAge() {
  return age;
 }
 
 public void run() {
  if(age < 25) System.out.println("Duke Run Very Fast...");
  else if(age >= 25 && age < 35) System.out.println("Duke Run Fast...");
  else if(age >= 35 && age < 45) System.out.println("Duke Run Slow...");
  else if(age >= 45) System.out.println("Duke Run Very Slow...");
 }
 
 public static void main(String[] arg) {
  Duke duke = new Duke();
  System.out.print("Duke Age : ");
  int dukeAge = new Scanner(System.in).nextInt();
  duke.setAge(dukeAge);
 
  duke.run();
 } 
}

Gambar Struktur Class Java
Sekian ulasan singkat dari struktur class Java. Jika terdapat pertanyaan, silahkan tulis komentar anda, saya akan mencoba untuk menanggapi secepatnya. Terima kasih.

Minggu, 03 Oktober 2010

Menulis Program Aplikasi Java Sederhana (Bagian 3 - Akhir)

Pada tulisan sebelumnya, kita telah menyelesaikan sampai pada tahap 7.2 (lihat roadmap aplikasi), sekarang kita akan menyelesaikan keseluruhan tahap dari aplikasi (baca : Membuat Aplikasi Program Java Sederhana (Bagian 1).

Mari kita mulai ...

Langkah #10 : Membangun View Daftar Pegawai
13. Ubah dan tambahkan code pada class [Menu] agar ketika user memilih 'pilihan 2.Daftar Data Pegawai' maka user akan diarahkan ke menu daftar data pegawai.


private void showMenu(User user, int option) {
  switch(option) {
   case 1 :  showMenuEntryData(); break;
   case 2 : showMenuListData(); break; 
  }
 }
 
 private void showMenuListData() {
  ListData listData = new ListData();
  listData.showData();
 }

14. Buat class [ListData] di package[greenhornsjava.view]
package greenhornsjava.view;

import java.text.SimpleDateFormat;
import java.util.Scanner;
import greenhornsjava.db.InMemoryEmployeeDb;
import greenhornsjava.model.Employee;
import greenhornsjava.util.FileUtil;

public class ListData {
 private final String FILE_DIR = "C:/greenhornsjava/";  
 public void showData() {
  InMemoryEmployeeDb employeeTable = InMemoryEmployeeDb.getInstance();
  if(employeeTable.size() == 0) 
   System.out.println("Tidak Ada Pegawai!");
  else ListAllDataEmployee(employeeTable);
 }
 
 private void ListAllDataEmployee(InMemoryEmployeeDb employeeTable) {
  System.out.println("=======================================");
  for (Employee employee : employeeTable) {
   System.out.println("Nama : " + employee.getNama());
   System.out.println("Alamat : " + employee.getAlamat());
   System.out.printf("Tempat,Tanggal Lahir : %s, %s \n", 
         employee.getTempatLahir(), 
         new SimpleDateFormat("dd/MM/yyyy").format(employee.getTglLahir()));
   System.out.printf("User, Tgl Input: %s, %s \n", 
         employee.getCreatedBy(), 
         new SimpleDateFormat("dd/MM/yyyy").format(employee.getCreatedOn()));
   System.out.println("=======================================");
  }
  
  String reply = null;
  System.out.print("Simpan ke text[Y/N]?");
  reply = new Scanner(System.in).next();
  
  if(reply.equalsIgnoreCase("y")) {
   String fileName = new SimpleDateFormat("yyyyMMdd").
         format(System.currentTimeMillis()) + "_greenhornsjava.txt"; 
   FileUtil.persistArrayToFile(employeeTable, FILE_DIR + fileName);
  }
 }
}

15.Buat class [FileUtil] di package[greenhornsjava.util]
package greenhornsjava.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import greenhornsjava.model.Employee;

public class FileUtil {
 public static void persistArrayToFile(List<Employee> list, String fileName) { 
  FileWriter fstream = null;
  BufferedWriter out = null;
  File file = null;
  String COMMA_SEPARATOR = ",";
  
  try{
   file = new File(fileName);
   fstream = new FileWriter(file);    
   out = new BufferedWriter(fstream);
      
   for (int i=0;i<list.size();i++) {
    Employee employee = list.get(i);
    StringBuffer sb = new StringBuffer();
    sb.append(employee.getNama()).append(COMMA_SEPARATOR)
      .append(employee.getAlamat()).append(COMMA_SEPARATOR)
      .append(employee.getTempatLahir()).append(COMMA_SEPARATOR)
      .append(employee.getTglLahir()).append(COMMA_SEPARATOR)
      .append(employee.getCreatedBy()).append(COMMA_SEPARATOR)
      .append(employee.getCreatedOn());
    
    if( i < (list.size() - 1)) sb.append("\n");
    out.write(sb.toString()); 
   }
  }catch (Exception e){
      System.err.println("Error: " + e.getMessage());
  }finally {
   try {
    out.close();
   } catch (IOException e) {
    System.err.println("Error: " + e.getMessage());
   }
  }
 }
}


Sebelum melanjutkan, mari kita lihat sejenak struktur aplikasi kita sejenak. Pastikan struktur aplikasi anda sama sebelum melanjutkan.


Pada Tutorial Bagian 1 terdapat class [DisplayManager] yang direncanakan sebagai bagian dari Logic pada saat penampilan data yang tidak dibuat, akan tetapi digantikan dengan class [FileUtil] yang dirasakan lebih tepat dibandingkan dengan class [DisplayManager] yang telah direncanakan sebelumnya.
Dalam dunia Software development, perubahan rencana adalah hal yang wajar terjadi. Software yang dikembangkan oleh programmer harus dapat segera beradaptasi dengan perubahan yang ada.

Baiklah Kita telah menyelesaikan tahap akhir dari keseluruhan tahap dari aplikasi. Sekarang tiba saatnya kita menjalankan program yang telah kita tulis. Berikut adalah cuplikan gambar aplikasi.


Pada direktori yang telah ditentukan sebelumnya akan terbentuk sebuah file seperti pada gambar di bawah ini.




Berikut contoh isi dari file text yang digenerate oleh aplikasi :

Toni,Pacung-Bali,Palembang,Thu Aug 19 00:00:00 SGT 1982,admin,Sun Oct 03 22:53:45 SGT 2010
Haris,Dago-Bandung,Medan,Tue Oct 01 00:00:00 SGT 1985,admin,Sun Oct 03 22:54:12 SGT 2010
Frenti,Pacung-Bali,Bandung,Mon Nov 12 00:00:00 SGT 1984,admin,Sun Oct 03 22:54:37 SGT 2010


Sekian lengkap sudah seri "Menulis Program Aplikasi Java Sederhana". Semoga dapat membantu rekan-rekan dalam memahami Java programming secara lebih cepat dengan cara langsung membuat program. 
Jika terdapat saran, kritik atau pertanyaan silahkan tinggalkan pesan atau email. Saya akan mencoba untuk menanggapi secepat mungkin. Terima kasih.

Sabtu, 02 Oktober 2010

Menulis Program Aplikasi Java Sederhana (Bagian 2)

Melanjutkan Bagian 1 Menulis Program Alipkasi Java Sederhana, pada bagian 2 ini, kita akan menambahkan modul Menu dan Data Entry. Modul Menu akan menampilkan 3 pilihan yakni
  1. Entry Data Pegawai

    Modul ini akan menyimpan data pegawai yang dimasukan oleh user ke dalam penyimpanan in-memory, HashMap (Pembahasan lebih lanjut tentang Java Collection akan ditulis pada serie – serie berikutnya). Dan kemudian akan disimpan ke text pada menu Display Data Pegawai.
  2. Display Data Pegawai

    Modul ini akan menampilkan Data Pegawai yang telah diisi sebelumnya. Terdapat fitur [Simpan ke text] sehingga data yang telah disimpan di HashMap dapat disimpan di komputer pengguna dalam bentuk File CSV .
  3. Logout

    Modul ini akan mengarahkan pengguna kembali ke menu login dan menhapus semua data yang terdapat di HashMap.
Baiklah mari kita mulai.

Langkah #4 : Membangun View Menu

7. Buat class [Menu] di package [greenhornsjava.view]
package greenhornsjava.view; 

import greenhornsjava.model.User;
import greenhornsjava.business.EntryDataManager;
import greenhornsjava.business.MenuManager;
import java.util.Scanner;
public class Menu {
 private User user;
 public Menu(User user) {
  this.user = user;
 } 
 public void start() {
  int option;
  while (true) {
   System.out.println("[1].Input Data Pegawai");
   System.out.println("[2].Daftar Data Pegawai");
   System.out.println("[3].Logout");
   System.out.println("========================");
   System.out.print("Pilih Menu[1/2/3] : ");   
   option = Integer.valueOf(new Scanner(System.in).next());   
   MenuManager menuMgr = new MenuManager();
   try {
    menuMgr.verifyEntry(option);
    if(option == 3) {
     logout();
     return;
    }
    showMenu(user, option);
   } catch(Exception e) {
    System.out.println(e.getMessage());
   }
  }
 } 
 private void showMenu(User user, int option) {
  switch(option) {
   case 1 :  showMenuEntryData(); break;
   case 2 : System.out.println("Masuk Menu Daftar Data Pegawai"); break; 
  }
 }
 
 private void showMenuEntryData() {
  EntryData entryData = new EntryData(user);
  entryData.start(); 
 }
 
 private void logout() {
  EntryDataManager entryDataManager = new EntryDataManager();
  entryDataManager.clearAll();
 }
}

Langkah #5 : Membangun Logic Menu

8. Buat class [MenuManager ] di package [greenhornsjava.business]
package greenhornsjava.business; 

public class MenuManager {
 public void verifyEntry(int option) throws Exception {
  if(option == 1) return;
  if(option != 2) return; 
  if(option!= 3) return;  
  throw new Exception("Pilihan menu tidak valid");
 }
}

Ubahlah sebagian code pada [Login.java]




Menjadi berikut :
Menu menu = new Menu(user);
menu.start();

Langkah #6 : Membangun Model Data Pegawai

9. Buat class [Employee] di package [greenhornsjava.model]
package greenhornsjava.model;

import java.io.Serializable;
import java.util.Date;

public class Employee implements Serializable {
 private static final long serialVersionUID = 1L;
 private String nama;
 private String alamat;
 private String tempatLahir;
 private Date tglLahir;
 private Date createdOn;
 private String createdBy;
 
 public Employee() {}
 public Employee(String nama, String alamat, String tempatLahir,
   Date tglLahir, User user) {
  this.nama = nama;
  this.alamat = alamat;
  this.tempatLahir = tempatLahir;
  this.tglLahir = tglLahir;
  this.createdBy = user.getUserName();
  this.createdOn = new Date(System.currentTimeMillis());
 }
 
 public String getNama() {
  return nama;
 }
 public void setNama(String nama) {
  this.nama = nama;
 }
 public String getAlamat() {
  return alamat;
 }
 public void setAlamat(String alamat) {
  this.alamat = alamat;
 }
 public String getTempatLahir() {
  return tempatLahir;
 }
 public void setTempatLahir(String tempatLahir) {
  this.tempatLahir = tempatLahir;
 }
 public Date getTglLahir() {
  return tglLahir;
 }
 public void setTglLahir(Date tglLahir) {
  this.tglLahir = tglLahir;
 }
 public Date getCreatedOn() {
  return createdOn;
 }
 public void setCreatedOn(Date createdOn) {
  this.createdOn = createdOn;
 }
 public String getCreatedBy() {
  return createdBy;
 }
 public void setCreatedBy(String createdBy) {
  this.createdBy = createdBy;
 }
 
 public String toString() {
  return nama;
 }
}


Langkah #7 : Membangun In-Memory Database Pegawai

10. Buat class [InMemoryEmployeeDb] di package [greenhornsjava.db]
package greenhornsjava.db;

import greenhornsjava.model.Employee;
import java.util.ArrayList;

public class InMemoryEmployeeDb extends  ArrayList {
 private static InMemoryEmployeeDb fakeEmployeeTable = new InMemoryEmployeeDb();
 private InMemoryEmployeeDb() { }
 public static InMemoryEmployeeDb getInstance() {
  return (InMemoryEmployeeDb) fakeEmployeeTable;
 }
}

Langkah #8 : Membangun View Data Entry

11. Buat class [EntryData] di package [greenhornsjava.view]
package greenhornsjava.view;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import greenhornsjava.business.EntryDataManager;
import greenhornsjava.model.Employee;
import greenhornsjava.model.User;

public class EntryData {
 private User user;
 public EntryData(User user) {
  this.user = user;
 }

 public void start() {
  while(true) {
   String nama = null;
   String alamat = null;
   String tempatLahir = null;
   Date tglLahir = new Date(System.currentTimeMillis());
   String response = null;   
   System.out.println("Entry Data Pegawai");
   System.out.println("------------------");
   System.out.print("Nama : ");
   nama = new Scanner(System.in).next(); 
   
   System.out.print("Alamat : ");
   alamat = new Scanner(System.in).next();  
   
   System.out.print("Tempat Lahir : ");
   tempatLahir = new Scanner(System.in).next(); 
   
   while (true) {
    System.out.print("Tanggal Lahir(dd/MM/yyyy) : ");
    try {
     tglLahir = new SimpleDateFormat("dd/MM/yyyy").parse(new Scanner(System.in).next());
     break; 
    } catch (ParseException e) {
     System.out.println("Format tanggal salah.");
    }
   }
   
   System.out.print("[S]impan atau E[x]it?");
   response = new Scanner(System.in).next();    
   if(response.equalsIgnoreCase("x")) return;
   
   EntryDataManager entryDataManager = new EntryDataManager();
   entryDataManager.save(new Employee(nama, alamat, tempatLahir, tglLahir, user));   
   
   System.out.print("[L]anjut Entry atau E[x]it?");
   response = new Scanner(System.in).next();
   
   if(response.equalsIgnoreCase("x")) return;
  }  
 }
}

Langkah #9 : Membangun Logic Data Entry

12. Buat class [EntryDataManager] di package [greenhornsjava.business]
package greenhornsjava.business;

import greenhornsjava.db.InMemoryEmployeeDb;
import greenhornsjava.model.Employee;

public class EntryDataManager {

 public void save(Employee employee) {
  InMemoryEmployeeDb.getInstance().add(employee); 
  
  for (Employee emp : InMemoryEmployeeDb.getInstance()) {
   System.out.println(emp.getNama());
  }
 }
 
 public void clearAll() {
  InMemoryEmployeeDb.getInstance().clear();
 }
 
}

Sebelum melanjutkan, mari kita lihat sejenak struktur aplikasi kita sejenak. Pastikan struktur aplikasi anda sama sebelum melanjutkan.


Kita telah menyelesaikan tahap (4),(5),(6),(7.1) dan (7.2) dari keseluruhan tahap dari aplikasi. Sekarang tiba saatnya kita menjalankan program yang telah kita tulis. Pastikan program berjalan dengan baik seperti Gambar dibawah.


Sekian tutorial 'Menulis Program Aplikasi Java Sederhana (Bagian 2)'. Jika terdapat saran, kritik atau pertanyaan silahkan tinggalkan pesan atau email. Saya akan mencoba untuk menanggapi secepat mungkin. Terima kasih.

Kamis, 30 September 2010

Penjelasan Menulis Program Aplikasi java Sederhana (Bagian 1)

Salam berbagi...
Dikarenakan pada tulisan Menulis Program Aplikasi Java Sederhana Bag.1 terlalu panjang, maka penjelasan pada seri tersebut saya tuliskan khusus agar pembaca dapat mengerti secara lebih detail konsep dari aplikasi tersebut.
Contoh Aplikasi Java Sederhana yang disertakan merupakan aplikasi dengan arsitektur bertumpuk(N-Tier application), artinya aplikasi disusun berdasarkan tumpukan-tumpukan modul yang masing-masing memiliki fungsi dan sifatnya sendiri-sendiri.

Pada contoh yang saya bawakan terdapat 3 lapisan yakni :
  1. Lapisan Tampilan (View/Presentation Layer)
  2. Lapisan Business (Business Logic Layer)
  3. Lapisan Model (Data Model Layer)
N-Layer

Agar lebih jelas mari kita bahas satu per satu beserta implementasinya di contoh program tersebut.
  1. Lapisan Tampilan (View Layer)

    Lapisan ini merupakan lapisan Graphical User Interface (GUI) yang berfungsi menyambungkan user ke dalam bisnis aplikasi. Lapisan pada aplikasi ini cenderung tidak memiliki proses bisnis/logic yang berat (thin) di dalamnya dan hanya berfungsi untuk menampilkan data atau fungsi-fungsi interaksi seperti Klik sebuah tombol, menampilkan data pada table, input data sebuah entity atau model, dll…
    Pada contoh aplikasi, class yang berada di lapisan ini adalah class-class dibawah package [greenhornsjava.view] yakni untuk sementara : Login.java 
  2. Lapisan Business (Business/Logical Layer)

    Lapisan ini merupakan lapisan dimana semua proses bisnis dilakukan. Lapisan ini berfungsi memisahkan business logic dari lapisan modul lainnya. Class-class pada layer ini cenderung penuh (fat), berisikan fungsi logical bisnis saling berhubungan satu dengan yang lainnya. Class pada layer ini juga menghubungkan class-class pada Lapisan View dengan lapisan Model.
    Pada contoh aplikasi , class yang berada pada lapisan ini berada dibawah package [greenhorsjava.business] yakni untuk sementara : LoginManager.java
  3. Lapisan Model (Data Model Layer)

    Lapisan ini merupakan lapisan entity data. Model layer biasanya berisikan POJO (Plain Old Java Object) yang mendeskripsikan entity bisnis. Model terkadang dipergunakan sebagai mimic dari table sebuah database yakni object dengan property yang mendekati definisi table dalam sebuah table (Lebih lanjut lihat -> Object Relational Mapping).
    Pada contoh aplikasi, model digunakan sebagai entity bisnis, yang di-parsing sebagai informasi yang akan diproses pada Lapisan Bisnis. Dalam aplikasi, class model diletakan dibawah package [greenhornsjava.model]
Sekian penjelasan dari arsitektur yang digunakan dalam Contoh aplikasi pada tulisan Menulis Program Aplikasi Java Sederhana (Bagian 1). Semoga dapat membantu dalam memahami tulisan dan contoh yang disertakan. Jika terdapat pertanyaan, saran, kritik.. silahkan tinggalkan komen atau email saya. Terima kasih.

Menulis Program Aplikasi Java Sederhana (Bagian 1)

Kali ini kita akan membuat sebuah program sederhana. Aplikasi akan dijalankan di console/command prompt. Pada akhir keseluruhan bagian ini diharapkan pembaca dapat memperoleh 'kesan' pertama yang nyaman dan terpacu untuk dapat terus belajar menggali fitur-fitur lain dalam bahasa pemograman ini.
Baiklah mari segera kita mulai...!!!

Aplikasi terdiri dari :
1.Modul Login; modul ini akan muncul setiap kali pengguna mengakses aplikasi pertama kali atau setelah logout dari menu pilihan.
2.Modul menu Pilihan; modul ini akan muncul setiap kali pengguna berhasil login. modul ini berfungsi untuk mengarahkan user ke Modul Entry Data pegawai, Modul Daftar Pegawai atau kembali lagi ke mudul Login.
3.Modul Entry Data Pegawai; modul ini berfungsi menyimpan dan mengedit data yang di simpan di dalam memory. Modul juga akan melakukan validasi - validasi yang diperlukan sebelum dapat di simpan.
4.Modul Daftar pegawai; modul ini akan menampilkan semua data pegawai yang telah diinput, dan juga dapat diekspor ke bentuk file dengan format .txt.

Sebelum dapat mengikuti, berikut hal-hal yang sudah harus terinstal di dalam komputer anda:
1. JDK versi terbaru : [ Download di sini ] .
Untuk mengecek apakah JDK sudah terinstal dengan sukses ketik perintah berikut di Command Prompt : java -version.


2. Eclipse For Java Developer [ Download di sini ]


Berikut Roadmap Aplikasi sebagai patokan proses pembuatan aplikasi. Saya akan menjelaskan langkah per langkah sesuai dengan urutan pada gambar di bawah.


Baiklah mari segera kita MULAI....

Langkah #1 : Menyiapkan Project dan menbuat Titik awal aplikasi (Launcher)  
1. Buat sebuah Java Project.








2. Berikan nama SimpleDataEntry. Klik Finish.























3. Buat class [Launcher] dalam package greenhornsjava. Class ini merupakan titik awak dari aplikasi. Perhatikan Gambar dibawah. Masukan nama class dan package di kolom text yang benar.





















package greenhornsjava;
import greenhornsjava.view.Login;
public class Launcher {
 public static void main(String[] args) {
  System.out.println("==== Simple Data entry ====");
  Login login = new Login();
  login.start();
 }
}

Langkah #2 : Membangun View/Tampilan Login Aplikasi
4. Buat class [Login] di package [greenhornsjava.view]
package greenhornsjava.view;
import greenhornsjava.model.User;
import greenhornsjava.business.LoginManager;
import java.util.Scanner;
public class Login {
 public void start() {
  while(true) {
   String okExit = null;
   String userName = null;
   String password = null;   
   System.out.println("====== Login ======");
   System.out.print("User : ");
   userName = new Scanner(System.in).next();   
   System.out.print("Password : ");
   password = new Scanner(System.in).next();
   System.out.println("===================");
   System.out.print("[O]K atau E[x]it");
   okExit = new Scanner(System.in).next();   
   try {
    if(okExit.equalsIgnoreCase("o")) {
     User user =  doLogin(userName, password);     
     System.out.println("Selamat Datang!");
     System.out.println("===============");
     System.out.println("User : " + user.getUserName());
     System.out.println("Password : " + user.getPassword());
     System.out.println("===============");
     System.out.println("Kode ini akan diganti dengan object Menu");
     System.out.println("===============");     
    } else return;
   } catch(Exception e) {
    System.out.println(e.getMessage());
   }
  }  
 } 
 private User doLogin(String userName, String password) throws Exception{
  LoginManager loginManager =  new LoginManager();
  
  loginManager.verifyEntry(userName, password);
  return loginManager.authenticateUser(userName, password);
 }
}

Langkah #3 :Mendesign Logic Login Aplikasi

5. Buat class [LoginManager] di package [greenhornsjava.business]
package greenhornsjava.business; 
import greenhornsjava.model.User;
public class LoginManager{
 private final String USER_NAME = "admin";
 private final String PASSWORD = "password"; 
 public void verifyEntry(String userName, String password) throws Exception{
  if(userName == null || userName.trim().length() == 0)
   throw new Exception("User is null or empty");  
  if (password == null || password.trim().length() == 0)
   throw new Exception("Password is null or empty");
 } 
 public User authenticateUser(String userName, String password) throws Exception {
  if (userName.equalsIgnoreCase(USER_NAME) && password.equalsIgnoreCase(PASSWORD))
   return new User(userName, password);  
  throw new Exception("Wrong User or Password");
 }
}

6. Buat class [User] di package [greenhornsjava.model]
package greenhornsjava.model;
public class User {
 private String userName;
 private String password;
 public User() { }
 public User(String userName, String password) {
  this.userName = userName;
  this.password = password;
 } 
 public void setUserName(String userName) {
  this.userName = userName;
 } 
 public String getUserName() {
  return this.userName;
 } 
 public void setPassword(String password) {
  this.password = password;
 } 
 public String getPassword() {
  return this.password;
 }
}

Sebelum melanjutkan, mari kita lihat sejenak struktur aplikasi kita sejenak. Pastikan struktur aplikasi anda sama sebelum melanjutkan.



Kita telah menyelesaikan tahap 1, 2 dan 3 dari keseluruhan tahap dari aplikasi. Sekarang tiba saatnya kita menjalankan program yang telah kita tulis. Tekan tanda

yang berada di  jejeran toolbar untuk menjalankan program...

Berikut hasil dari kompilasi program...(masukan user : admin, password : password untuk bisa melewati menu login...)

Sekian tutorial 'Menulis Program Aplikasi Java Sederhana (Bagian 1)'. Jika terdapat saran, kritik atau pertanyaan silahkan tinggalkan pesan atau email. Saya akan mencoba untuk menanggapi secepat mungkin. Terima kasih.

Selasa, 28 September 2010

Pelajaran #1 : Cara kerja bahasa java


Untuk memahami Java, anda perlu mengetahui bagaimana program berbasis java dapat dijalankan di komputer.

Berikut adalah langkah-langkahnya sesuai urutan nomor pada gambar di atas:

1. Program java adalah serangkaian object yang ditulis dalam sebuah file berekstensi .java yang saling beriteraksi satu sama lainya membentuk serangkaian proses tertentu untuk mencapai tujuan yang telah ditetapkan sebelumnya.

2. Selayaknya bahasa pemograman lainnya, program yang ditulis dalam syntax(definisi : http://en.wikipedia.org/wiki/SYNTAX ) tertentu harus diverifikasi  dan diolah oleh compiler (definisi : http://en.wikipedia.org/wiki/Compile_%28computing%29 ).

3. Hasil kompilasi program java membentuk file-file berekstensi .class. File ini menyimpan instruksi-instruksi spesifik yang hanya dapat dipahami oleh mesin virtual java.

4. Mesin Virtual Java, JVM (definisi : http://en.wikipedia.org/wiki/JVM ) yang terinstal dalam komputer pengguna akan mengubah file .class menjadi instruksi-instruksi  yang dapat dipahami oleh komputer untuk dijalankan.

5. Program berbasis Java dapat dijalankan di hampir di semua platform OS. Hal ini merupakan salah satu keistimewaan yang sangat menguntungkan bagi para programmernya. Dengan tersedianya JVM dalam hampir di semua versi OS komputer maka motto "write once run everywhere", merupakan senjata ampuh sekaligus pemacu semangat dalam belajar bahasa pemograman ini.

Sekian penjelasan singkat tentang cara kerja  bahasa pemograman Java dari proses pembuatan sampai dapat dijalankan di komputer pengguna. Terima kasih.

Mengapa belajar Java 'SULIT'!!.. dan Mengapa kalian 'PERLU' membaca ini dulu...?? (sebelum melanjutkan...)


Belajar Java SULIT..!! Ya...!! Bagi sebagian orang yang pernah mencoba untuk menguasai bahasa pemograman ini, bukanlah hal yang mudah, termasuk SAYA dulunya...


Fitur, tehnik, kemampuan bahasa yang sangat kaya merupakan kelebihan dan juga 'kekurangan' dari Java...
 

Tulisan-tulisan dalam blog ini dimaksudkan agar pembaca di level Pemula dan Menengah dapat belajar dan memahami kompleksitas dari bahasa pemograman Java sehingga dapat secara penuh memanfaatkan fitur-fiturnya.
Topik-topik pada tulisan akan membahas konsep dan tahap demi tahap dengan contoh yang akan memudahkan proses pembelajaran.


Jika terdapat pertanyaan-pertanyaan mengenai topik yang dibahas silahkan tinggalkan komentar dan saya akan mencoba memberikan solusinya..

Akhirnya... selamat mengikuti...!!