Rabu, 16 Mei 2012

SQLite Pada Android

Pada tutorial kali ini kita akan membahas tentang management database menggunakan SQLite pada Android, SQLite bukanlah sebuah sistem yang mandiri yang berkomunikasi dengan sebuah program, melainkan sebagai bagian integral dari sebuah program secara keseluruhan. Sehingga protokol komunikasi utama yang digunakan adalah melalui pemanggilan API secara langsung melalui bahasa pemrograman. Referansi SQLite http://id.wikipedia.org/wiki/SQLite

Beruntung android sudah meyertakan API SQLite jadi kita tidak perlu mendownload API nya lagi, lets we begin.

Project Struktur

Pertama kita buat databasenya beri nama DatabaseHelper.java
package com.samz.sqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

 public static final String DATABASE_NAME = "employee_directory";
 private final static String TABLES[] = { "id","name" };

 public DatabaseHelper(Context context) {
  super(context, DATABASE_NAME, null, 1);
 }

 @Override
 public void onCreate(SQLiteDatabase db) {

 }

 public void createEmployeeTable(SQLiteDatabase db) {
  db.execSQL("CREATE TABLE if not exists employee (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);");
 }

 public void insertData(SQLiteDatabase db, String name) {
  ContentValues contentValues = new ContentValues();
  contentValues.put("Name", name);
  db.insert("employee", null, contentValues);
 }

 public void editData(SQLiteDatabase db, String name) {
  ContentValues contentValues = new ContentValues();
  contentValues.put("name", name);
  db.update("employee", contentValues, "name =" + name, null);
 }

 public void deleteData(SQLiteDatabase db, String name) {
  db.delete("employee", "name =" + name, null);
 }

 public Cursor getAll(SQLiteDatabase db) {
  return db.query("employee", TABLES, null, null, null, null, null);
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  //db.execSQL("DROP TABLE IF EXISTS employee");
  //onCreate(db);
 }

}

Lalu kita buat UI-nya, disini kita masukan TextBox, Button simpan dan ListView (untuk menampilkan data)
modifikasi main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
  <TextView 
      android:id="@+id/idText"
      android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="test"
         android:visibility="gone"/>
        <EditText
            android:id="@+id/nameText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="@string/name" >
        </EditText>
    </LinearLayout>
 
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    <Button
        android:id="@+id/btnSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/save" >
    </Button>
    <Button
        android:id="@+id/btnUpdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/update" >
    </Button>
    </LinearLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>

</LinearLayout>
Pada code diatas terlihat android:text="@string/save ini mangacu pada file strings.xml untuk mencegah hardcode, file srings.xml


    Nama
    Simpan
    SQLite Test


Lalu disinilah logic nya
ListViewActivity.java
package com.samz.sqlite;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.Toast;

public class ListViewActivity extends ListActivity {

 protected EditText nameText;
 protected Button btnSave;
 protected SQLiteDatabase db;
 protected DatabaseHelper dbHelper;
 protected ListAdapter adapter;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  dbHelper = new DatabaseHelper(this);
  db = dbHelper.getWritableDatabase();
  dbHelper.createEmployeeTable(db);

  nameText = (EditText) findViewById(R.id.nameText);
  btnSave = (Button) findViewById(R.id.btnSave);

  getAll();
  buttonEvenListener();

 }

 private void buttonEvenListener() {
  btnSave.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    String names = nameText.getText().toString().trim();
    dbHelper.insertData(db, names);
    Toast.makeText(ListViewActivity.this, "Success",
      Toast.LENGTH_SHORT).show();
    nameText.setText("");
    getAll();
   }
  });
 }

 private void getAll() {
  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, getAllDatas());
  setListAdapter(adapter);
 }

 public List<String> getAllDatas() {
  List<String> names = new ArrayList<String>();
  Cursor cursor = dbHelper.getAll(db);

  cursor.moveToFirst();
  while (!cursor.isAfterLast()) {
   String name = cursor.getString(1);
   names.add(name);
   cursor.moveToNext();
  }
  // close cursor
  cursor.close();
  Collections.sort(names);
  return names;
 }

}

Run, Run As "Android Application", lalu akan muncul sebagai berikut

Untuk dapat melihat data yang sudah tersimpan, kita dapat melihatnya di SQLite Manager ini digunakan pada browser firefox. Link untuk adds on SQLite Manager mozilla disini atau dapat dibrowse langsung dari mozilla. Setelah selesai di install untuk membuka aplikasinya pilih di mozilla menu Tools > SQLite Manager, akan tampil sbb

Bagaimana cara mengunakannya? pertama Pull database terlebih dahulu Open perspective di eclipse lalu Window > Show View > Other > Android lalu pilih File Explorer, database tersimpan di folder /data/data/your.app.package/databases/your-db-name lalu klik dipojok kanan atas Pull a file from a device lalu Save.
Selesai disave pada SQLite Manager pilih Database > Connect Database pilih file yang di Pull
Selamat Mencoba semoga bermanfaat
Download Source Code disini
Kunjungi situs kami di PT Samz Solution

Kamis, 10 Mei 2012

Form Pada Android

Pada tutorial kali ini akan membuat form atau UI(User Interface) di android, mulai dari TextView, EditText, Button, Spinner(DropDown List), dll


Pada tutorial ini menggunakan Eclipse 3.7 dan Android 2.2
Buat project android beri nama UIAndroid, untuk mengetahui bagaimana membuat project android ada pada tutorial sebelumnya (Memulai Project Android).

Buka main.xml dan modifikasi menjadi sebagai berikut
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/textView" >
    </TextView>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onButtonClicked"
        android:padding="10dp"
        android:text="@string/button" >
    </Button>

    <EditText
        android:id="@+id/editText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/editText" >
    </EditText>

    <EditText
        android:id="@+id/passwordText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword" 
        android:hint="@string/password">
    </EditText>
    
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </Spinner>

    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onCheckboxClicked"
        android:text="@string/checkItOut" >
    </CheckBox>

    <RadioGroup
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <RadioButton
            android:id="@+id/radioRed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onRadioButtonClicked"
            android:text="@string/red" >
        </RadioButton>

        <RadioButton
            android:id="@+id/radioBlue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onRadioButtonClicked"
            android:text="@string/red" >
        </RadioButton>
    </RadioGroup>

    <ToggleButton
        android:id="@+id/toggleButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onToggleClicked"
        android:textOff="@string/vibrateOff"
        android:textOn="@string/vibrateOn" >
    </ToggleButton>

</LinearLayout>

Pada code diatas terdapat fill_parent dan wrap_content pada component attribute layout_width atau layout_height.
fill_parent - menjelaskan bahwa component ini akan mengikuti panjang dari parentnya atau mengisi ruang yang tersisa dari si parent
wrap_content - menjelaskan bahwa component yang akan ditampilkan berdasarkan besaran dari dirinya sendiri misalkan dari isi text
android:hint="@string/editText" Text hint pada Edit text, isinya mengacu pada file strings.xml pada folder res/values

Secara umum, menentukan lebar dan tinggi tata letak menggunakan unit seperti piksel tidak dianjurkan. Sebaliknya, menggunakan pengukuran relatif seperti density-independent pixel units (dp), wrap_content, atau fill_parent, adalah yang lebih baik, karena membantu memastikan bahwa aplikasi akan ditampilkan dengan benar di berbagai ukuran layar perangkat

Text View
UIAndroid
Button
Edit Text
Password
Check it out
Merah
Biru
Vibrate off
Vibrate on    

Dan sekarang pada bagian javanya, buka file UIAndroidActivity.java modifikasi filenya
package com.samz.uiandroid;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.ToggleButton;

public class UIAndroidActivity extends Activity {

 private Spinner spinner;
 private EditText editText;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  editTextAction();
  addItemsOnSpinner();
 }

 // button click
 public void onButtonClicked(View v) {
  Toast.makeText(UIAndroidActivity.this, "Button clicked",
    Toast.LENGTH_SHORT).show();
 }

 // edit text
 public void editTextAction() {
  editText = (EditText) findViewById(R.id.editText);
  editText.setOnKeyListener(new OnKeyListener() {
   public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    // Aksi jika tekan enter
    if ((event.getAction() == KeyEvent.ACTION_DOWN)
      && ((keyCode == KeyEvent.KEYCODE_ENTER))) {
     Toast.makeText(UIAndroidActivity.this, editText.getText(),
       Toast.LENGTH_SHORT).show();
     return true;
    }
    return false;
   }
  });

 }

 // Tambah item pada spinner
 public void addItemsOnSpinner() {
  spinner = (Spinner) findViewById(R.id.spinner);
  List<String> list = new ArrayList<String>();
  list.add("list 1");
  list.add("list 2");
  list.add("list 3");
  ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_spinner_item, list);
  dataAdapter
    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  spinner.setAdapter(dataAdapter);
 }

 // check box click
 public void onCheckboxClicked(View v) {
  if (((CheckBox) v).isChecked()) {
   Toast.makeText(UIAndroidActivity.this, "Selected",
     Toast.LENGTH_SHORT).show();
  } else {
   Toast.makeText(UIAndroidActivity.this, "Not selected",
     Toast.LENGTH_SHORT).show();
  }
 }

 // radio button click
 public void onRadioButtonClicked(View v) {
  RadioButton rb = (RadioButton) v;
  Toast.makeText(UIAndroidActivity.this, rb.getText(), Toast.LENGTH_SHORT)
    .show();
 }

 // toggle click
 public void onToggleClicked(View v) {
  if (((ToggleButton) v).isChecked()) {
   Toast.makeText(UIAndroidActivity.this, "Toggle on",
     Toast.LENGTH_SHORT).show();
  } else {
   Toast.makeText(UIAndroidActivity.this, "Toggle off",
     Toast.LENGTH_SHORT).show();
  }
 }

}
Selamat mencoba semoga bermanfaat.
Download source code disini

Reference
http://developer.android.com/resources/tutorials/views/hello-formstuff.html

Kunjungi situs kami di PT Samz Solution

Selasa, 08 Mei 2012

Memulai Project Android

Pada tutorial ini akan membahas bagaimana memulai untuk mendevelop aplikasi android, kita tidak memerlukan handphone android untuk mendevelop aplikasi ini. Tutorial ini akan memabahas pertama kali membuat project dengan Android.

Untuk memulai aplikasi ini eclipse harus sudah terinstal Android, jika belum maka ikuti cara untuk menginstal disini

Create Android Virtual Device (AVD)
Konfigurasi AVD di eclipse Klik Window -> AVD Manager


Create Project Android

Setelah next maka akan menampilkan project struktur sbb :

Run Project, Run As Android Application

main.xml


    



Terlihat code android:text="@string/hello" ini me-refer kepada file strings.xml dimana file strings.xml tampaknya berfungsi seperti file .properties dimana semua string didaftarkan disini

strings.xml


    Hallo Androiiiiiiid
    HelloWorld



HelloWorldActivity.java
package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
kita dapat memodifikasi file ini, setContentView(R.layout.main) pada file diatas mengacu pada file main.xml, modifikasi file HelloWorldActivity.java menjadi
package com.samz.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloWorldActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textView = new TextView(this);
        textView.setText("Hallo ini project pertama android");
        setContentView(textView);
    }
}
Jalankan program klik kanan project Run As "Android Application", jika berhasil akan menampilkan sebagai berikut


Kunjungi situs kami di PT Samz Solution

Senin, 07 Mei 2012

Design Pattern

Pada kali ini kita akan membahas tentang design pattern, dimana dalam merancang sebuah aplikasi harus ditentukan dahulu design apa yang akan kita gunakan agar nantinya dapat memudahkan dalam proses perbaikan dan pengembangan,

Ada beberapa design pattern diantaranya MVC Pattern, Singleton Pattern, Prototype Pattern, Abstract Factory Pattern, Builder Pattern.

1. MVC (Model View Controller) Pattern
MVC pertama sekali dipublikasikan oleh peneliti Xeroc Parac yang bekerja dalam pembuatan bahasa pemrograman smalltalk tahun 1970-1980. Design ini adalah salah satu design pattern yang sering kita dengar dan bicarakan dan biasanya design ini banyak diimplementasikan dalam framework berbasis web. MVC adalah design dasar yang memisahkan ketiga bagian program menjadi tiga layer, yaitu :
1. Model, bagian yang memodelkan problem domain
2. View, bagian tampilan(jsp, jsf, zkoss) bagian yang berinteraksi dengan user, mengandung keseluruhan detail dari implementasi user interface
3. Controller, bagian ini menyediakan detail alur program dan transisi layer, dan juga bertanggungjawab akan penampungan events yang dibuat oleh user dari View dan melakukan update terhadap komponen Model menggunakan data yang dimasukkan oleh user.

2. Singleton Pattern
Singleton adalah pattern yang membatasi instance sebuah kelas menjadi satu object. Terkadang suatu sistem akan berjalan lebih efisien jika hanya ada satu atau beberapa object saja. Singleton pattern diimplementasikan dengan membuat class dengan method yang membuat instance class yang baru jika instance belum ada maka akan diarahkan ke object yang telah ada. Untuk mencegah object tidak di instance kan berkali – kali maka constructor dirubah menjadi private atau protected.
Contoh :
public class SingletonPattern {
 private static SingletonPattern singletonPattern;

 private SingletonPattern() {
 }

 public static SingletonPattern getInstance() {
  if (singletonPattern == null) {
   singletonPattern = new SingletonPattern();
  }
  return singletonPattern;
 }
}
Penggunaan
public class Test {
 public static void main(String args[]) {
  SingletonPattern s = SingletonPattern.getInstance();
 }
}

Kunjungi situs kami di PT Samz Solution

Jumat, 04 Mei 2012

Spring Hibernate dan JSF


Pada tutorial kali ini kita akan membuat aplikasi berbasis web dengan Spring-Hibernate dengan menggunakan FrontEnd JSF 2.0 menggunakan Primeface, dan pada tutorial kali ini kita akan menggunakan Maven, sebelum memulai tutorial ada baiknya mempersiapkan tools dan teknologi yang akan digunakan

Tools dan Teknologi yang digunakan :
1. Eclipse 3.7 (Indigo)
2. Apache Tomcat 6 atau 7
3. PostgreSQL 9.0 (boleh diganti dengan database lain sesuai keinginan)
4. Hibernate 3.2.1
5. Spring 3.0.5
6. Apache Maven 2.x


Membuat Table Customer
CREATE TABLE customer
(
  customer_id bigint NOT NULL,
  customer_name character varying(50),
  address character varying(50),
  created_date timestamp without time zone,
  created_by character varying(24),
  last_updated timestamp without time zone,
  last_updated_by character varying(24),
  deleted smallint,
  CONSTRAINT pk_customer PRIMARY KEY (customer_id)
)
WITH (
  OIDS=TRUE
);
Sequence untuk autogenerate code
CREATE SEQUENCE customer_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 4
  CACHE 1;
Project Struktur


Memulai project maven, pilih File -> New -> Project -> Maven -> Maven Project lalu pilih Next sehingga muncul sbb :





pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/maven-v4_0_0.xsd">
 
    <modelVersion>4.0.0</modelVersion>
    <groupId>application</groupId>
    <artifactId>application</artifactId>
    <packaging>war</packaging>
    <version>1.0</version>
    <name>application</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <org.springframework.version>3.0.5.RELEASE</org.springframework.version>
    </properties> 
 
    <repositories>         
      <repository>  
            <id>prime-repo</id>  
            <name>PrimeFaces Maven Repository</name>  
            <url>http://repository.primefaces.org</url>  
            <layout>default</layout>  
        </repository>
     <repository>
        <id>java.net.m2</id>
        <name>java.net m2 repo</name>
        <url>http://download.java.net/maven/2</url>
     </repository>
    </repositories>
 
    <dependencies>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>3.0.5.RELEASE</version>
        </dependency>
      
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.10</version>
        </dependency>
        
        <!-- Hibernate core -->
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate</artifactId>
    <version>3.2.7.ga</version>
  </dependency>
  
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>3.0.0.ga</version>
  </dependency>
  
  <!-- Hibernate core library dependecy start -->
  <dependency>
    <groupId>dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>1.6.1</version>
  </dependency>
  
  <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
  </dependency>
  
  <dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
  </dependency>
  
  <!-- Hibernate core library dependecy end -->
  
  <!-- Hibernate query library dependecy start -->
  <dependency>
    <groupId>antlr</groupId>
    <artifactId>antlr</artifactId>
    <version>2.7.7</version>
  </dependency>
  <!-- Hibernate query library dependecy end -->
        
        <!-- POSTGRESSQL -->
        <dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>8.4-701.jdbc4</version>
  </dependency>
  
  <!-- MySQL database driver -->
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.9</version>
  </dependency>
  
  <!-- JSF -->
  <dependency>
       <groupId>com.sun.faces</groupId>
       <artifactId>jsf-api</artifactId>
       <version>2.0.4-b09</version>
     </dependency>
 
     <dependency>
       <groupId>com.sun.faces</groupId>
       <artifactId>jsf-impl</artifactId>
       <version>2.0.4-b09</version>
     </dependency>
      
      <!--<dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.0.0-b13</version>
      </dependency>-->
   
     <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
     </dependency>
  
     <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
     </dependency>
    
     <!-- PrimeFace -->
  <dependency>  
            <groupId>org.primefaces</groupId>  
            <artifactId>primefaces</artifactId>  
            <!--<version>2.2.1</version>-->  
            <version>3.0.M3</version>
        </dependency>
     <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>aristo</artifactId>  
      <version>1.0.1</version>  
  </dependency> 
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>eggplant</artifactId>  
      <version>1.0.1</version>  
  </dependency> 
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>humanity</artifactId>  
      <version>1.0.1</version>  
  </dependency> 
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>glass-x</artifactId>  
      <version>1.0.1</version>  
  </dependency> 
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>overcast</artifactId>  
      <version>1.0.1</version>  
  </dependency> 
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>smoothness</artifactId>  
      <version>1.0.1</version>  
  </dependency> 
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>pepper-grinder</artifactId>  
      <version>1.0.1</version>  
  </dependency>
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>mint-choc</artifactId>  
      <version>1.0.1</version>  
  </dependency>
  <dependency>  
      <groupId>org.primefaces.themes</groupId>  
      <artifactId>sunny</artifactId>  
      <version>1.0.1</version>  
  </dependency>
   
  <!-- el feature of EL 2.2 for tomcat-->
  <dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
      </dependency>
      
  <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
  </dependency>
    
  <dependency>
         <groupId>log4j</groupId>
         <artifactId>log4j</artifactId>
         <version>1.2.14</version>
     </dependency>
   </dependencies> 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version> 
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
           </plugins>
        <finalName>application</finalName>
    </build> 
</project>
Copy pom.xml tersebut diatas agar lib - lib yang dibutuhkan dapat didownload oleh maven, inilah salah satu fungsi maven mendaftarkan lib - lib yang dibutuhkan di pom.xml lalu maven yang akan mendownloadnya otomatis library yang didaftarkan ke komputer kita

Lalu ke step selanjutnya, buat file properties dengan nama db.properties dan DataSource.xml untuk koneksi ke database
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/samz
jdbc.username=postgres
jdbc.password=postgres
File : DataSource.xml di src/main/resources/config/spring/beans

 
 
   
     WEB-INF/classes/config/db.properties
   

 
  
 
 
 
 
   

Selesai membuat script koneksi selanjutnya buat model kelas dan hbm
File : Customer.java
package com.application.model;

import java.util.Date;

public class Customer{
 
 public long customerId;
 public String name;
 public String address;
 public Date createdDate;
//generate getter &setter
//klik kanan Source > Generate Getter and Setter, Select All lalu OK
}

File : Customer.hbm.xml

     
        
            
             
              customer_id_seq
        
                   
        
        
    

Daftarkan file hbm diatas tersebut di HibernateSessionFactory.xml (src/main/resources/config/spring/beans)

 


 
    
      
    
 
    
       
         org.hibernate.dialect.PostgreSQLDialect
         true
       
    
 
    
 
          com/application/hibernate/Customer.hbm.xml
 
      
 



Yes it done,
Lalu sekarang kita buat Management Data Access(DAO) dimana file inilah yang akan berperan dalam mengatur data access atau query, segala query hibernate kita taro di DAO layer ini
Lets go!!!!
Pertama - tama kita buat interface dari DAO
File : CustomerDao.java (src/main/java/com/application/dao)
package com.application.dao;
 
import java.util.List;
import com.application.model.Customer;
 
public interface CustomerDao{
 
 void addCustomer(Customer customer);
 
 List<Customer> findAllCustomer();
 
}
Implementasikan interface DAO diatas, di file inilah kita akan membuat query
File : CustomerDaoImpl.java berada di folder src/main/java/com/application/dao
package com.application.dao;
 
import java.util.Date;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.application.model.Customer;
 
public class CustomerDaoImpl extends 
       HibernateDaoSupport implements CustomerDao{
 
 public void addCustomer(Customer customer){ 
  customer.setCreatedDate(new Date());
  getHibernateTemplate().save(customer);
 
 }
 
 @SuppressWarnings("unchecked")
 public List<customer> findAllCustomer(){ 
  return getHibernateTemplate().find("from Customer"); 
 }
}

CustomerService.java berada di folder src/main/java/com/application/service
package com.application.service;
 
import java.util.List;

import com.application.model.Customer;
 
public interface CustomerService{
 
 void addCustomer(Customer customer);
 
 List<Customer> findAllCustomer();
 
}
CustomerServiceImpl.java berada di folder src/main/java/com/application/service
package com.application.service;
 
import java.util.List;

import com.application.dao.CustomerDao;
import com.application.model.Customer;
 
public class CustomerServiceImpl implements CustomerService{
 
 CustomerDao customerDao;
 
 public void setCustomerDao(CustomerDao customerDao) {
  this.customerDao = customerDao;
 }
 
 public void addCustomer(Customer customer){ 
  customerDao.addCustomer(customer); 
 }
 
 public List<Customer> findAllCustomer(){ 
  return customerDao.findAllCustomer();
 }
}
Kenapa memakai service? salah satu gunanya untuk pengkapsulan DAO

Setelah itu buat Controller disinilah tempat untuk bisnis logic,
CustomerBean.java berada di folder src/main/java/com/application/beans
package com.application.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;

import com.application.model.Customer;
import com.application.service.CustomerService;

public class CustomerBean implements Serializable {

 /**
  * 
  */
 private static final long serialVersionUID = 3051005476848367530L;

 // DI via Spring
 CustomerService customerService;

 public String name;
 public String address;


 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getAddress() {
  return address;
 }

 public void setAddress(String address) {
  this.address = address;
 }

 public void setCustomerService(CustomerService customerService) {
  this.customerService = customerService;
 }

 // get all customer data from database
 public List<Customer> getCustomerList() {
  List<Customer> customers = customerService.findAllCustomer();
  if (customers.isEmpty()) {
   customers = new ArrayList<Customer>();
  }
  return customers;
 }

 // redirect to form
 public void listForm() {
  FacesContext fc = FacesContext.getCurrentInstance();
  NavigationHandler nav = fc.getApplication().getNavigationHandler();
  nav.handleNavigation(fc, null,
    "/pages/customer/customerList?faces-redirect=true");
  fc.renderResponse();
 }

 public void inputForm() {
  FacesContext fc = FacesContext.getCurrentInstance();
  NavigationHandler nav = fc.getApplication().getNavigationHandler();
  nav.handleNavigation(fc, null,
    "/pages/customer/customerInput?faces-redirect=true");
  fc.renderResponse();
 }

 // Tambah customer data ke database
 public void addCustomers() {
  Customer cust = new Customer();
  cust.setName(getName());
  cust.setAddress(getAddress());
  customerService.addCustomer(cust);
  clearForm();
  FacesContext fc = FacesContext.getCurrentInstance();
  NavigationHandler nav = fc.getApplication().getNavigationHandler();
  nav.handleNavigation(fc, null,
    "/pages/customer/customerList?faces-redirect=true");
  fc.renderResponse();
 }

 // clear form values
 private void clearForm() {
  setName("");
  setAddress("");
 }
}

Daftarkan Service dan Dao di CustomerBean.xml berada di folder src/main/resources/com/application/spring

 
    
     
    
     
    
     
    
 

Dan ini adalah viewnya untuk List
customerList.xhtml berada di folder src/main/webapp/pages/customer

 
  
 

 
Lalu kita ke Springnya buat file applicationContext.xml di folder WEB-INF


 
 
 
 
 
 
 


faces-config.xml berada di folder WEB-INF

    
    
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
     
       config.messages
       msg
     
   
 
  customer
  com.application.beans.CustomerBean
  request
  
   customerService
   #{customerService}
  
  


Dan ini web.xml

 
 Web Application
  
  
   
  org.springframework.web.context.ContextLoaderListener
 
 
 
  org.springframework.web.context.request.RequestContextListener
 
 
 
  org.springframework.security.web.session.HttpSessionEventPublisher
 
 
 
     org.springframework.web.util.Log4jConfigListener
 
 
 
 
 
    com.sun.faces.expressionFactorycom.sun.el.ExpressionFactoryImpl
 
 
 
     javax.faces.PROJECT_STAGEDevelopment
  
    
      30
    
   
 
 
 
        faces/pages/customer/customerList.xhtml
        
   
   
  
  
       primefaces.THEMEaristo
 
  
  
    Faces Servlet
    javax.faces.webapp.FacesServlet
    1
  
  
        Resource Servlet
        org.primefaces.resource.ResourceServlet
    
    
        Resource Servlet
        /primefaces_resource/*
    
 
   
  
    Faces Servlet
    /faces/*
  
  
    Faces Servlet
    *.jsf
  
  
    Faces Servlet
    *.faces
  
  
    Faces Servlet
    *.xhtml
  

 
 
  contextConfigLocation/WEB-INF/applicationContext.xml
   


Download source code disini
Kunjungi situs kami di PT Samz Solution

Reference
http://www.mkyong.com

Kamis, 03 Mei 2012

Membuat Project Dengan Maven

Pada Tutorial sebelumnya kita telah mengetahui cara instalasi Maven di eclipse , sekarang bagaimana caranya kita membuat aplikasi web dengan maven.

Pilih menu File > New > Project > lalu pilih Maven dan Next akan tampil

Pilih Next lalu ketik dibagian filter maven-archetype-webapp lalu pilih Next

Isikan groupId : namaPackage(com)
artifacId : namaProject(webapplication) lalu Finish

Selanjutnya mempersiapkan application server, pada tutorial ini menggunakan Apache Tomcat 7 jika belum ada bisa download disini. Pada menu eclipse pilih Window > Show View > Other lalu pilih Server lalu Ok, akan muncul Tab Server di eclipse, klik kanan untuk new Server

Dan akan muncul pilihan server

Pilih Apache Tomcat 7 dan klik Next akan muncul tomcat instalation directory

Step Selanjutnya adalah Add Project pada Server agar project bisa dijalankan

Maka akan muncul sebagai berikut :

Jika project tidak muncul maka klik kanan pada project pilih Properties dan pada Project Facet centang Dinamic Web Module
Klik Further configuration available akan muncul seperti gambar dibawah dan pada content directory ubah menjadi src/main/webapp lalu Ok

Jalankan project, klik kanan webapplication Run As > Run on Server, jika berhasil akan tampil
Atau ketik pada web browser http://localhost:8080/webapplication untuk dapat melihat di web browser

Bagaimana cara membuat .war nya? ini dapat dilakukan pada command console, Run pada window lalu ketik cmd lalu ketik mvn clean package lalu enter
Tunggu sampai maven membuat .war file, lalu cek di project pada folder target maka akan tercipta webapplication.war
Bagaimana cara mendeploynya di application server tomcat?
copy webapplication.war ke C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps selesai dicopy jalankan Tomcat7.exe atau Tomcat7w.exe pada folder C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin dan ketik pada browser http://localhost:8080/webapplication

Selamat mencoba semoga bermanfaat.
Kunjungi situs kami di PT Samz solution

Rabu, 02 Mei 2012

Maven Tutorial

Maven adalah sebuah software dan tool yang komprehensif untuk project management. Konsep dasar dari Maven adalah Project Object Model (POM), dimana Maven dapat membangun, membuat laporan, dan dokumentasi dari sebuah project, Situs resmi apache maven untuk dapat mendownload apache maven

Pada tutorial ini akan menjelaskan tentang instalasi maven pada windows dan eclipse

Install pada windows
Tambahkan JAVA_HOME di environtment variable, pastikan kita sudah menginstal JDK

Download Maven
Download apache maven zip file di link ini pada tutorial ini menggunakan maven 3.0.4, selesai di download extract di C:\apache-maven-3.0.4 atau di D:\apache-maven-3.0.4 atau dimana saja berada, lalu tambahkan di environtment variable windows agar maven dapat berjalan di command

Jika berhasil jalankan pada command mvn -version maka akan tampil sbb :

Install Pada Eclipse
Pada menu Help pilih Eclipse Marketplace maka akan muncul sbb :
serach key "maven" pilih Maven Integration for Eclipse klik button install lalu ikuti proses selanjutnya jika instalasi succes maka eclipse akan minta restart, cek apakah maven sudah terinstal, pilih menu File > New > Project cari Maven

Kunjungi situs kami di PT Samz Solution

Selasa, 01 Mei 2012

Struts Hibernate

Step by Step Membangun Aplikasi Berbasis Web Menggunakan Struts Hibernate

Hibernate adalah sebuah framework ORM(Object relational Mapping), yaitu mapping dari bentuk tabel di database, menjadi sebuah Objek atau Class

Untuk mapping sendiri dilakukan dengan 2 cara, bisa dengan mendeskripsikan menggunakan XML (hbm.xml), dan bisa juga dengan menggunkaan annotation ( @ )
(pada tutorial ini kita akan menggunakan XML)

Kelebihannya, kita bebas melakukan development berbasis database apa saja, dgn hibernate kita gak perlu lagi menggunakan native sql query (select from where) tapi langsung mengakses ke class-class model nya (POJO-nya)
Design pattern yang digunakan pada tutorial ini menggunakan singleton, dimana design mengharuskan menggunakan 1 instance saja

Tools dan Technologi yang dipakai dalam tutorial ini adalah :
Hibernate 3.0
PostgreSQL 9.0
Eclipse 3.5 (Galileo )
Apache tomcat 6 atau 7

Lib yang dibutuhkan :
antlr-2.7.6.jar
asm-attrs.jar
asm.jar
c3p0-0.9.0.jar
cglib-2.1.3.jar
commons-beanutils-1.7.0.jar
commons-collections-3.2.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
hibernate3.jar
jstl-1.0.6.jar
jta.jar
log4j-1.2.11.jar
postgresql-8.0-311.jdbc2ee.jar
serialization.jar
standard-1.0.6.jar
struts-core-1.3.5.jar
struts-extras-1.3.5.jar
struts-taglib-1.3.5.jar

Tujuannya adalah membuat tampilan menjadi seperti ini




Membuat Table
CREATE TABLE item
(
  item_code character varying(50) NOT NULL,
  item_name character varying(50),
  note character varying(50),
  created_date timestamp without time zone,
  created_by character varying(24),
  last_updated timestamp without time zone,
  last_updated_by character varying(24),
  deleted smallint,
  CONSTRAINT pk_item PRIMARY KEY (item_code)
)
WITH (
  OIDS=TRUE
);

Struktur Project


Hibernate Model Class
File Item.java
package com.samz.bean;

import java.sql.Timestamp;

public class Item {
 
 private String id;
 private String itemName;
 private String note;
 private Timestamp createdDate;
 private String createdBy;
 private Timestamp lastUpdated;
 private String lastUpdatedBy;
 private Integer deleted; 

//constructor & getter and setter methods

}   
Hibernate Xml Mapping
File inilah yang menghubungkan model dengan database atau istilahnya merepresentasikan table dengan model class
File Item.hbm.xml

 
 
  
   
 
   
 
 
 
 
   
 


Membuat Hibernate Configuration File
File ini untuk koneksi dengan database dan tempat mendaftarkan file – file hbm
Nama File : hibernate.cfg.xml

    
        
        org.postgresql.Driver
        jdbc:postgresql://localhost:5432/samz
        postgres
        postgres        
        
        org.hibernate.dialect.PostgreSQLDialect
        
        5
        20
        1800
        50
        3000        
        
        managed        
        org.hibernate.cache.NoCacheProvider        
        true
        true
        2
        
       
 
    


Untuk memastikan apakah koneksi berhasil dan data bisa masuk ke database maka kita test sebagai berikut
package com.samz.test;

import java.sql.Timestamp;

import org.hibernate.Session;

import com.samz.bean.Item;
import com.samz.utility.HibernateUtil;

public class ItemTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Session session = HibernateUtil.getSessionFactory().openSession();
   session.beginTransaction();  
  Item item = new Item(); 
  item.setId("4716");
  item.setItemName("ITEM 1");
  item.setNote("TEST 123");
  item.setCreatedBy("Admin");
  item.setCreatedDate(new Timestamp(System.currentTimeMillis()));
  item.setDeleted(new Integer(0));
  
  session.save(item);
  session.getTransaction().commit();
  System.out.println("Insert Berhasil");

 }

}

Jalankan di eclipse Run As Java Application

Setelah berhasil dijalankan lalu ke step selanjutnya membuat session-factory
File : HibernateUtil.java
package com.samz.utility;

import org.apache.log4j.*;
import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {
 private static Logger log = Logger.getLogger(HibernateUtil.class);
 private static SessionFactory sessionFactory;

 static {
  try {
   log.info("Load Hibernate configuration and build Session Factory");
   sessionFactory = new Configuration().configure()
     .buildSessionFactory();
  } catch (Throwable ex) {
   throw new ExceptionInInitializerError(ex);
  }
 }

 public static SessionFactory getSessionFactory() {
  return sessionFactory;
 }

 public static void shutdown() {
  getSessionFactory().close();
 }

}

Membuat super class dari DAO yaitu GenericDAO dan GenericDAOHibernate, dimana file ini untuk generalisasi save, update dan delete agar tidak perlu lagi mendefiniskan di file – file DAO yang lain
GenericDAO.java
package com.samz.dao;

import java.io.*;
import java.util.*;

public interface GenericDAO<T, extends Serializable>
{
 T findById(ID id, boolean lock);
 T getById(ID id, boolean lock);
 List<T> findByExample(T exampleInstance, String... exlcudeProperty);
 T save(T entity);
 void update(T entity);
 void delete(T entity);
 void deleteFlag(T entity);
 void flush();
 void clear(); 
 void evict(Object obj);
 void refresh(Object obj); 
}
Lalu implementasikan GenericDAO.java di file GenericDAOHibernate.java
package com.samz.dao;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;

import com.samz.utility.HibernateSessionConversationFilter;
import com.samz.utility.HibernateUtil;

public abstract class GenericDAOHibernate<T, ID extends Serializable> implements GenericDAO<T, ID>
{
 private static Logger log = Logger.getLogger(HibernateSessionConversationFilter.class);
 private Class<T> persistentClass;
 private SessionFactory sf = HibernateUtil.getSessionFactory(); 

 @SuppressWarnings("unchecked")
 public GenericDAOHibernate()
 {
  this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
 }

 protected Session getSession()
 {
  return sf.getCurrentSession();
 }
 
 public Class<T> getPersistentClass()
 {
  return persistentClass;
 }

 public void clear()
 {
  getSession().clear();
 }
 
 public void evict(Object obj)
 {
  getSession().evict(obj);
 }

 public void refresh(Object obj)
 {
  getSession().refresh(obj);
 }
 
 @SuppressWarnings("unchecked")
 public T findById(ID id, boolean lock)
 {
  T entity;
  if (lock)
   entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);
  else
   entity = (T) getSession().load(getPersistentClass(), id);
  
  return entity;
 }

 @SuppressWarnings("unchecked")
 public T getById(ID id, boolean lock)
 {
  T entity;
  if (lock)
   entity = (T) getSession().get(getPersistentClass(), id, LockMode.UPGRADE);
  else
   entity = (T) getSession().get(getPersistentClass(), id);
  
  return entity;
 }

 @SuppressWarnings("unchecked")
 public List<T> findByExample(T exampleInstance, String... excludeProperty)
 {
  Criteria crit = getSession().createCriteria(getPersistentClass());
  Example example = Example.create(exampleInstance);
  for (String exclude : excludeProperty)
  {
   example.excludeProperty(exclude);
  }
  crit.add(example);
  
  return crit.list();
 }
 
 public void flush()
 {
  getSession().flush();
 }

 public T save(T entity)
 {
  getSession().save(entity);
  return entity;
 }

 public void update(T entity)
 {
  getSession().update(entity);
 }

 public void delete(T entity)
 {
  getSession().delete(entity);
 }
 
 public void deleteFlag(T entity)
 {
  try {
   Field deleted = (Field) entity.getClass().getDeclaredField("deleted");
   if (deleted !=null) {
    deleted.set(entity, new Integer(1));
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   log.debug("error ==" + e.toString());
   e.printStackTrace();
  }
  getSession().update(entity);
 } 
}
Dan setelah itu kita buat File DAO untuk Item
File : ItemDAO.java
package com.samz.dao;

import java.util.List;
import com.samz.bean.Item;

public interface ItemDAO  extends GenericDAO<Item, String>{ 
 List<Item> search(List<Object> columnList, List<Object> valueList); 
}

File : ItemDAOHibernate.java
package com.samz.dao;

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import com.samz.bean.Item;

public class ItemDAOHibernate extends GenericDAOHibernate<Item, String>
  implements ItemDAO {

 @SuppressWarnings("unchecked")
 @Override
 public List<Item> search(List<Object> columnList, List<Object> valueList) {
  int columnSize = 0;
  int valueSize = 0;

  if (columnList != null)
   columnSize = columnList.size();
  if (valueList != null)
   valueSize = valueList.size();

  if (columnSize != valueSize)
   throw new HibernateException(
     "Number of 'column' must be equals with number of 'value'");

  Criteria criteria = getSession().createCriteria(Item.class);

  for (int i = 0; i < columnSize; i++)
   criteria.add(Restrictions.ilike((String) columnList.get(i), "%"
     + valueList.get(i) + "%"));
  criteria.add(Restrictions.eq("deleted", new Integer(0)));
  criteria.addOrder(Order.asc("itemName"));

  return criteria.list();
 }

}
Seperti sudah dijelaskan diatas kita buat file super class untuk DAO (GenericDAO dan Generic DAOHibenate) untuk menggeneralisasikan methode jadi kita tidak perlu membuat save, delete, update di child kelasnya. Membuat file untuk menampung file – file DAO, disinilah sepertinya konsep menggunakan design pattern singleton, kita lihat saja contohnya File : DAOFactory.java
package com.samz.dao;

public abstract class DAOFactory {
 /**
  * Factory method for instantiation of concrete factories.
  */
 @SuppressWarnings("unchecked")
 public static DAOFactory instance(Class factory) {
  try {
   return (DAOFactory) factory.newInstance();
  } catch (Exception e) {
   throw new RuntimeException("Couldn't create DAOFactory: " + factory);
  }
 }

 // For DAO Interface List
 public abstract ItemDAO getItemDAO();

}
Implemementasikan file Interfacenya File : DAOFActoryHibernate.java
package com.samz.dao;

public class DAOFactoryHibernate extends DAOFactory {
 @SuppressWarnings("unchecked")
 private GenericDAOHibernate instantiateDAO(Class daoClass) {
  try {
   GenericDAOHibernate dao = (GenericDAOHibernate) daoClass
     .newInstance();
   return dao;
  } catch (Exception e) {
   System.out.println(e.toString());
   throw new RuntimeException("Can not instantiate DAO: " + daoClass,
     e);
  }
 }

 @Override
 public ItemDAO getItemDAO() {
  return (ItemDAO) instantiateDAO(ItemDAOHibernate.class);
 }

}
Bagaimana cara menggunakannya?? ini nanti akan digunakan di Controller semua logic bisnis akan kita buat di Controller mulai dari list, save, update dan delete, sebelum membuat controller kita akan membuat tampilannya(jsp), yuk dilihat.. File : item.jsp di folder WebContent/jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<title><bean:message key="app.title" /></title>
</head>

<script src="../script/common.js"></script>
<script language="JavaScript">
 function add()
 {
  document.forms[0].dispatch.value = 'initialAdd';
  document.forms[0].submit();
 }
 
 function edit(_itemCode)
 {
  document.forms[0].dispatch.value = 'initialUpdate';
  document.forms[0].id.value = _itemCode;
  document.forms[0].submit();
 }

 function del(_itemCode)
 {
  document.forms[0].dispatch.value = 'delete';
  document.forms[0].id.value = _itemCode;
  document.forms[0].submit();
 }

</script>

<body>
<table width="100%">
 <!-- Screen Title Section (Start) -->
 <tr>
  <td><bean:message key="form.item.title" /></td>
 </tr>
 <!-- Screen Title Section (Finish) -->

 <!-- Content Section (Start) -->
 <tr>
  <td>
  <table width="100%">
   <tr>
    <td><html:form action="/jsp/item.do">
     <html:hidden property="dispatch" value="search" />
     <html:hidden property="id" />
     <table width="100%">
      <tr>
       <td width="25%"><bean:message key="form.search" /></td>
       <td width=""><html:select property="searchColumn">
       <html:options collection="searchOptionList" property="value" labelProperty="label" />
       </html:select> <html:text property="searchValue" maxlength="32" size="32" /> <html:submit
        property="saveButton" styleClass="formButton">
        <bean:message key="button.search" />
       </html:submit></td>
      </tr>
     </table>
    </html:form></td>
   </tr>

   <tr>
    <td>
    <table width="100%" cellpadding="3" cellspacing="0" border="1">
     <tr class="tableHeader">
      <td width="" align="center"><bean:message
       key="form.item.code" /></td>
      <td width="" align="center"><bean:message
       key="form.item.name" /></td>
      <td width="" align="center"><bean:message
       key="form.item.note" /></td>
      <td width="" align="center"><bean:message key="form.action" /></td>
     </tr>

     
     <c:forEach var="item" items="${items}" varStatus="status">

      <td><c:out value="${item.id}" /></td>
      <td><c:out value="${item.itemName}" /></td>
      <td><c:out value="${item.note}" /></td>
      <td class="cellBorder" align="center"><a
       href="javascript:edit('<c:out value="${item.id}"/>')"><bean:message
       key="form.edit" /></a> | <a
       href="javascript:del('<c:out value="${item.id}"/>')"><bean:message
       key="form.delete" /></a></td>
      </tr>
     </c:forEach>
    </table>
    </td>
   </tr>
  </table>
  </td>
 </tr>
 <!-- Content Section (Finish) -->

 <!-- Button Section (Start) -->
 <tr>
  <td align="left"><html:button property="addButton"
   styleClass="formButton" onclick="javascript: add();">
   <bean:message key="form.add" />
  </html:button></td>
 </tr>
 <!-- Button Section (Finish) -->
</table>
</body>
</html:html>
File : itemAdd.jsp di folder WebContent/jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

<html:html>
<head>
 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <meta http-equiv="Content-Style-Type" content="text/css">
 <title><bean:message key="app.title" /></title>
</head>

<script src="../script/validator.js"></script>
<script language="JavaScript">
 function cancel()
 {
  _dispatch = 'cancelAdd';
  window.location = '<c:url value="/jsp/item.do" />'+'?dispatch='+_dispatch;
 }

 function update()
 {
  if(document.forms[0].itemCode.value=="")
  {
   alert("please complete this form");
   document.forms[0].itemCode.focus();
   return false;
  }
  if(document.forms[0].itemName.value=="")
  {
   alert("please complete this form");
   document.forms[0].itemName.focus();
   return false;
  }
  
  document.forms[0].dispatch.value = 'saveUpdate';
  document.forms[0].submit();
 }
 
 function validateForm(form) {
  if(document.forms[0].itemCode.value=="")
  {
   alert("please complete this form");
   document.forms[0].itemCode.focus();
   return false;
  }
  if(document.forms[0].itemName.value=="")
  {
   alert("please complete this form");
   document.forms[0].itemName.focus();
   return false;
  }
 }
</script>

<body>
<html:form action="/jsp/item.do" onsubmit="return validateForm(this);">
<table width="100%">
<!-- Screen Title Section (Start) -->
<tr>
 <td class="pageTitle"><bean:message key="form.item.title" /></td>
</tr>
<!-- Screen Title Section (Finish) -->

<!-- Content Section (Start) -->

<tr>
 <td>
 <tbody>
  <html:hidden property="processName" />
  <html:hidden property="dispatch" value="saveAdd" />
  <table width="100%">
   <tr>
    <td class="cellLabel" width="25%">
     <bean:message key="form.item.code" />
    </td>
    <td class="cellText" width="">
    <logic:equal name="itemForm" property="processName" value="add">
     <html:text property="itemCode" maxlength="16" size="16" />
    </logic:equal>
    <logic:equal name="itemForm" property="processName" value="update">
     <html:text property="itemCode" maxlength="16" size="16" readonly="true" styleClass="formReadOnly" />
    </logic:equal>
    </td>
   </tr>
   <tr>
    <td class="cellLabel">
     <bean:message key="form.item.name" />
    </td>
    <td class="cellText">
     <html:text property="itemName" maxlength="36" size="36" />
    </td>
   </tr>
   <tr>
    <td class="cellLabel">
     <bean:message key="form.item.note" />
    </td>
    <td class="cellText">
     <html:textarea property="note" cols="32" rows="4" ></html:textarea>
    </td>
   </tr>
  </table>
 </tbody>
 </td>
</tr>
<!-- Content Section (Finish) -->

<!-- Button Section (Start) -->
<tr>
 <td align="left">
 <logic:equal name="itemForm" property="processName" value="add">
  <html:submit property="saveButton" styleClass="formButton">
   <bean:message key="button.save" />
  </html:submit>
 </logic:equal>
 <logic:equal name="itemForm" property="processName" value="update">
  <html:button property="saveButton" styleClass="formButton" onclick="javascript:update();">
   <bean:message key="button.save" />
  </html:button>
 </logic:equal>
  <html:button property="cancelButton" styleClass="formButton" onclick="javascript:cancel();">
   <bean:message key="button.cancel" />
  </html:button>
 </td>
</tr>

<!-- Button Section (Finish) -->
</table>
</html:form>
</body>
</html:html> 
Dari kedua file jsp diatas dapat kita lihat berbagai macam tag di jsp, kita juga disini menggunakan JSTL (JavaServer Pages Standard Tag Library), untuk tutorial JSTL dapat searching di google dengan key jstl atau dapat dilihat linknya disini  Dapat dilihat juga ada tag seperti <bean:message key="form.item.code">maksudnya adalah kita ambil key dengan nama form.item.code dari file properties, dalam tutorial ini nanti kita beri nama SamzResources.properties. kenapa harus pakai file properties? kenapa ga langsung di hardcode saja? inilah fungsinya agar mencegah dari coding kotor atau hardcode dan juga agar nanti web kita dapat diganti ke berbagai bahasa seperti Inggris, Belanda, dll sesuai default language dari browser kita. inilah contoh isi file propertiesnya
form.action=Aksi
form.add=Tambah
Untuk menambahkan ke bahasa Inggris buat satu file properties lagi dengan nama SamzResources_en.properties
form.action=Action
form.add=Add
Untuk bisa terhubung file properties ini dengan jsp, kita harus mendaftarkan di strust-config, beri nama struts-config.xml di folder /WEB-INF. Disinilah fungsi struts, sebagai penghubung antara view(jsp) dengan controller, view dengan file properties. property yang ada di jsp didaftarkan di file struts ini, kita lihat contohnya :
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE struts-config PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
        "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
    <form-beans>
  <form-bean name="itemForm" type="org.apache.struts.validator.DynaValidatorForm">
   <form-property name="dispatch" type="java.lang.String"></form-property>
   <form-property name="id" type="java.lang.String"></form-property>
   <form-property name="searchColumn" type="java.lang.String"></form-property>
   <form-property name="searchValue" type="java.lang.String"></form-property>
   <form-property name="processName" type="java.lang.String"></form-property>   
   <form-property name="itemCode" type="java.lang.String"></form-property>
   <form-property name="itemName" type="java.lang.String"></form-property>
   <form-property name="note" type="java.lang.String"></form-property>
  </form-bean>
    </form-beans> 

    <action-mappings>
      <action path="/jsp/item" name="itemForm" parameter="dispatch" type="com.samz.controller.ItemController" scope="request" validate="false">
   <forward name="listScreen" path="/jsp/item.jsp"></forward>
   <forward name="addScreen" path="/jsp/itemAdd.jsp"></forward>
  </action>
    </action-mappings>    
    <message-resources parameter="com.samz.resources.SamzResources"></message-resources>
</struts-config>

Terakhir buat controller, dimana file inilah yang menangani semua logic bisnis, tak usah panjang - panjang kita langsung lihat contohnya File : ItemController.java
package com.samz.controller;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

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

import org.apache.commons.beanutils.BeanUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.util.LabelValueBean;

import com.samz.bean.Item;
import com.samz.dao.DAOFactory;
import com.samz.dao.DAOFactoryHibernate;
import com.samz.dao.ItemDAO;
import com.samz.utility.HibernateSessionConversationFilter;

public class ItemController extends GeneralController {

 private static Logger log = Logger.getLogger(ItemController.class);
 DAOFactory factory = DAOFactory.instance(DAOFactoryHibernate.class);
 ItemDAO itemDAO = factory.getItemDAO();

 private void searchOption(HttpServletRequest request) throws Exception {
  List<labelvaluebean> searchOption = null;
  searchOption = new ArrayList<labelvaluebean>();
  searchOption.add(new LabelValueBean(getMessage(request,
    "form.item.name"), "itemName"));
  searchOption.add(new LabelValueBean(getMessage(request,
    "form.item.code"), "id"));
  request.setAttribute("searchOptionList", searchOption);
 }

public ActionForward initialList(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  ActionForward forward = null;
  DynaActionForm dynaForm = null;
  String searchColumn = null;
  String searchValue = null;
  List<Object> columnList = null;
  List<Object> valueList = null;
  List<Item> items = null;
  dynaForm = (DynaActionForm) form;

  if (((searchValue = (String) dynaForm.get("searchValue")) != null && !searchValue
    .trim().equals(""))
    || ((searchValue = (String) request.getAttribute("searchValue")) != null && !searchValue
      .trim().equals(""))) {
   searchColumn = (String) dynaForm.get("searchColumn");
   columnList = new ArrayList<Object>();
   valueList = new ArrayList<Object>();
   columnList.add(searchColumn);
   valueList.add(searchValue.trim());
  }
  items = itemDAO.search(columnList, valueList);
  request.setAttribute("items", items);
  request.setAttribute(
    HibernateSessionConversationFilter.END_OF_CONVERSATION_FLAG,
    "1");
  searchOption(request);
  forward = mapping.findForward("listScreen");

  return forward;
 }
public ActionForward initialAdd(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  ActionForward forward = null;
  DynaActionForm dynaForm = null;
  log.info("[initialAdd start >>>");
  dynaForm = (DynaActionForm) form;
  dynaForm.set("processName", "add");
  forward = mapping.findForward("addScreen");
  log.info("<<< initialAdd finish]");
  return forward;
 }

 /**
  * Method invoked when [Cancel] button press in 'Item - Add / Update' screen
  */
 public ActionForward cancelAdd(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  log.info("[cancelAdd start >>>");
  ActionForward forward = initialList(mapping, form, request, response);
  log.info("<<< cancelAdd finish]");
  return forward;
 }

 /**
  * Method invoked when [Save] button press in 'Item - Add / Update' screen
  */
 public ActionForward saveAdd(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  ActionForward forward = null;
  Item item = null;
  DynaActionForm dynaForm = null;
  ActionMessages errors = null;
  log.info("[saveAdd start >>>");
  try {
   dynaForm = (DynaActionForm) form;
   item = new Item();
   item.setId(dynaForm.getString("itemCode"));
   item.setItemName(dynaForm.getString("itemName"));
   item.setNote(dynaForm.getString("note"));
   item.setCreatedBy("admin");
   item.setCreatedDate(new Timestamp(System.currentTimeMillis()));
   item.setDeleted(new Integer(0));
   itemDAO.save(item);
   request
     .setAttribute(
       HibernateSessionConversationFilter.END_OF_CONVERSATION_FLAG,
       "1");
   itemDAO.flush();
   searchOption(request);

  } catch (Exception ex) {
   errors = new ActionMessages();
   errors.add("ERROR", new ActionMessage("error.exception", ex
     .getMessage()));
   saveErrors(request, errors);
   request
     .setAttribute(
       HibernateSessionConversationFilter.ROLLBACK_OF_CONVERSATION_FLAG,
       "1");
   forward = mapping.findForward("failScreen");
  }
  log.info("<<< saveAdd finish]");
  forward = initialList(mapping, form, request, response);
  return forward;
 }

 /**
  * Method invoked when [Edit] link for specific Item press in 'Role' screen
  */
 public ActionForward initialUpdate(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  ActionForward forward = null;
  DynaActionForm dynaForm = null;
  Item itemEntity = null;
  String itemCode = null;
  log.info("[initialUpdate start >>>");
  itemCode = request.getParameter("id");
  itemEntity = itemDAO.findById(itemCode, false);
  dynaForm = (DynaActionForm) form;
  BeanUtils.copyProperties(dynaForm, itemEntity);
  dynaForm.set("itemCode", itemEntity.getId());
  dynaForm.set("processName", "update");

  forward = mapping.findForward("addScreen");
  log.info("<<< initialUpdate finish]");
  return forward;
 }

 /**
  * Method invoked when [Save] button press in 'Item - Add / Update' screen
  */
 public ActionForward saveUpdate(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  ActionForward forward = null;
  Item item = null;
  DynaActionForm dynaForm = null;
  String itemCode = null;
  log.info("[Update start >>>");
  dynaForm = (DynaActionForm) form;
  itemCode = (String) dynaForm.get("itemCode");
  item = itemDAO.findById(itemCode, false);
  item.setItemName(dynaForm.getString("itemName"));
  item.setNote(dynaForm.getString("note"));
  item.setLastUpdated(new Timestamp(System.currentTimeMillis()));
  item.setLastUpdatedBy("admin");
  itemDAO.flush();
  searchOption(request);
  forward = initialList(mapping, form, request, response);
  log.info("<<< Update finish]");

  return forward;
 }

 /**
  * Method invoked when [Delete] link for specific Item press in 'Item'
  * screen
  */
 public ActionForward delete(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  ActionForward forward = null;
  Item itemEntity = null;

  itemEntity = itemDAO.findById(request.getParameter("id"), false);
  itemEntity.setDeleted(new Integer(1));
  itemEntity.setLastUpdated(new Timestamp(System.currentTimeMillis()));
  itemEntity.setLastUpdatedBy("admin");
  itemDAO.update(itemEntity);
  itemDAO.flush();

  searchOption(request);
  forward = initialList(mapping, form, request, response);

  return forward;
 }

 /**
  * Method invoked when [Search] button press in 'Item' screen
  */
 public ActionForward search(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  ActionForward forward = initialList(mapping, form, request, response);
  return forward;
 }
}
Download source code lengkap disini
Kunjungi situs kami di PT Samz Solution