Thursday, November 6, 2008

CRUD JSF RichFaces Spring Hibernate application

In this example we will be using Netbeans as an IDE and hibernate,spring & jsf framework which provides a very good platform for building enterprise application & the steps are as follows:

1) Create a table named “tbl_Departments” in mysql database

CREATE TABLE `tbl_departments` (

`DepartmentID` int(10) NOT NULL auto_increment,

`Title` varchar(256) NOT NULL,

`Description` varchar(256),

PRIMARY KEY (`DepartmentID`)
);


2) Create a “Department” entity class from the netbeansusing “New->Other->Persistence->Entity classes from Database”
package com.models;

@Entity
@Table(name = "tbl_departments")
public class Department implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "DepartmentID", nullable = false)
private Integer departmentID;
@Column(name = "Title", nullable = false)
private String title;
@Column(name = "Description")
private String description;
}
3) Create a DAO interface named “DepartmentDAO”




package com.dao;

import com.models.Department;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;

public interface DepartmentDAO {
@Transactional(readOnly=false)
void deleteDepartment(Department dep);

@Transactional(readOnly=false)
List<Department> getDepartments();

@Transactional(readOnly=false)
void insertDepartment(Department dep);
@Transactional(readOnly=false)
void updateDepartment(Department dep);
@Transactional(readOnly=false)
Department getDepartmentByID(int departmentID);
}

4) Create a DAO implementation class named “DepartmentDAOImpl” extending the “HibernateDaoSupport”
class provided by the Spring
& implementing “DepartmentDAO” interface. Using the spring dao, we can minimize the code required for hibernate to interact with the database.



package com.dao.impl;

import com.dao.DepartmentDAO;
import com.models.Department;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class DepartmentDAOImpl extends HibernateDaoSupport implements DepartmentDAO {
public void deleteDepartment(Department dep) {
getHibernateTemplate().delete(dep);
}
public Department getDepartmentByID(int departmentID) {
return (Department) getHibernateTemplate().load(Department.class, departmentID);
}
public List<Department> getDepartments() {
return (List<Department>)
getHibernateTemplate().find("from Department d order by d.title ");
}
public void insertDepartment(final Department dep) {
getHibernateTemplate().save(dep);
}
public void updateDepartment(Department dep) {
getHibernateTemplate().update(dep);
}
}
5) Create spring bean configuration file named “beans.xml”



<beans>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="annotatedClasses">
<list>
<value>com.models.Department</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true
</prop>
<prop key="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver
</prop>
<prop key="hibernate.connection.url">jdbc:mysql://localhost/shoppro
</prop>
<prop key="hibernate.connection.username">root
</prop>
<prop key="hibernate.connection.password">root
</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean
class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>

<!-- Define our Data Access beans -->
<bean id="departmentDao" class="com.dao.impl.DepartmentDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
6) Now create a backing bean class named “ManageDepartments” for jsf



package com.managedbeans;

public class ManageDepartments {

private String departmentID;
private String title;
private String description;

public ManageDepartments() {
dc = Helper.getDepartmentDAO();
departments = dc.getDepartments();
}

private UIDataTable table;
private List<Department> departments;
private DepartmentDAO dc ;
private HtmlAjaxCommandLink updateLink;
private boolean editable = false; //editable mode means editable or not

public void editAction(ActionEvent e) {
Department dep = (Department) table.getRowData();

this.setDepartmentID(String.valueOf(dep.getDepartmentID()));
//save into table as attribute also for postback retrieval
table.getAttributes().put("depID",dep.getDepartmentID() );

this.setTitle(dep.getTitle());
this.setDescription(dep.getDescription());

this.setEditable(true);
this.updateLink.setRendered(true);
}

public void updateAction(ActionEvent e) {
Department dep = new Department();

dep.setDepartmentID( (Integer)table.getAttributes().get("depID"));
dep.setTitle(this.getTitle());
dep.setDescription(this.getDescription());

dc.updateDepartment(dep);
this.clearFields();
this.setEditable(false);
this.updateLink.setRendered(false);
this.departments = dc.getDepartments();
}

public void cancelAction(ActionEvent e){
this.clearFields();
this.setEditable(false);
this.updateLink.setRendered(false);
}

public void deleteAction(ActionEvent e) {
if (table.getRowData() != null) {
Department dep = (Department) table.getRowData();
dc.deleteDepartment(dep);
this.clearFields();
updateLink.setRendered(false);
this.departments = dc.getDepartments();
}
}

public void insertAction(ActionEvent e) {
Department dep = new Department();
dep.setDepartmentID(0);
dep.setTitle(this.getTitle());
dep.setDescription(this.getDescription());
dc.insertDepartment(dep);

this.clearFields();
this.departments = dc.getDepartments();
}

void clearFields() {
this.setTitle("");
this.setDescription("");
this.setDepartmentID("");
}

}

7) Create and configure “faces-config.xml” & “web.xml” for jsf & managed bean




<faces-config>
<managed-bean>
<managed-bean-name>ManageDepartments</managed-bean-name>
<managed-bean-class>com.managedbeans.ManageDepartments</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
8) At last create a jsp page containing jsf & richfaces tags named “manageDepartments.jsp”



<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>

<html>
<body>
<f:view>
<h:form id="frm">
<rich:panel header="Deparments" style="width:450px">
<rich:dataTable binding="#{ManageDepartments.table}"
onRowMouseOver="this.style.backgroundColor='#B5CEFD'"
onRowMouseOut="this.style.backgroundColor='#{org.richfaces.SKIN.tableBackgroundColor}'"
onRowClick="this.style.backgroundColor='#F1F1F1'"
rows="10" width="100%" id="tbl" value="#{ManageDepartments.departments}" var="d">
<rich:column>
<f:facet name="header">
<h:outputText value="Title" />
</f:facet>
<h:outputText value="#{d.title}" />
</rich:column>
<rich:column width="230px">
<f:facet name="header">
<h:outputText value="Description" />
</f:facet>
<h:outputText value="#{d.description}" />
</rich:column>
<rich:column style="text-align:center">
<f:facet name="header">
<h:outputText value="Edit" />
</f:facet>
<a4j:commandLink reRender="pnl" actionListener="#{ManageDepartments.editAction}">
<h:graphicImage style="border:0"url="/images/Edit.gif" />
</a4j:commandLink>
</rich:column>
<rich:column style="text-align:center">
<f:facet name="header">
<h:outputText value="Delete" />
</f:facet>
<a4j:commandLink reRender="tbl,pnl"
actionListener
="#{ManageDepartments.deleteAction}"
onclick="if(confirm('Confirm delete?') == false ) return false;" >
<h:graphicImage style="border:0" url="/images/Delete.gif" />
</a4j:commandLink>
</rich:column>
<f:facet name="footer">
<rich:datascroller />
</f:facet>

</rich:dataTable>
</rich:panel>
<br>
<rich:panel header="Department" style="width:450px">
<h:panelGrid id="pnl" columns="2" width="100%" >

<h:outputText value="Department ID:" rendered="#{ManageDepartments.editable}" />
<h:outputText value="#{ManageDepartments.departmentID}"
rendered="#{ManageDepartments.editable}" />

<h:outputText value="Title:" />
<h:panelGroup>
<h:inputText id="title" value="#{ManageDepartments.title}" style="width:100%" />
<h:message style="color:red" for="title" />
</h:panelGroup>

<h:outputText value="Description:" />
<h:inputTextarea style="width:100%" value="#{ManageDepartments.description}" />

<a4j:commandLink value="Insert" reRender="tbl,pnl"
actionListener="#{ManageDepartments.insertAction}"
rendered="#{not ManageDepartments.editable}"/>
<a4j:commandLink value="Update" reRender="tbl,pnl"
actionListener
="#{ManageDepartments.updateAction}"
rendered="false" binding="#{ManageDepartments.updateLink}" />
<a4j:commandLink value="Cancel" reRender="pnl,tbl"
actionListener
="#{ManageDepartments.cancelAction}" />
</h:panelGrid>
</rich:panel>
</h:form>
</f:view>
</body>
</html>


Outputs
Case 1: displaying departments details in the dataTable

Case2: when the user selects a department for editing, its information appeared in the inputText & outputText with update & cancel buttons



Source Code with out libraries