Spring (4) MVC + Hibernate (4) CRUD Web Application
Scope : Develop an web application with using Spring and Hibernate
Objective : Develop a student management application with CRUD functionality.
Requirements :
- Eclipe Java EE IDE
- JDK 1.6
- MySQL Server 5.5
Step 1 : Create a dynamic web project in eclipse and name it as "SpringSimpleStudentMVC".
Step 2 : The data base properties defined as below.
/SpringSimpleStudentMVC/src/database.properties
Step 3 : Create a "Student" domain class under the "com.prem.domain" package.
/SpringSimpleStudentMVC/src/com/prem/domain/Student.java
Step 4 : Create "StudentDAO" and "StudentDAOImpl" interface and class file under the "com.prem.dao" package.
/SpringSimpleStudentMVC/src/com/prem/dao/StudentDAO.java
The "StudentDAOImpl" class looks like as below.
/SpringSimpleStudentMVC/src/com/prem/dao/StudentDAOImpl.java
Step 5: Now the time to create a "StudentService" interface and the "StudentServiceManger" class under the "com.prem.service" package.
/SpringSimpleStudentMVC/src/database.properties
1 2 3 4 5 6 7 | database.driver=com.mysql.jdbc.Driver database.url=jdbc:mysql://localhost:3306/test database.user=root database.password=1234 hibernate.show_sql=true hibernate.hbm2ddl.auto=update hibernate.dialect=org.hibernate.dialect.MySQLDialect |
Step 3 : Create a "Student" domain class under the "com.prem.domain" package.
/SpringSimpleStudentMVC/src/com/prem/domain/Student.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | package com.prem.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Student { @Id @GeneratedValue private int id; @Column(name = "FIRSTNAME") private String firstName; @Column(name = "LASTNAME") private String lastName; @Column(name = "EMAIL") private String email; @Column(name = "CONTACTNO") private String phone; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } } |
Step 4 : Create "StudentDAO" and "StudentDAOImpl" interface and class file under the "com.prem.dao" package.
/SpringSimpleStudentMVC/src/com/prem/dao/StudentDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package com.prem.dao; import java.util.List; import com.prem.domain.Student; public interface StudentDAO { public void saveStudent(Student student); public List<Student> getAllStudent(); public Student getStudentById(int id); public void updateStudent(Student student); public void deleteStudent(int id); } |
The "StudentDAOImpl" class looks like as below.
/SpringSimpleStudentMVC/src/com/prem/dao/StudentDAOImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | package com.prem.dao; import java.io.Serializable; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import com.prem.domain.Student; public class StudentDAOImpl implements StudentDAO { @Autowired private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Override @Transactional public void saveStudent(Student student) { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.saveOrUpdate(student); tx.commit(); Serializable id = session.getIdentifier(student); session.close(); } @Override public List<Student> getAllStudent() { Session session = sessionFactory.openSession(); List<Student> studentList = session.createQuery("from Student").list(); session.close(); return studentList; } @Override public Student getStudentById(int id) { Session session = sessionFactory.openSession(); return (Student) session.load(Student.class, new Integer(id)); } @Override public void updateStudent(Student student) { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.saveOrUpdate(student); tx.commit(); Serializable id = session.getIdentifier(student); session.close(); } @Override @Transactional public void deleteStudent(int id) { Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Student student = (Student) session.load(Student.class, id); session.delete(student); tx.commit(); Serializable ids = session.getIdentifier(student); session.close(); } } |
Step 5: Now the time to create a "StudentService" interface and the "StudentServiceManger" class under the "com.prem.service" package.
/SpringSimpleStudentMVC/src/com/prem/service/StudentService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package com.prem.service; import java.util.List; import com.prem.domain.Student; public interface StudentService { public void saveStudentDetails(Student student); public List<Student> getAllStudents(); public Student getStudentDeatilsById(int id); public void updateStudentDeatils(Student student); public void deleteStudentDetails(int id); } |
And the StudentServiceManger class as below.
/SpringSimpleStudentMVC/src/com/prem/service/StudentServiceManager.java
/SpringSimpleStudentMVC/src/com/prem/service/StudentServiceManager.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | package com.prem.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.prem.dao.StudentDAO; import com.prem.domain.Student; import com.prem.service.StudentService; @Service public class StudentServiceManager implements StudentService { @Autowired private StudentDAO studentDAO; public StudentDAO getStudentDAO() { return studentDAO; } public void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public void saveStudentDetails(Student student) { studentDAO.saveStudent(student); } @Override public List<Student> getAllStudents() { return studentDAO.getAllStudent(); } @Override public Student getStudentDeatilsById(int id) { return studentDAO.getStudentById(id); } @Override public void updateStudentDeatils(Student student) { studentDAO.updateStudent(student); } @Override public void deleteStudentDetails(int id) { studentDAO.deleteStudent(id); } } |
Step 6 : Now we are going to create the "StudentController" class under the package "com.prem.controller".
/SpringSimpleStudentMVC/src/com/prem/controller/StudentController.java
Step 7 : The spring configurations looks as below.
/SpringSimpleStudentMVC/src/com/prem/controller/StudentController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | package com.prem.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import com.prem.domain.Student; import com.prem.service.StudentService; @Controller public class StudentController { @Autowired @Qualifier(value="studentService") StudentService studentService; public StudentService getStudentService() { return studentService; } public void setStudentService(StudentService studentService) { this.studentService = studentService; } @RequestMapping("form") public ModelAndView getForm(@ModelAttribute Student student) { return new ModelAndView("form"); } @RequestMapping("register") @Transactional(readOnly=false) public ModelAndView registerUser(@ModelAttribute Student student) { studentService.saveStudentDetails(student); return new ModelAndView("redirect:list"); } @RequestMapping("list") public ModelAndView getList() { List<Student> studentList = studentService.getAllStudents(); return new ModelAndView("list", "studentList", studentList); } @RequestMapping("delete") public ModelAndView deleteUser(@RequestParam int id) { studentService.deleteStudentDetails(id); return new ModelAndView("redirect:list"); } @RequestMapping("edit") public ModelAndView editUser(@RequestParam int id, @ModelAttribute Student student) { Student studentObject = studentService.getStudentDeatilsById(id); return new ModelAndView("edit", "studentObject", studentObject); } @RequestMapping("update") public ModelAndView updateUser(@ModelAttribute Student student) { studentService.updateStudentDeatils(student); return new ModelAndView("redirect:list"); } } |
Step 7 : The spring configurations looks as below.
/SpringSimpleStudentMVC/WebContent/WEB-INF/mvc-dispatcher.xml
Step 8 : Now the time to create the jsp files for student registration.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <context:annotation-config /> <context:property-placeholder location="classpath:database.properties" /> <context:component-scan base-package="com.prem.dao.impl" /> <context:component-scan base-package="com.prem.service.manager" /> <context:component-scan base-package="com.prem.controller" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/pages/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="database.properties" /> </bean> <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource"> <property name="driverClassName" value="${database.driver}"></property> <property name="url" value="${database.url}"></property> <property name="username" value="${database.user}"></property> <property name="password" value="${database.password}"></property> </bean> <bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory"> <property name="dataSource" ref="dataSource"></property> <property name="annotatedClasses"> <list> <value>com.prem.domain.Student</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto} </prop> </props> </property> </bean> <tx:annotation-driven transaction-manager="hibernateTransactionManager"/> <bean class="org.springframework.orm.hibernate4.HibernateTransactionManager" id="hibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="studentDAO" class="com.prem.dao.StudentDAOImpl"> </bean> <bean id="studentService" class="com.prem.service.StudentServiceManager"> </bean> </beans> |
Step 8 : Now the time to create the jsp files for student registration.
/SpringSimpleStudentMVC/WebContent/WEB-INF/pages/form.jsp
Step 9 : Now the time to run and see the behavior of the application.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Student Registration Form</title> </head> <body > <center> <div style="color: blue; font-size: 25px">Student Registration Form</div> <c:url var="userRegistration" value="saveUser.html" /> <form:form id="registerForm" modelAttribute="student" method="post" action="register"> <table width="500px" height="170px"> <tr> <td><form:label path="firstName">First Name</form:label> </td> <td><form:input path="firstName" /> </td> </tr> <tr> <td><form:label path="lastName">Last Name</form:label> </td> <td><form:input path="lastName" /> </td> </tr> <tr> <td><form:label path="email">Email</form:label> </td> <td><form:input path="email" /> </td> </tr> <tr> <td><form:label path="phone">Phone</form:label> </td> <td><form:input path="phone" /> </td> </tr> <tr> <td></td> <td><input type="submit" value="Register" /></td> </tr> </table> </form:form> <a href="list">View All Students List</a> </center> </body> </html> |
Step 9 : Now the time to run and see the behavior of the application.
The student registration screen looks like as below.
And the student details screen looks like as below.





