diff --git a/spring_controller/pom.xml b/spring_controller/pom.xml
new file mode 100644
index 0000000000..661c46a4b9
--- /dev/null
+++ b/spring_controller/pom.xml
@@ -0,0 +1,56 @@
+
+ 4.0.0
+ test
+ test-mvc
+ 0.0.1-SNAPSHOT
+ war
+
+
+
+ org.springframework
+ spring-webmvc
+ 4.3.0.RELEASE
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.0.1
+ compile
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.6.3
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.6.3
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.6.3
+
+
+ org.springframework
+ spring-web
+ 4.3.0.RELEASE
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.springframework
+ spring-test
+ 4.1.7.RELEASE
+
+
+
+
+
\ No newline at end of file
diff --git a/spring_controller/src/main/java/com/baledung/controller/RestAnnotatedController.java b/spring_controller/src/main/java/com/baledung/controller/RestAnnotatedController.java
new file mode 100644
index 0000000000..c01d074b97
--- /dev/null
+++ b/spring_controller/src/main/java/com/baledung/controller/RestAnnotatedController.java
@@ -0,0 +1,21 @@
+package com.baledung.controller;
+
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baledung.student.Student;
+
+@RestController
+public class RestAnnotatedController
+{
+ @RequestMapping(value="/annotated/student/{studentId}")
+ public Student getData(@PathVariable Integer studentId)
+ {
+ Student student = new Student();
+ student.setName("Peter");
+ student.setId(studentId);
+
+ return student;
+ }
+}
diff --git a/spring_controller/src/main/java/com/baledung/controller/RestController.java b/spring_controller/src/main/java/com/baledung/controller/RestController.java
new file mode 100644
index 0000000000..226f66b5df
--- /dev/null
+++ b/spring_controller/src/main/java/com/baledung/controller/RestController.java
@@ -0,0 +1,30 @@
+package com.baledung.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.baledung.student.Student;
+
+@Controller
+public class RestController{
+
+ /**
+ * Get a student based on the id of the student
+ * specified in path variable {studentId}
+ * @param studentId
+ * @return
+ */
+ @RequestMapping(value="/student/{studentId}",method=RequestMethod.GET)
+ public @ResponseBody Student getTestData(@PathVariable Integer studentId)
+ {
+ Student student = new Student();
+ student.setName("Peter");
+ student.setId(studentId);
+
+ return student;
+
+ }
+}
diff --git a/spring_controller/src/main/java/com/baledung/controller/TestController.java b/spring_controller/src/main/java/com/baledung/controller/TestController.java
new file mode 100644
index 0000000000..5dafc14d84
--- /dev/null
+++ b/spring_controller/src/main/java/com/baledung/controller/TestController.java
@@ -0,0 +1,26 @@
+
+/**
+ * @author Prashant Dutta
+ *
+ */
+package com.baledung.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+@Controller
+@RequestMapping(value="/test")
+public class TestController{
+
+ @RequestMapping(method=RequestMethod.GET)
+ public ModelAndView getTestData()
+ {
+ ModelAndView mv = new ModelAndView();
+ mv.setViewName("welcome");
+ mv.getModel().put("data", "Welcome home man");
+
+ return mv;
+ }
+}
\ No newline at end of file
diff --git a/spring_controller/src/main/java/com/baledung/student/Student.java b/spring_controller/src/main/java/com/baledung/student/Student.java
new file mode 100644
index 0000000000..8cf0b5e263
--- /dev/null
+++ b/spring_controller/src/main/java/com/baledung/student/Student.java
@@ -0,0 +1,40 @@
+/**
+ *
+ */
+package com.baledung.student;
+
+public class Student
+{
+ private String name;
+
+ private int id;
+
+//----------------------------- getters and setters--------------------------------------------------------
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @Override
+ public int hashCode(){
+ return this.id;
+ }
+
+ @Override
+ public boolean equals(Object obj){
+ return this.name.equals(((Student)obj).getName());
+ }
+
+
+}
\ No newline at end of file
diff --git a/spring_controller/src/main/resources/test-mvc.xml b/spring_controller/src/main/resources/test-mvc.xml
new file mode 100644
index 0000000000..c632a5e435
--- /dev/null
+++ b/spring_controller/src/main/resources/test-mvc.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+ /WEB-INF/
+
+
+ .jsp
+
+
+
\ No newline at end of file
diff --git a/spring_controller/src/main/webapp/WEB-INF/test-mvc.xml b/spring_controller/src/main/webapp/WEB-INF/test-mvc.xml
new file mode 100644
index 0000000000..c48e4f94f6
--- /dev/null
+++ b/spring_controller/src/main/webapp/WEB-INF/test-mvc.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+ /WEB-INF/
+
+
+ .jsp
+
+
+
\ No newline at end of file
diff --git a/spring_controller/src/main/webapp/WEB-INF/web.xml b/spring_controller/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..a1545a8d51
--- /dev/null
+++ b/spring_controller/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+ test-mvc
+
+ org.springframework.web.servlet.DispatcherServlet
+
+ 1
+
+ contextConfigLocation
+ /WEB-INF/test-mvc.xml
+
+
+
+
+ test-mvc
+ /test/*
+
+
+
+
+
+
+ /WEB-INF/index.jsp
+
+
diff --git a/spring_controller/src/main/webapp/WEB-INF/welcome.jsp b/spring_controller/src/main/webapp/WEB-INF/welcome.jsp
new file mode 100644
index 0000000000..17d5589e74
--- /dev/null
+++ b/spring_controller/src/main/webapp/WEB-INF/welcome.jsp
@@ -0,0 +1,12 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+ pageEncoding="UTF-8"%>
+
+
+
+
+Insert title here
+
+
+Data returned is ${data}
+
+
\ No newline at end of file
diff --git a/spring_controller/src/test/java/com/baledung/test/ControllerTest.java b/spring_controller/src/test/java/com/baledung/test/ControllerTest.java
new file mode 100644
index 0000000000..6a2567a29a
--- /dev/null
+++ b/spring_controller/src/test/java/com/baledung/test/ControllerTest.java
@@ -0,0 +1,105 @@
+package com.baledung.test;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.baledung.student.Student;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ *
+ * Test class for spring controllers
+ *
+ * @author Prashant.Dutta
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration({"classpath:test-mvc.xml"})
+public class ControllerTest
+{
+ private MockMvc mockMvc;
+
+ @Autowired
+ private WebApplicationContext wac;
+
+ private Student selectedStudent;
+
+ @Before
+ public void setUp()
+ {
+ this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+
+ selectedStudent = new Student();
+ selectedStudent.setId(1);
+ selectedStudent.setName("Peter");
+ }
+
+ /**
+ * Test basic test controller
+ * @throws Exception
+ */
+ @Test
+ public void testTestController() throws Exception
+ {
+
+ ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test/"))
+ .andReturn()
+ .getModelAndView();
+
+ // validate modal data
+ Assert.assertSame(mv.getModelMap().get("data").toString(), "Welcome home man");
+
+ // validate view name
+ Assert.assertSame(mv.getViewName(), "welcome");
+ }
+
+ /**
+ * Test rest controller
+ * @throws Exception
+ */
+ @Test
+ public void testRestController() throws Exception
+ {
+
+ String responseBody = this.mockMvc.perform(MockMvcRequestBuilders.get("/student/{studentId}",1))
+ .andReturn().getResponse()
+ .getContentAsString();
+
+ ObjectMapper reader = new ObjectMapper();
+
+ Student studentDetails = reader.readValue(responseBody, Student.class);
+
+ Assert.assertEquals(selectedStudent, studentDetails);
+
+ }
+
+ /**
+ * Test rest controller annotated with test
+ * @throws Exception
+ */
+ @Test
+ public void testRestAnnotatedController() throws Exception
+ {
+
+ String responseBody = this.mockMvc.perform(MockMvcRequestBuilders.get("/annotated/student/{studentId}",1))
+ .andReturn().getResponse()
+ .getContentAsString();
+
+ ObjectMapper reader = new ObjectMapper();
+
+ Student studentDetails = reader.readValue(responseBody, Student.class);
+
+ Assert.assertEquals(selectedStudent, studentDetails);
+ }
+}