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

1 komentar:

  1. Maaf, boleh tanya gag?
    Penggunaan dari masing2 komponen disini fungsinya apa saja yah?
    Yang hibernate berperan sebagai model.. Primefaces untuk view.
    Kalau Spring sendiri senagai apa? Apakah Controller?
    Boleh tolong dijelaskan fungsi masing2 gga? Hehe..
    Terimakasih..

    BalasHapus