MVC CRUD Application


So what we are going to do with MVC CRUD Application. Well, any typical master screen will have one listing page where all the records are displayed and will also have the CRUD operation such as Add, Edit, Update and Delete.

So in our example also, we will have a listing page and one modal window to carry Add and Update operations.
Here is the static ZUL File content.

Step 1:

Create a New ZK Project using Eclipse 3.7 Indigo IDE

Step 2:

Hibernate 4.1.1 and Mysql jar files. Copy all the following files into Webcontent->Web-INF->Lib folder
  • antlr-2.7.7.jar
  • dom4j-1.6.1.jar
  • hibernate-commons-annotations-4.0.1.Final.jar
  • hibernate-core-4.1.1.Final.jar
  • hibernate-entitymanager-4.1.1.Final.jar
  • hibernate-jpa-2.0-api-1.0.1.Final.jar
  • javassist-3.15.0-GA.jar
  • jboss-logging-3.1.0.GA.jar
  • jboss-transaction-api_1.1_spec-1.0.0.Final.jar
  • mysql-connector-java-5.1.18-bin.jar

image

Step 3:

Create Zul File.  This file is for Record Listing
Right Click on Web Content folder and Create New ZUL File in the name of  practiceList.zul
<?page title="Practice List" contentType="text/html;charset=UTF-8"?>
<zk>

    <window title="Practice List" height="100px" border="normal" sclass="listingwindow" >
        <div >
            <button label="Add Practice" />
        </div>
        <separator />
        <groupbox height="40px">
            <label value="Practice Name" />
            <space />
            <space />
            <textbox cols="50" />
            <button label="Go" />
            <space spacing="20px" />
            <checkbox label="Show only active" />
            <space spacing="20px" />
        </groupbox>
        <separator />
        <listbox id="PracticeList" >
            <listhead sizable="true">
                <listheader label="Practice Name" sort="auto" />
                <listheader label="City" sort="auto" />
                <listheader label="State" sort="auto" />
                <listheader label="Zip Code" sort="auto" />
            </listhead>
    </listbox>
    </window>
</zk>

Step 4:

Create the following table in mysql
CREATE TABLE `practice` (
  `Practice_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `PRACTICE_NAME` VARCHAR(255) DEFAULT NULL,
  `NPI_NUMBER` VARCHAR(255) DEFAULT NULL,
  `EMAIL` VARCHAR(255) DEFAULT NULL,
  `ADDRESS1` VARCHAR(255) DEFAULT NULL,
  `ADDRESS2` VARCHAR(255) DEFAULT NULL,
  `CITY` VARCHAR(255) DEFAULT NULL,
  `COUNTRY_GEO` VARCHAR(255) DEFAULT NULL,
  `POSTAL_CODE` VARCHAR(255) DEFAULT NULL,
  `POSTAL_CODE_EXT` VARCHAR(255) DEFAULT NULL,
  `STATE_PROVINCE_GEO` VARCHAR(255) DEFAULT NULL,
  `FAX_NUMBER` VARCHAR(255) DEFAULT NULL,
  `OFFICE_EXT` VARCHAR(255) DEFAULT NULL,
  `OFFICE_PHONE` VARCHAR(255) DEFAULT NULL,
  `PracticeLoginURL` VARCHAR(25) NOT NULL,
  `IS_ACTIVE` BIT(1) DEFAULT NULL,
  `CREATED_BY` BIGINT(20) DEFAULT NULL,
  `CREATE_TX_TIMESTAMP` DATETIME NOT NULL,
  `UPDATE_BY` BIGINT(20) DEFAULT NULL,
  `UPDATED_TX_TIMESTAMP` DATETIME DEFAULT NULL,
  `DEACTIVATED_TX_TIMESTAMP` DATETIME DEFAULT NULL,
  `DEACTIVATEDBY` BIGINT(20) DEFAULT NULL,
  `DEACTIVATION_REASON` VARCHAR(255) DEFAULT NULL,
  `IS_System` BIT(1) DEFAULT NULL,
  `ID` INT(11) NOT NULL,
  PRIMARY KEY  (`Practice_ID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

Insert some values in the above table


Step 5:

Create the Java Bean POJO Class for the above table with Hibernate Annotation
Expand Java Resources Folder. Right Click on src folder and Select New –> Class. Give the Package Name is mydomain and class name as practice
package mydomain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "practice")
public class practice
{
   
    private String PRACTICE_NAME;
    private String CITY;
    private String STATE_PROVINCE_GEO;
    private String POSTAL_CODE;
    private int Practice_ID;
   
   
    @Id
    @GeneratedValue
    public int getPractice_ID() {
        return Practice_ID;
    }

    public void setPractice_ID(int practice_ID) {
        Practice_ID = practice_ID;
    }
   

    @Column(name = "PRACTICE_NAME")
    public String getPracticeName() {
        return PRACTICE_NAME;
    }
   
    @Column(name = "PRACTICE_NAME")
    public void setPracticeName(String pRACTICE_NAME) {
        PRACTICE_NAME = pRACTICE_NAME;
    }
   
   
    @Column(name = "CITY")
    public String getCity() {
        return CITY;
    }
   
    public void setCity(String cITY) {
        CITY = cITY;
    }
   
    @Column(name = "STATE_PROVINCE_GEO")
    public String getState() {
        return STATE_PROVINCE_GEO;
    }
   
    @Column(name = "STATE_PROVINCE_GEO")
    public void setState(String sTATE_PROVINCE_GEO) {
        STATE_PROVINCE_GEO = sTATE_PROVINCE_GEO;
    }
   
    @Column(name = "POSTAL_CODE")
    public String getZipCode() {
        return POSTAL_CODE;
    }
   
    @Column(name = "POSTAL_CODE")
    public void setZipCode(String pOSTAL_CODE) {
        POSTAL_CODE = pOSTAL_CODE;
    }
   
   
}

image

Step 6:

Create Hibernate Configuration File
Expand Java Resources Folder. Right Click on src folder and Select New->General->File and give the name as hibernate.cfg.xml
Paste the following code
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"
http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/drkare</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <!-- Mapping Classes -->
        <mapping class="mydomain.practice" />
       

    </session-factory>
</hibernate-configuration>

Please take care to change the DB Name, User and Password according your setup

Step 7:

Now let us create the hibernate utility class where we will establish the DB Configuration using the above configuration file
Right Click on Java Resource folder-> Select New –> Class. Give the Package name as HibernateUtilities  and Class name as HibernateUtil.java
image
Here is the code
package HibernateUtilities;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
    private static SessionFactory sessionFactory = buildSessionFactory();
    private static ServiceRegistry serviceRegistry;

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate .cfg.xml
            Configuration configuration = new Configuration();
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings(
                    configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            return sessionFactory;
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Step 8:

Now let us create the practiceDAO class where we will get the connection session and will do all our CRUD Operations
image
package mydomain;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.Query;
import HibernateUtilities.HibernateUtil;

public class PracticeDAO {
    @SuppressWarnings("rawtypes")
    public List getAll() {
        List allrecords = null;
        Transaction trns = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            Query q1 = session.createQuery("from practice");
            allrecords = q1.list();
            for (int i =0; i < allrecords.size(); i++)
               {
                practice pt = (practice) allrecords.get(i);
                System.out.println(pt.getPracticeName());
               }
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return allrecords;
    }
}



Step 9:

Next we will create the UI Controller as follows
image
package myproject.UI;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import mydomain.*;

@SuppressWarnings("rawtypes")
public class PracticeListController extends GenericForwardComposer {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private Listbox PracticeList;

    @SuppressWarnings({ "unchecked" })
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
       
        PracticeList.setItemRenderer(new ListitemRenderer() {
            @Override
            public void render(Listitem item, Object arg1, int arg2)
                    throws Exception {
                practice value = (practice) arg1;
                item.appendChild(new Listcell(value.getPracticeName()));
                item.appendChild(new Listcell(value.getCity()));
                item.appendChild(new Listcell(value.getState()));
                item.appendChild(new Listcell(value.getZipCode()));
                item.setValue(value);

            }
        });
       
        PracticeList.setModel(new ListModelList(new PracticeDAO().getAll()));
    }
}

Step 10:

Now go back to ZUL file and apply the above controller using apply attribute in the window component
Here is the Modified ZUL File
<?page title="Practice List" contentType="text/html;charset=UTF-8"?>
<zk>

    <window title="Practice List" height="100px" border="normal" sclass="listingwindow" apply="myproject.UI.PracticeListController">
        <div >
            <button label="Add Practice" />
        </div>
        <separator />
        <groupbox height="40px">
            <label value="Practice Name" />
            <space />
            <space />
            <textbox cols="50" />
            <button label="Go" />
            <space spacing="20px" />
            <checkbox label="Show only active" />
            <space spacing="20px" />
        </groupbox>
        <separator />
        <listbox id="PracticeList" >
            <listhead sizable="true">
                <listheader label="Practice Name" sort="auto" />
                <listheader label="City" sort="auto" />
                <listheader label="State" sort="auto" />
                <listheader label="Zip Code" sort="auto" />
            </listhead>
    </listbox>
    </window>
</zk>

Step 11:

Run the ZUL File. Wow!!!. We got the output as follows
image

Next post, we will see how we can filter the list.