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

Pengenalan Java


Java merupakan bahasa pemrograman berorientasi objek . Java dibuat setelah C++ , dirancang lebih kecil,
source dan binary level-nya sederhana dan portable untuk Platform dan Sistem Operasi apapun.
Hal ini berarti program Java (Applets dan Aplikasi) dapat dijalankan pada mesin apa saja asalkan mempunyai fasilitas JVM (Java Virtual Machine).

Java biasanya dikenal dalam konteks World Wide Web, dimana browser seperti Mozilla Firefox
dan Microsoft’s Internet Explorer disebut sebagai Java Enabled. Java Enabled berarti bahwa browser
dapat men-download dan menjalankan program Java (applets). Applets muncul di dalam Web page hampir
sama seperti images, tapi applets lebih dinamik dan interaktif. Applets dapat digunakan untuk membuat
animasi, gambar, bentuk-bentuk yang mempunyai respons cepat terhadap input dari reader (pembaca),
games (permainan), atau efek interaktif lain pada Web page yang sama pada teks dan grafik.

Java sebagai bahasa pemrograman memiliki keuntungan yang lebih bila dibandingkan dengan bahasa dan environment lain,
sehingga Java cocok untuk pemrograman apa saja. Dibawah ini akan disebutkan beberapa keuntungan dari Java :

1. Java adalah Platform Independent (Java is Platform Independent)
Java adalah Platform Independent dari pemrograman berorientasi objek (Object Oriented Programming), dengan tingkat fleksibilitasnya yang tinggi. Program Java bersifat modular dan code reusable (kode yang dapat digunakan kembali).

2. Java adalah Berorientasi Objek (Java is Object Oriented)
Rancangan berorientasi objek merupakan suatu teknik yang memusatkan rancangan pada data (objek) dan interface. Hal ini dapat dianalogikan dengan pekerjaan tukang kayu, seorang tukang kayu yang “berorientasi objek” akan menghabiskan waktunya untuk berkonsentrasi pada kursi yang sedang dibuatnya, sedangkan tukang kayu yang “tidak berorientasi objek” hanya memikirkan peralatan yang digunakan.

3. Java Mudah Dipelajari (Java is Easy to Learn)
Dengan penambahan portabilitias dan orientasi objek dari Java, salah satu inti dari tujuan perancangan Java adalah untuk menjadikannya lebih kecil dan sederhana , dan lebih mudah untuk di tulis, di compile , di debug dan yang terbaik dari semua itu adalah lebih mudah untuk dipelajari.

4. Java Lebih Sederhana (Java is Simple)
Meskipun sintaks pada Java berbasis pada bahasa berorientasi objek C++ , Java lebih sederhana dibanding C++ dan Java menghilangkan feature di C++ yang jarang digunakan, sukar dimengerti dan membingungkan. Berdasarkan pengalaman, hal tersebut di atas lebih banyak memberikan kegagalan dari pada keuntungan.

5. Java Memiliki Kinerja Yang Tinggi (Java is High Performance)
Meskipun kinerja bytecode  yang diinterpretasikan biasanya lebih dari memadai , tetapi masih  terdapat situasi  yang memerlukan kinerja yang lebih tinggi. Bytecode pada Java dapat  diterjemahkan (pada saat run-time) kedalam kode mesin untuk CPU tertentu dimana aplikasi berjalan.

6. Java Sebagai Penterjemah (Java is Interpreter)
Java dirancang agar dapat dieksekusi pada berbagai jenis lingkungan komputer (misalnya : pada UNIX, Windows, Windows NT dll). Java menggunakan interpreter , dimana program di compile ke dalam bahasa assembler untuk imaginary machine atau virtual machine. Instruksi-instruksi bahasa assembler ini disebut bytecodes dan dapat di-execute pada berbagai lingkungan komputer. Lingkungan komputer apapun yang mendukung pemrograman Java menyediakan suatu simulator yang disebut interpreter, yang akan membaca dan meng-execute bytecodes .

7. Java Lebih Handal (Robust)
Bahasa Java (Java Language) dan library yang berhubungan dirancang untuk menangani kerusakan (error) pada Hardware dan Software dengan adanya exception handling yang lebih baik dan lengkap. Perbedaan utama antara Java dan C++ adalah Java mengurangi kemungkinan penimpaan  (overwriting) pada memory dan kerusakan pada data (data corrupt)

8. Java Mempunyai Arsitektur yang Netral (Java is Neutral Architecture)
Karena bytecodes dari Java tidak tergantung oleh mesin yang digunakan (bytecodes dapat dijalankan pada mesin apapun), maka program Java pun begitu, misalnya: Java dapat dijalankan pada PC, a Machintosh atau system UNIX. Hal ini yang membedakan Java dengan bahasa conventional lainnya. Dalam pengertian yang awam bahwa Java dirancang untuk mempermudah penterjemahan pada beberapa lingkungan komputer lalu diterjemahkan kembali oleh komputer asal (source computer) sewaktu run-time.

9. Multithreading (Java is Multithreaded)
Java mempunyai kemampuan untuk melakukan lebih dari satu pekerjaan sekaligus, misalnya printing sambil menerima fax.

JVM

Java Virtual Machine adalah imaginary machine yang diimplementasikan dengan mengaplikasikan software nya pada real machine. Kode untuk Java Virtual Machine di simpan dalam bentuk file .class, yang didalamnya terdapat code paling banyak satu public class. Spesifikasi Java Virtual Machine menyediakan spesifikasi hardware platform yang memungkinkan semua kode Java teknologi dapat dikompilasi. Spesifikasi ini yang memungkinkan Java dapat berjalan di semua platform (platform independent), karena kompilasi dilakukan oleh generic machine yang namanya Java Virtual Machine. Generic machine ini memungkinkan software dapat di jalankan (running) pada berbagai macam sistem komputer ataupun diimplementasikan di hardware. Kompiler menjalankan aplikasi Java source code dan membangkitkan bytecode. Bytecode adalah kode instruksi mesin untuk Java Virtual Machine. Setiap Java inerpreter, baik itu java technology development tool atau web browser yang dapat menjalankan applet mempunyai implementasi Java Virtual Machine.

Program Java yang Sangat Sederhana

Mari kita membuat aplikasi yang sangat sederhana dengan menggunakan bahasa pemrograman Java.
Source code :
1 : //
2 : // Contoh aplikasi HelloSaja
3 : //
4 : public class HelloSaja {
5 :    public static void main (String [] Args) {
6 :        System.out.println (“Hello !!!”);
7 :    }
8 : }
simpan file yang dibuat di directory Latihan, dalam file HelloSaja.java


Keterangan program HelloSaja.java :

Baris 1-3 :
baris komentar :

1 : //
2 : // Contoh aplikasi HelloSaja
3 : //

Baris 4 :
Deklarasi class yang diberi nama HelloSaja.java. Class adalah tempat source program yang disimpan di dalam file. Oleh compiler, dibuat file yang namanya HelloSaja.class, yang berisi hasil kompilasi dari class HelloSaja.

4 : public class HelloSaja {
Baris 5 :
Baris ini merupakan awal dari eksekusi program, Java Technology Interpreter harus menemukan baris ini terlebih dahulu.

5 : public static void main (String [] Args) {

Baris 6 :
Baris ini akan mencetak tulisan “Hello !!!” sebagai outputnya.

6 : System.out.println (“Hello !!!”);

Baris 7-8 :
Dua kurung kurawal tutup sebagai penutup method main() dan class HelloSaja.

7 : }
8 : }


Mengompile dan menjalankan HelloWorld

Cara mengompile source code di atas :
> javac HelloSaja.java
Caramenjalankan program :
> java HelloSaja
Keluaran program :
Hello !!!


Susunan Source File


File .java dapat terdiri dari tiga ‘top-level’ elemen :
1    Deklarasi package (optional)
2    Sejumlah statement import
3    Definisi class atau interface

Susunan ketiganya tidak boleh dipertukarkan satu sama lain, statement import, jika digunakan, harus dideklarasikan sebelum definisi class dan jika deklarasi package jika digunakan, harus mendahului deklarasi class dan import.

Kunjungi situs kami di PT Samz Solution