diff --git a/README.md b/README.md index a3d7eb7..d02aa9e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,8 @@ -# Spring MVC and Hibernate template application +# Groovy, Spring MVC and Hibernate sample application -This is a template for a web application that uses Spring MVC and Hibernate. The sample code is a simple CRUD page that manipulates records for a single model object. +This is a sample web application that uses Groovy, Spring MVC, Sitemesh and Hibernate. +The sample code is a simple CRUD page that manipulates records for a single model object. ## Running the application locally -First build with: - - $mvn clean install - -Then run it with: - - $java -jar target/dependency/webapp-runner.jar target/*.war - + $mvn jetty:run diff --git a/pom.xml b/pom.xml index bd65396..fc92f90 100755 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,8 @@ 4.0.0 - com.example - spring-hibernate-template + com.github.kdabir + groovy-springmvc-sample war 0.0.1-SNAPSHOT @@ -18,6 +18,12 @@ 3.0.1 provided + + + org.codehaus.groovy + groovy-all + 2.0.5 + org.springframework spring-webmvc @@ -28,6 +34,11 @@ spring-orm ${org.springframework.version} + + org.springframework + spring-jdbc + ${org.springframework.version} + taglibs standard @@ -64,6 +75,12 @@ 7.0.27.1 provided + + + org.sitemesh + sitemesh + 3.0-alpha-1 + @@ -73,12 +90,32 @@ 1.6 1.6 + groovy-eclipse-compiler + + + org.codehaus.groovy + groovy-eclipse-compiler + 2.7.0-01 + + maven-war-plugin 2.2 + + + org.mortbay.jetty + jetty-maven-plugin + 8.1.7.v20120910 + + 3 + groovy-rocks + 8123 + + + org.apache.maven.plugins maven-dependency-plugin diff --git a/src/main/java/com/example/controller/PersonController.groovy b/src/main/java/com/example/controller/PersonController.groovy new file mode 100755 index 0000000..1dba414 --- /dev/null +++ b/src/main/java/com/example/controller/PersonController.groovy @@ -0,0 +1,106 @@ +package com.example.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import com.example.model.Person; +import com.example.service.PersonService +import org.springframework.web.bind.annotation.ResponseBody +import groovy.json.JsonBuilder +import groovy.xml.MarkupBuilder; + +@Controller +@RequestMapping("/people") +class PersonController { + + @Qualifier("personServiceImpl") + @Autowired + PersonService personService; + + @RequestMapping("/") + String listPeople(Map map) { + + map.person = new Person() + map.peopleList = personService.listPeople() + + "people" + } + + @RequestMapping(value = "/add", method = RequestMethod.POST) + String addPerson(@ModelAttribute("person") Person person, BindingResult result) { + + personService.addPerson(person) + + "redirect:/people/" + } + + @RequestMapping("/delete/{personId}") + String deletePerson(@PathVariable("personId") Integer personId) { + + personService.removePerson(personId) + + "redirect:/people/" + } + + @RequestMapping(value = "/status/json", method = RequestMethod.GET, produces="application/json") + @ResponseBody + public String getJson() { + def json = new JsonBuilder() + json.status { + date new Date() + peopleCount personService.listPeople().size() + } + json.toPrettyString() + } + + @RequestMapping(value = "/xml", method = RequestMethod.GET, produces="application/xml") + @ResponseBody + public String getXml() { + StringWriter writer = new StringWriter() + def xml = new MarkupBuilder(writer) + + xml.people { + personService.listPeople().each { Person p -> + person { + id p.id + firstName p.firstName + lastName p.lastName + } + } + } + writer.toString() + } + + @RequestMapping(value = "/firstNames", method = RequestMethod.GET) + @ResponseBody + public String getFirstNamesHtml() { + StringWriter writer = new StringWriter() + def out = new MarkupBuilder(writer) + + out.html { + head { + title "List of First Names" + } + body { + h1 "List of First Names" + + ul { + personService.listPeople().each { Person p -> + li { + h3 p.firstName + } + } + + } + } + } + writer.toString() + } + +} diff --git a/src/main/java/com/example/controller/PersonController.java b/src/main/java/com/example/controller/PersonController.java deleted file mode 100755 index 82ee420..0000000 --- a/src/main/java/com/example/controller/PersonController.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.example.controller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -import com.example.model.Person; -import com.example.service.PersonService; - -import java.util.Map; - -@Controller -public class PersonController { - - @Autowired - private PersonService personService; - - @RequestMapping("/") - public String listPeople(Map map) { - - map.put("person", new Person()); - map.put("peopleList", personService.listPeople()); - - return "people"; - } - - @RequestMapping(value = "/add", method = RequestMethod.POST) - public String addPerson(@ModelAttribute("person") Person person, BindingResult result) { - - personService.addPerson(person); - - return "redirect:/people/"; - } - - @RequestMapping("/delete/{personId}") - public String deletePerson(@PathVariable("personId") Integer personId) { - - personService.removePerson(personId); - - return "redirect:/people/"; - } -} diff --git a/src/main/java/com/example/model/Person.groovy b/src/main/java/com/example/model/Person.groovy new file mode 100755 index 0000000..649bd07 --- /dev/null +++ b/src/main/java/com/example/model/Person.groovy @@ -0,0 +1,18 @@ +package com.example.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Person { + + @Id + @GeneratedValue + Integer id + + String firstName + + String lastName + +} diff --git a/src/main/java/com/example/model/Person.java b/src/main/java/com/example/model/Person.java deleted file mode 100755 index ce297eb..0000000 --- a/src/main/java/com/example/model/Person.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.example.model; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; - -@Entity -public class Person { - - @Id - @GeneratedValue - private Integer id; - - private String firstName; - - private String lastName; - - - public Integer getId() { - return id; - } - - public void setId(Integer 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; - } - -} diff --git a/src/main/java/com/example/service/PersonServiceGroovyJdbcImpl.groovy b/src/main/java/com/example/service/PersonServiceGroovyJdbcImpl.groovy new file mode 100644 index 0000000..f7cf7f2 --- /dev/null +++ b/src/main/java/com/example/service/PersonServiceGroovyJdbcImpl.groovy @@ -0,0 +1,38 @@ +package com.example.service; + + +import com.example.model.Person +import groovy.sql.Sql +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +import javax.sql.DataSource + +@Service +public class PersonServiceGroovyJdbcImpl implements PersonService { + + @Autowired + DataSource dataSource; + + @Override + public void addPerson(Person person) { + new Sql(dataSource).execute('INSERT INTO PERSON(FIRSTNAME,LASTNAME) VALUES (?,?)', + [person.firstName, person.lastName]) + } + + @Override + public List listPeople() { + List people = [] + + new Sql(dataSource).eachRow("SELECT * FROM PERSON") { + people << new Person(id: it.id, firstName: it.firstName, lastName: it.lastName) + } + + return people; + } + + @Override + public void removePerson(Integer id) { + new Sql(dataSource).execute("DELETE FROM PERSON WHERE PERSON.ID=$id"); + } +} diff --git a/src/main/java/com/example/service/PersonServiceJdbcImpl.java b/src/main/java/com/example/service/PersonServiceJdbcImpl.java new file mode 100644 index 0000000..5f6e94f --- /dev/null +++ b/src/main/java/com/example/service/PersonServiceJdbcImpl.java @@ -0,0 +1,96 @@ +package com.example.service; + +import com.example.model.Person; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.sql.DataSource; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +@Service +public class PersonServiceJdbcImpl implements PersonService { + + @Autowired + DataSource dataSource; + + @Override + public void addPerson(Person person) { + Connection connection = null; + + try { + connection = dataSource.getConnection(); + + PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO PERSON(FIRSTNAME,LASTNAME) VALUES (?,?)"); + preparedStatement.setString(1, person.getFirstName()); + preparedStatement.setString(2, person.getLastName()); + + preparedStatement.execute(); + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) {} + } + } + + } + + @Override + public List listPeople() { + Connection connection = null; + List people = new ArrayList(); + + try { + connection = dataSource.getConnection(); + Statement statement = connection.createStatement(); + + ResultSet resultSet = statement.executeQuery("SELECT * FROM PERSON"); + while (resultSet.next()) { + Person person = new Person(); + person.setId(resultSet.getInt("ID")); + person.setFirstName(resultSet.getString("FIRSTNAME")); + person.setLastName(resultSet.getString("LASTNAME")); + + people.add(person); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) {} + } + } + + return people; + } + + @Override + public void removePerson(Integer id) { + Connection connection = null; + + try { + connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM PERSON WHERE PERSON.ID=?"); + preparedStatement.setInt(1, id); + + preparedStatement.execute(); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) {} + } + } + + } +} diff --git a/src/main/java/com/example/service/PersonServiceSpringJdbcImpl.java b/src/main/java/com/example/service/PersonServiceSpringJdbcImpl.java new file mode 100644 index 0000000..c2f827e --- /dev/null +++ b/src/main/java/com/example/service/PersonServiceSpringJdbcImpl.java @@ -0,0 +1,49 @@ +package com.example.service; + +import com.example.model.Person; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.support.JdbcDaoSupport; +import org.springframework.stereotype.Service; + +import javax.sql.DataSource; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +@Service +public class PersonServiceSpringJdbcImpl extends JdbcDaoSupport implements PersonService { + + @Autowired + PersonServiceSpringJdbcImpl(DataSource dataSource) { + this.setDataSource(dataSource); + } + + @Override + public void addPerson(Person person) { + getJdbcTemplate().update( + "INSERT INTO PERSON (FIRSTNAME,LASTNAME) VALUES (?, ?)", + new Object[]{person.getFirstName(), person.getLastName()} + ); + } + + @Override + public List listPeople() { + return getJdbcTemplate().query( + "SELECT * FROM PERSON", + new RowMapper() { + public Person mapRow(ResultSet rs, int rowNum) throws SQLException { + Person person = new Person(); + person.setId(rs.getInt("ID")); + person.setFirstName(rs.getString("FIRSTNAME")); + person.setLastName(rs.getString("LASTNAME")); + return person; + } + }); + } + + @Override + public void removePerson(Integer id) { + getJdbcTemplate().update("DELETE FROM PERSON WHERE ID = ?", id); + } +} diff --git a/src/main/webapp/WEB-INF/jsp/people.jsp b/src/main/webapp/WEB-INF/jsp/people.jsp index fd05abf..975bb7d 100755 --- a/src/main/webapp/WEB-INF/jsp/people.jsp +++ b/src/main/webapp/WEB-INF/jsp/people.jsp @@ -1,76 +1,52 @@ -<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> -<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> -<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> +<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %> +<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - - Spring MVC and Hibernate Template - - - - - - - - - - - + Simple CRUD Page -