Spring Web MVC By: Zeeshan Hanif Sr. Software Engineer Etilize Pvt. Ltd. A GfK Product data company
Agenda  What is spring MVC  Features  Spring MVC Workflow  Important Components of Spring MVC  Demo – External configuration  Demo – Annotation  Convention over Configuration  World without Rules  Demo – Form Submission  Demo – Session Storage  Demo – REST based URL  Demo – Ajax
Prerequisite  Spring Core  IOC & Dependency Injection
Source: www.springsource.org
Spring MVC  The Spring Web MVC Framework is a robust, flexible, and well-designed framework for rapidly developing web applications using the MVC design pattern.
Features  Clear separation of roles. Each role — controller, validator, command object, form object, model object, handler mapping, view resolver and so on.  Powerful and straightforward configuration of both framework and application classes as JavaBeans  Adaptability and flexibility. Define any controller method signature you need for a given scenario
Features (cont.)  Use existing business objects as command or form objects instead of mirroring them to extend a particular framework base class  Flexible model transfer. Model transfer with a name/value Map supports easy integration with any view technology  A simple yet powerful JSP tag library  Easier testing  REST based URL support
Spring MVC Workflow Source: www.springsource.org
Important Components  DispatcherServlet  Controller  HandlerMapping/@RequestMapping  ModelAndView  Model & @ModelAttribute  ViewResolver
DispatcherServlet  The Dispatcher Servlet follows the Front Controller Design Pattern for handling Client Requests.  It means that whatever Url comes from the Client, this Servlet will intercept the Client Request before passing the Request Object to the Controller.
DispatcherServlet (cont.) <web-app> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.gfk</url-pattern> </servlet-mapping> </web-app>
Controller  Controllers are components that are being called by the Dispatcher Servlet for doing any kind of Business Logic  Spring Distribution already comes with a variety of Controller Components each doing a specific purpose - spring 2.x  SimpleFormController  AbstractController  MultiActionController  Spring 3 Controller  @Controller Annotation
Controller (Cont.)  Old School of Spring MVC public class MySimpleController extends AbstractController { public ModelAndView handleRequestInternal (HttpServletRequest request, HttpServletResponse response) { return new ModelAndView("myView"); } }
Controller (Cont.)  Spring MVC 3.0 @Controller public class DemoSpring3Controller { @RequestMapping("/demoSpring3") public ModelAndView helloWorld() { String msg = "Hello Spring 3 World! Etilize -- GfK"; return new ModelAndView("demosp", "message", msg); } } <context:component-scan base-package="com.gfk.etilize.controller" />
HandlerMapping  A Handler Mapping provides an abstract way that tell how the Client's Url has to be mapped to the Handlers.  Four concrete variation of Handler Mapping are available  BeanNameUrl HandlerMapping  CommonsPathMap HandlerMapping  ControllerClassName HandlerMapping  SimpleUrl HandlerMapping
HandlerMapping (Cont.)  BeanNameUrl HandlerMapping  URL request http://localhost:8080/spweb/showStudents  Bean Mapping <beans> <bean id="beanNameUrl" class="org.springframework.web.servlet.handler. BeanNameUrlHandlerMapping"/> <bean name="/showStudents.jsp" class="com.gfk.etilize.ShowStudentsController"> </bean> </beans>
HandlerMapping (Cont.)  SimpleUrlHandlerMapping <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHan dlerMapping"> <property name="urlMap"> <map> <entry key="/demoSpring.gfk"> <ref bean="demoSpringController"/> </entry> </map> </property> </bean> <bean id="demoSpringController" class="com.gfk.etilize.controller.DemoSpringController" />
HandlerMapping (Cont.)  Spring 3.0 uses @RequestMapping for Mapping @Controller public class DemoSpring3Controller { @RequestMapping("/demoSpring3") public ModelAndView helloWorld() { String msg = "Hello Spring 3 World"; return new ModelAndView("demosp", "message", msg); } }
ModelAndView  ModelandView is returned by the Controller object back to the Dispatcher Servlet.  This class is just a Container class for holding the Model and the View information.  This way of specifying a View is called a Logical View. It means that demosp either can point to something called demosp.jsp or demosp.pdf or demosp.xml ModelAndView(viewName, “Key”, object); return new ModelAndView("demosp", "message", msg);
Model & @ModelAttribute  Model object Automatically created on every request @RequestMapping public void showList(Model model){ model.addAttribute("studentList", studentService.getAllStudents()); } Implicitly added to Model and can be accessed with key “student” @RequestMapping public Student showList(){ return studentService.getStudent(); }
Model & @ModelAttribute @ModelAttribute – customized name @RequestMapping public @ModelAttribute(“stu”) Student showList(){ return studentService.getStudent(); } @ModelAttribute – Form values @RequestMapping("/new") public ModelAndView getStudentForm(){ return new ModelAndView("studentForm","student",new Student()); } <form:form action="add.gfk" method="POST" commandName=" student " > Name:<form:input path="name" size="60" /><br> <input type="submit" value="Register" /></td> </form:form> @RequestMapping public void saveStudent(@ModelAttribute Student stu){ studentService.saveStudent(stu); }
View Resolver  The mapping between the Logical name and the Physical View Location is taken care by the View Resolver object.  Spring comes with a set of Built-In Spring Resolvers.  We can write Custom View Resolvers by implementing the org.springframework.web.servlet.ViewResolver interface
View Resolver (Cont.)  BeanNameViewResolver  FreeMarkerViewResolver  InternalResourceViewResolver  JasperReportsViewResolver  ResourceBundleViewResolver  UrlBasedViewResolver  VelocityLayoutViewResolver  VelocityViewResolver  XmlViewResolver  XsltViewResolver
View Resolver (Cont.)  InternalResourceViewResolver Controller returns - new ModelAndView("myView1") <bean id="viewResolver“ class="org.springframework.web.servlet.view.InternalResourceVie wResolver"> <property name="prefix"> <value>/WEB-INF/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> the prefix + the logical View Name + the suffix /WEB-INF/myView.jsp
View Resolver (Cont.)  BeanNameViewResolver  One of the dis-advantage of using InternalResourceViewResolver is that the name of the View file (jsp or pdf) must be present in the Web Application Context.  Dynamically generated View files may not be possible.  In such a case, we may use the BeanName ViewResolver which will dynamically generate View in Pdf or Excel Formats.
View Resolver (Cont.) Controller returns - new ModelAndView(“excel") <bean id="beanNameResolver" class="org.springframework.web.servlet.view.BeanNameViewReso lver"/> <bean id = “excel" class = "MyExcelGenerator"/>
Demo – External configuration Demo – Annotation
Convention over Configuration  Write less code, get consistency  Conventions available for  Request mapping  View name selection  Model population
Convention over Configuration  Mapping By RequestMapping @Controller public class DemoSpring3Controller { @RequestMapping("/demoSpring3") public void helloWorld(){} }
Convention over Configuration @Controller public class StudentController { @RequestMapping public void listAll(Model model){ model.addAttribute(new Student("Test",23)); } } GET /student/listAll Mapping of class and method name View with method name selected from request path Model key generated from object type
Convention over Configuration  Mapping By Convention @Controller public class StudentController { URL  /student/showList , View  showList.jsp @RequestMapping public void showList(Model model){} URL  /student/getStudent, View  getStudent.jsp @RequestMapping public Student getStudent(){ … return stu; } }
World without Rules  Return Type?  Return Type Can be:  ModelAndViewObject  Model  Map  View  String  Void  Any Custom or built-in datatype  e.g. Student, Student[],ArrayList etc.
World without Rules (Cont.)  Parameter Type?  Parameter can be in any order:  ServletRequest/HttpServletRequest  ServletResponse/HttpServletResponse  HttpSession  InputStream/java.io.Reader  OutputStream/java.io.Writer  @RequestParam("product") int id or any type  @PathVariable String name or any type  @CookieValue("cookie_name") String or any type  @RequestHeader("content") String or any type  @ModelAttribute User us or any custom object  Errors  BindingResult  SessionStatus
Demo – Form Submission
@RequestParam  Type Conversion @RequestMapping("/login") public void login(@RequestParam String userName, @RequestParam int age){ }  Optional Request parameter -- must use object for optional @RequestMapping("/login") public void login(@RequestParam(required=false) String userName){ }
Demo – @RequestParam
@SessionAttribute @Controller @SessionAttributes("user") public class LoginController { @RequestMapping("/login") public User login(@RequestParam int id){ return loginService.login(id); } } User Object will be stored in session with key “user”
Demo – @SessionAttribute
@PathVariable – REST URLs  GET /students/find/5 @RequestMapping(“/find/{id}") public ModelAndView findStudent(@PathVariable int id , Model model){ model.addAttribute("stu", studentService.getStudent(id)); return new ModelAndView("searchStudent"); }
Demo – @PathVariable – REST URLs
Demo – Ajax  @ResponseBody annotation instructs Spring MVC to serialize the Student to the client.  Spring MVC automatically serializes to JSON because the client accepts that content type @RequestMapping(value="/student") public @ResponseBody Student getStudent( @RequestParam int id) { return studentService.getStudent(id); }
Q & A
 Source Code http://www.4shared.com/zip/sHRtnXXd/De moSpringMVC.html  You can find this presentation on slideshare http://www.slideshare.net/zeeshanhanif
Contact zeeshanhanif@gmail.com http://www.linkedin.com/in/zeeshanhanif http://www.facebook.com/zeeshanhanif

Spring Web MVC

  • 1.
    Spring Web MVC By: ZeeshanHanif Sr. Software Engineer Etilize Pvt. Ltd. A GfK Product data company
  • 2.
    Agenda  What isspring MVC  Features  Spring MVC Workflow  Important Components of Spring MVC  Demo – External configuration  Demo – Annotation  Convention over Configuration  World without Rules  Demo – Form Submission  Demo – Session Storage  Demo – REST based URL  Demo – Ajax
  • 3.
    Prerequisite  Spring Core IOC & Dependency Injection
  • 4.
  • 5.
    Spring MVC  TheSpring Web MVC Framework is a robust, flexible, and well-designed framework for rapidly developing web applications using the MVC design pattern.
  • 6.
    Features  Clear separationof roles. Each role — controller, validator, command object, form object, model object, handler mapping, view resolver and so on.  Powerful and straightforward configuration of both framework and application classes as JavaBeans  Adaptability and flexibility. Define any controller method signature you need for a given scenario
  • 7.
    Features (cont.)  Useexisting business objects as command or form objects instead of mirroring them to extend a particular framework base class  Flexible model transfer. Model transfer with a name/value Map supports easy integration with any view technology  A simple yet powerful JSP tag library  Easier testing  REST based URL support
  • 8.
    Spring MVC Workflow Source:www.springsource.org
  • 9.
    Important Components  DispatcherServlet Controller  HandlerMapping/@RequestMapping  ModelAndView  Model & @ModelAttribute  ViewResolver
  • 10.
    DispatcherServlet  The DispatcherServlet follows the Front Controller Design Pattern for handling Client Requests.  It means that whatever Url comes from the Client, this Servlet will intercept the Client Request before passing the Request Object to the Controller.
  • 11.
  • 12.
    Controller  Controllers arecomponents that are being called by the Dispatcher Servlet for doing any kind of Business Logic  Spring Distribution already comes with a variety of Controller Components each doing a specific purpose - spring 2.x  SimpleFormController  AbstractController  MultiActionController  Spring 3 Controller  @Controller Annotation
  • 13.
    Controller (Cont.)  OldSchool of Spring MVC public class MySimpleController extends AbstractController { public ModelAndView handleRequestInternal (HttpServletRequest request, HttpServletResponse response) { return new ModelAndView("myView"); } }
  • 14.
    Controller (Cont.)  SpringMVC 3.0 @Controller public class DemoSpring3Controller { @RequestMapping("/demoSpring3") public ModelAndView helloWorld() { String msg = "Hello Spring 3 World! Etilize -- GfK"; return new ModelAndView("demosp", "message", msg); } } <context:component-scan base-package="com.gfk.etilize.controller" />
  • 15.
    HandlerMapping  A HandlerMapping provides an abstract way that tell how the Client's Url has to be mapped to the Handlers.  Four concrete variation of Handler Mapping are available  BeanNameUrl HandlerMapping  CommonsPathMap HandlerMapping  ControllerClassName HandlerMapping  SimpleUrl HandlerMapping
  • 16.
    HandlerMapping (Cont.)  BeanNameUrlHandlerMapping  URL request http://localhost:8080/spweb/showStudents  Bean Mapping <beans> <bean id="beanNameUrl" class="org.springframework.web.servlet.handler. BeanNameUrlHandlerMapping"/> <bean name="/showStudents.jsp" class="com.gfk.etilize.ShowStudentsController"> </bean> </beans>
  • 17.
    HandlerMapping (Cont.)  SimpleUrlHandlerMapping <beanid="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHan dlerMapping"> <property name="urlMap"> <map> <entry key="/demoSpring.gfk"> <ref bean="demoSpringController"/> </entry> </map> </property> </bean> <bean id="demoSpringController" class="com.gfk.etilize.controller.DemoSpringController" />
  • 18.
    HandlerMapping (Cont.)  Spring3.0 uses @RequestMapping for Mapping @Controller public class DemoSpring3Controller { @RequestMapping("/demoSpring3") public ModelAndView helloWorld() { String msg = "Hello Spring 3 World"; return new ModelAndView("demosp", "message", msg); } }
  • 19.
    ModelAndView  ModelandView isreturned by the Controller object back to the Dispatcher Servlet.  This class is just a Container class for holding the Model and the View information.  This way of specifying a View is called a Logical View. It means that demosp either can point to something called demosp.jsp or demosp.pdf or demosp.xml ModelAndView(viewName, “Key”, object); return new ModelAndView("demosp", "message", msg);
  • 20.
    Model & @ModelAttribute Model object Automatically created on every request @RequestMapping public void showList(Model model){ model.addAttribute("studentList", studentService.getAllStudents()); } Implicitly added to Model and can be accessed with key “student” @RequestMapping public Student showList(){ return studentService.getStudent(); }
  • 21.
    Model & @ModelAttribute @ModelAttribute– customized name @RequestMapping public @ModelAttribute(“stu”) Student showList(){ return studentService.getStudent(); } @ModelAttribute – Form values @RequestMapping("/new") public ModelAndView getStudentForm(){ return new ModelAndView("studentForm","student",new Student()); } <form:form action="add.gfk" method="POST" commandName=" student " > Name:<form:input path="name" size="60" /><br> <input type="submit" value="Register" /></td> </form:form> @RequestMapping public void saveStudent(@ModelAttribute Student stu){ studentService.saveStudent(stu); }
  • 22.
    View Resolver  Themapping between the Logical name and the Physical View Location is taken care by the View Resolver object.  Spring comes with a set of Built-In Spring Resolvers.  We can write Custom View Resolvers by implementing the org.springframework.web.servlet.ViewResolver interface
  • 23.
    View Resolver (Cont.) BeanNameViewResolver  FreeMarkerViewResolver  InternalResourceViewResolver  JasperReportsViewResolver  ResourceBundleViewResolver  UrlBasedViewResolver  VelocityLayoutViewResolver  VelocityViewResolver  XmlViewResolver  XsltViewResolver
  • 24.
    View Resolver (Cont.) InternalResourceViewResolver Controller returns - new ModelAndView("myView1") <bean id="viewResolver“ class="org.springframework.web.servlet.view.InternalResourceVie wResolver"> <property name="prefix"> <value>/WEB-INF/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> the prefix + the logical View Name + the suffix /WEB-INF/myView.jsp
  • 25.
    View Resolver (Cont.) BeanNameViewResolver  One of the dis-advantage of using InternalResourceViewResolver is that the name of the View file (jsp or pdf) must be present in the Web Application Context.  Dynamically generated View files may not be possible.  In such a case, we may use the BeanName ViewResolver which will dynamically generate View in Pdf or Excel Formats.
  • 26.
    View Resolver (Cont.) Controllerreturns - new ModelAndView(“excel") <bean id="beanNameResolver" class="org.springframework.web.servlet.view.BeanNameViewReso lver"/> <bean id = “excel" class = "MyExcelGenerator"/>
  • 27.
    Demo – Externalconfiguration Demo – Annotation
  • 28.
    Convention over Configuration Write less code, get consistency  Conventions available for  Request mapping  View name selection  Model population
  • 29.
    Convention over Configuration Mapping By RequestMapping @Controller public class DemoSpring3Controller { @RequestMapping("/demoSpring3") public void helloWorld(){} }
  • 30.
    Convention over Configuration @Controller publicclass StudentController { @RequestMapping public void listAll(Model model){ model.addAttribute(new Student("Test",23)); } } GET /student/listAll Mapping of class and method name View with method name selected from request path Model key generated from object type
  • 31.
    Convention over Configuration Mapping By Convention @Controller public class StudentController { URL  /student/showList , View  showList.jsp @RequestMapping public void showList(Model model){} URL  /student/getStudent, View  getStudent.jsp @RequestMapping public Student getStudent(){ … return stu; } }
  • 32.
    World without Rules Return Type?  Return Type Can be:  ModelAndViewObject  Model  Map  View  String  Void  Any Custom or built-in datatype  e.g. Student, Student[],ArrayList etc.
  • 33.
    World without Rules(Cont.)  Parameter Type?  Parameter can be in any order:  ServletRequest/HttpServletRequest  ServletResponse/HttpServletResponse  HttpSession  InputStream/java.io.Reader  OutputStream/java.io.Writer  @RequestParam("product") int id or any type  @PathVariable String name or any type  @CookieValue("cookie_name") String or any type  @RequestHeader("content") String or any type  @ModelAttribute User us or any custom object  Errors  BindingResult  SessionStatus
  • 34.
    Demo – FormSubmission
  • 35.
    @RequestParam  Type Conversion @RequestMapping("/login") publicvoid login(@RequestParam String userName, @RequestParam int age){ }  Optional Request parameter -- must use object for optional @RequestMapping("/login") public void login(@RequestParam(required=false) String userName){ }
  • 36.
  • 37.
    @SessionAttribute @Controller @SessionAttributes("user") public class LoginController{ @RequestMapping("/login") public User login(@RequestParam int id){ return loginService.login(id); } } User Object will be stored in session with key “user”
  • 38.
  • 39.
    @PathVariable – RESTURLs  GET /students/find/5 @RequestMapping(“/find/{id}") public ModelAndView findStudent(@PathVariable int id , Model model){ model.addAttribute("stu", studentService.getStudent(id)); return new ModelAndView("searchStudent"); }
  • 40.
  • 41.
    Demo – Ajax @ResponseBody annotation instructs Spring MVC to serialize the Student to the client.  Spring MVC automatically serializes to JSON because the client accepts that content type @RequestMapping(value="/student") public @ResponseBody Student getStudent( @RequestParam int id) { return studentService.getStudent(id); }
  • 42.
  • 43.
     Source Code http://www.4shared.com/zip/sHRtnXXd/De moSpringMVC.html You can find this presentation on slideshare http://www.slideshare.net/zeeshanhanif
  • 44.