54
Spring MVC Guy Nir January 2012

Spring 3.x - Spring MVC

  • Upload
    guy-nir

  • View
    6.795

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Spring 3.x - Spring MVC

Spring MVCGuy Nir

January 2012

Page 2: Spring 3.x - Spring MVC

2

» About Spring MVC» Architecture and design» Handler mapping» Controllers» View resolvers» Annotation driven» Summary

Agenda

Spring MVC

Page 3: Spring 3.x - Spring MVC

About Spring MVC

Page 4: Spring 3.x - Spring MVC

4

» Top-level project at Spring framework Acknowledged that web is a crucial part of JEE world. Provide first-class support for web technologies• Markup generators (JSP, Velocity, Freemarker, etc …)• REST support.

» Integrates web and Spring core.

About

Spring MVC

Page 5: Spring 3.x - Spring MVC

5

» Introduced with Spring 1.0 (August 2003)» Led by Rod Johnson and Juergen Hoeller» Introduced due the poor design of other frameworks

Struts Jakarta

AboutHistory

Spring MVC

Page 6: Spring 3.x - Spring MVC

Architecture and design

Page 7: Spring 3.x - Spring MVC

7

Spring MVC

Architecture and design

ServletServlet Application Context

Application Context Spring MVCSpring MVC

Page 8: Spring 3.x - Spring MVC

8

» Open-close principle [1]

Open for extension, closed for modification.» Convention over configuration. [2]

» Model-View-Controller (MVC) driven. [3]

» Clear separation of concerns.

Architecture and designDesign guidelines

Spring MVC

[1] Bob Martin, The Open-Closed Principle[2] Convention over configuration[3] Model View Controller – GoF design pattern

Page 9: Spring 3.x - Spring MVC

9

» Tightly coupled with HTTP Servlet API.» Request-based model.» Takes a strategy approach. [4]

» All activity surrounds the DispatcherServlet.

Architecture and designDesign guidelines - continued

Spring MVC

[4] Strategy – GoF design pattern

Page 10: Spring 3.x - Spring MVC

10

Architecture and designweb.xml

Spring MVC

1 <web-app> 2 3 <servlet> 4 <servlet-name>petshop</servlet-name> 5 <servlet-class> 6 org.springframework.web.servlet.DispatcherServlet 7 </servlet-class> 8 <load-on-startup>1</load-on-startup> 9 </servlet>1011 <servlet-mapping>12 <servlet-name>petshop</servlet-name>13 <url-pattern>*.do</url-pattern>14 </servlet-mapping>15 16 </web-app>

1 <web-app> 2 3 <servlet> 4 <servlet-name>petshop</servlet-name> 5 <servlet-class> 6 org.springframework.web.servlet.DispatcherServlet 7 </servlet-class> 8 <load-on-startup>1</load-on-startup> 9 </servlet>1011 <servlet-mapping>12 <servlet-name>petshop</servlet-name>13 <url-pattern>*.do</url-pattern>14 </servlet-mapping>15 16 </web-app>

Servlet nameServlet name

Page 11: Spring 3.x - Spring MVC

11

Architecture and designApplication context lookup

Spring MVC

<servlet-name><servlet-name> /WEB-INF/<servlet-name>-servlet.xml/WEB-INF/<servlet-name>-servlet.xml

petshoppetshop /WEB-INF/petshop-servlet.xml/WEB-INF/petshop-servlet.xml

Page 12: Spring 3.x - Spring MVC

12

Architecture and designSpring MVC approach

Spring MVC

Page 13: Spring 3.x - Spring MVC

13

Spring MVC

Architecture and design

DispatcherServlet

DispatcherServlet

Incoming request

Outgoing response

Controller(Bean)

Controller(Bean)

Delegate

Rendered response

View renderer

View renderer

Model(JavaBean)Model

(JavaBean)

11 22

33

4 (?)4 (?)

5 (?)5 (?)66

Application context

Application context

Page 14: Spring 3.x - Spring MVC

14

Spring MVC

Architecture and design

DispatcherServlet

DispatcherServlet ControllerController

View renderer

View renderer

Page 15: Spring 3.x - Spring MVC

15

Dispatcher servlet flow

Spring MVC

IncomingHTTP request

Set localeSet locale

Simple controller adapter

Simple controller adapter

Annotation-based adapter

Annotation-based adapter

Another servlet adapter

Another servlet adapter

Interceptors(postHandle)

Interceptors(postHandle)

Interceptors(preHandle)

Interceptors(preHandle) Handler adapterHandler adapter View

rendererView

renderer

LocaleView

Themes

LocaleView

ThemesSecurity

authorizationSecurity

authorization

Exception handler

Exception handler

Page 16: Spring 3.x - Spring MVC

16

Dispatcher servlet flow

Spring MVC

IncomingHTTP request

Set localeSet locale

Simple controller adapter

Simple controller adapter

Annotation-based adapter

Annotation-based adapter

Another servlet adapter

Another servlet adapter

Interceptors(postHandle)

Interceptors(postHandle)

Interceptors(preHandle)

Interceptors(preHandle) Handler adapterHandler adapter View

rendererView

renderer

Exception handler

Exception handler

LocaleView

Themes

LocaleView

ThemesSecurity

authorizationSecurity

authorization

Controller View

Page 17: Spring 3.x - Spring MVC

17

Interceptors(postHandle)

Interceptors(postHandle)

Dispatcher servlet flow

Spring MVC

IncomingHTTP request

Simple controller adapter

Simple controller adapter

Annotation-based adapter

Annotation-based adapter

Another servlet adapter

Another servlet adapter

Handler adapterHandler adapter Viewrenderer

Viewrenderer

Exception handler

Exception handler

Interceptors(preHandle)

Interceptors(preHandle)

public interface HandlerInterceptor {

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response,

Object handler) throws Exception {

// Pre-processing callback.}

}

public interface HandlerInterceptor {

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response,

Object handler) throws Exception {

// Pre-processing callback.}

}

Page 18: Spring 3.x - Spring MVC

18

Interceptors(preHandle)

Interceptors(preHandle)

Interceptors(postHandle)

Interceptors(postHandle)

Dispatcher servlet flow

Spring MVC

IncomingHTTP request View

rendererView

renderer

Exception handler

Exception handler

Handler adapterHandler adapter

Simple controller adapter

Simple controller adapter

Annotation-based adapter

Annotation-based adapter

Another servlet adapter

Another servlet adapter

Page 19: Spring 3.x - Spring MVC

19

Interceptors(preHandle)

Interceptors(preHandle)

Dispatcher servlet flow

Spring MVC

IncomingHTTP request

Simple controller adapter

Simple controller adapter

Annotation-based adapter

Annotation-based adapter

Another servlet adapter

Another servlet adapter

Handler adapterHandler adapter Viewrenderer

Viewrenderer

Exception handler

Exception handler

public interface HandlerInterceptor {

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

// Post-processing callback.}

}

public interface HandlerInterceptor {

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

// Post-processing callback.}

}

Interceptors(postHandle)

Interceptors(postHandle)

Page 20: Spring 3.x - Spring MVC

20

Interceptors(postHandle)

Interceptors(postHandle)

Interceptors(preHandle)

Interceptors(preHandle)

Dispatcher servlet flow

Spring MVC

IncomingHTTP request

Simple controller adapter

Simple controller adapter

Annotation-based adapter

Annotation-based adapter

Another servlet adapter

Another servlet adapter

Handler adapterHandler adapter

Exception handler

Exception handler

Viewrenderer

Viewrenderer

Locate current locale

Locate current locale

Render the appropriate

view

Render the appropriate

view

• ResourceBundleViewResolver• UrlBasedViewResolver• FreeMarkerViewResolver• VelocityLayoutViewResolver• JasperReportsViewResolver• InternalResourceViewResolver• XsltViewResolver• TilesViewResolver• XmlViewResolver• BeanNameViewResolver

• ResourceBundleViewResolver• UrlBasedViewResolver• FreeMarkerViewResolver• VelocityLayoutViewResolver• JasperReportsViewResolver• InternalResourceViewResolver• XsltViewResolver• TilesViewResolver• XmlViewResolver• BeanNameViewResolver

Page 21: Spring 3.x - Spring MVC

21

Viewrenderer

Viewrenderer

Interceptors(postHandle)

Interceptors(postHandle)

Interceptors(preHandle)

Interceptors(preHandle)

Dispatcher servlet flow

Spring MVC

IncomingHTTP request

Simple controller adapter

Simple controller adapter

Annotation-based adapter

Annotation-based adapter

Another servlet adapter

Another servlet adapter

Handler adapterHandler adapter

Exception handler

Exception handler

DefaultHandlerExceptionResolverDefaultHandlerExceptionResolver

Page 22: Spring 3.x - Spring MVC

Handler mapping

Page 23: Spring 3.x - Spring MVC

23

» Maps between an incoming request and the appropriate controller.

Handler mapping

Spring MVC

IncomingHTTP request

Handler adapterHandler adapter

Controller bean-name mapping

Controller class-name mapping

Static mapping

Based on annotations

[GET] http://host.com/services/userInfo.do[GET] http://host.com/services/userInfo.do

Handlers from application contextHandlers from application context

Page 24: Spring 3.x - Spring MVC

24

» Dispatcher servlet: Search for all beans derived from org.springframework.web.servlet.HandlerMapping

Traverse all handlers. For each handler:• Check if handler can resolve request to a controller.• Delegate control to the controller.

Handler mapping

Spring MVC

Page 25: Spring 3.x - Spring MVC

25

Handler mapping

Spring MVC

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans> 4 5 <!-- Map based on class name --> 6 <bean class="org.springframework...ControllerClassNameHandlerMapping"/> 7 8 <!-- Static mapping --> 9 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">10 <property name="mappings">11 <value>12 /info.do=personalInformationController13 </value>14 </property>15 </bean>16 17 <bean id="personalInformationController“18 class="com.cisco.mvc.controllers.PersonalInformationController"/>19 20 </beans>

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans> 4 5 <!-- Map based on class name --> 6 <bean class="org.springframework...ControllerClassNameHandlerMapping"/> 7 8 <!-- Static mapping --> 9 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">10 <property name="mappings">11 <value>12 /info.do=personalInformationController13 </value>14 </property>15 </bean>16 17 <bean id="personalInformationController“18 class="com.cisco.mvc.controllers.PersonalInformationController"/>19 20 </beans>

Page 26: Spring 3.x - Spring MVC

Controllers

Page 27: Spring 3.x - Spring MVC

27

Controllers

Spring MVC

public interface Controller {

public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception;

}

public interface Controller {

public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception;

}

View:Object ?

View:Object ?

Model:Key/Value map

Model:Key/Value map

Model+

View

Model+

View

Page 28: Spring 3.x - Spring MVC

28

Controllers

Spring MVC

1 public class LoginController implements Controller { 2 3 @Override 4 public ModelAndView handleRequest(HttpServletRequest request, 5 HttpServletResponse response) 6 throws Exception { 7 String username = request.getParameter("j_username"); 8 String password = request.getParameter("j_password"); 9 if (!validateUser(username, password)) {10 return new ModelAndView("invalidUsername.jsp", "uname", username);11 } else {12 return new ModelAndView("portal.jsp");13 }14 }1516 private boolean validateUser(String username, String password) {17 // Validate user ...18 }19 }

1 public class LoginController implements Controller { 2 3 @Override 4 public ModelAndView handleRequest(HttpServletRequest request, 5 HttpServletResponse response) 6 throws Exception { 7 String username = request.getParameter("j_username"); 8 String password = request.getParameter("j_password"); 9 if (!validateUser(username, password)) {10 return new ModelAndView("invalidUsername.jsp", "uname", username);11 } else {12 return new ModelAndView("portal.jsp");13 }14 }1516 private boolean validateUser(String username, String password) {17 // Validate user ...18 }19 }

Page 29: Spring 3.x - Spring MVC

29

Controllers

Spring MVC

1 public class LoginController implements Controller { 2 3 @Override 4 public ModelAndView handleRequest(HttpServletRequest request, 5 HttpServletResponse response) 6 throws Exception { 7 String username = request.getParameter("j_username"); 8 String password = request.getParameter("j_password"); 9 if (!validateUser(username, password)) {10 int retryCount = Integer.parseInt(request.getParameter("retries"));11 Map<String, Object> model = new Map<String, Object>();12 model.put("uname", username);13 model.put(“retryCount“, retryCount + 1);1415 return new ModelAndView("invalidUsername.jsp", model);16 } else {17 return new ModelAndView("portal.jsp");18 }19 }20 }

1 public class LoginController implements Controller { 2 3 @Override 4 public ModelAndView handleRequest(HttpServletRequest request, 5 HttpServletResponse response) 6 throws Exception { 7 String username = request.getParameter("j_username"); 8 String password = request.getParameter("j_password"); 9 if (!validateUser(username, password)) {10 int retryCount = Integer.parseInt(request.getParameter("retries"));11 Map<String, Object> model = new Map<String, Object>();12 model.put("uname", username);13 model.put(“retryCount“, retryCount + 1);1415 return new ModelAndView("invalidUsername.jsp", model);16 } else {17 return new ModelAndView("portal.jsp");18 }19 }20 }

Page 30: Spring 3.x - Spring MVC

30

Controllers

Spring MVC

1 public class LoginController implements Controller { 2 3 @Override 4 public ModelAndView handleRequest(HttpServletRequest request, 5 HttpServletResponse response) 6 throws Exception { 7 String username = request.getParameter("j_username"); 8 String password = request.getParameter("j_password"); 9 if (!validateUser(username, password)) {10 int retryCount = Integer.parseInt(request.getParameter("retries"));11 Map<String, Object> model = new Map<String, Object>();12 model.put("uname", username);13 model.put(“retryCount“, retryCount + 1);1415 return new ModelAndView("invalidUsername.jsp", model);16 } else {17 return new ModelAndView("portal.jsp");18 }19 }20 }

1 public class LoginController implements Controller { 2 3 @Override 4 public ModelAndView handleRequest(HttpServletRequest request, 5 HttpServletResponse response) 6 throws Exception { 7 String username = request.getParameter("j_username"); 8 String password = request.getParameter("j_password"); 9 if (!validateUser(username, password)) {10 int retryCount = Integer.parseInt(request.getParameter("retries"));11 Map<String, Object> model = new Map<String, Object>();12 model.put("uname", username);13 model.put(“retryCount“, retryCount + 1);1415 return new ModelAndView("invalidUsername.jsp", model);16 } else {17 return new ModelAndView("portal.jsp");18 }19 }20 }

Page 31: Spring 3.x - Spring MVC

31

Controllers

Spring MVC

<< interface >>Controller

<< interface >>Controller

MyControllerMyController

Handle incoming requests

Handle incoming requests

Page 32: Spring 3.x - Spring MVC

32

Controllers

Spring MVC

<< interface >>Controller

<< interface >>Controller

<< abstract>>AbstractController

<< abstract>>AbstractController

MyControllerMyController

• supportedMethods (GET, POST, …)

• requireSession (true/false)• synchronize (true/false)• Cache control

• supportedMethods (GET, POST, …)

• requireSession (true/false)• synchronize (true/false)• Cache control

public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse

response)throws Exception { ... }

public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse

response)throws Exception { ... }

Page 33: Spring 3.x - Spring MVC

33

Controllers

Spring MVC

<< interface >>Controller

<< interface >>Controller

<< abstract>>AbstractController

<< abstract>>AbstractController

MyControllerMyController

<< abstract>>AbstractUrlViewController

<< abstract>>AbstractUrlViewController

Resolve controller based on URLResolve controller based on URL

public ModelAndView handleRequestInt(

HttpServletRequest request,HttpServletResponse

response)throws Exception { ... }

public ModelAndView handleRequestInt(

HttpServletRequest request,HttpServletResponse

response)throws Exception { ... }

Page 34: Spring 3.x - Spring MVC

View resolvers

Page 35: Spring 3.x - Spring MVC

35

» Resolve a view object to actual rendered output.» Isolate application logic from underlying view

implementation. Each view is identified by a discrete object (e.g.: name). Each view is resolved to a different renderer.

View resolvers

Spring MVC

Page 36: Spring 3.x - Spring MVC

36

View resolvers

Spring MVC

View resolverView resolver

XmlViewResolver

ResourceBundleViewResolver

FreeMarkerViewResolver

UrlBasedViewResolver

View: “login”View: “login”

View handlersView handlers

Page 37: Spring 3.x - Spring MVC

37

View resolvers

Spring MVC

<?xml version="1.0" encoding="UTF-8"?>

<beans>

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="prefix" value="/WEB-INF/pages/" /> <property name="suffix" value=".jsp" /> </bean>

</beans>

<?xml version="1.0" encoding="UTF-8"?>

<beans>

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="prefix" value="/WEB-INF/pages/" /> <property name="suffix" value=".jsp" /> </bean>

</beans>

View: “login”View: “login” /WEB-INF/pages/login.jsp/WEB-INF/pages/login.jsp

Page 38: Spring 3.x - Spring MVC

Annotation driven

Page 39: Spring 3.x - Spring MVC

39

» Allow us to specify all mapping and handling via annotations.

Annotation driven

Spring MVC

Page 40: Spring 3.x - Spring MVC

40

Annotation drivenBasic request mapping

Spring MVC

1 @Controller 2 public class CalcController { 3 4 // [GET] http://host.com/example/calculate?first=NNN&second=MMM 5 @RequestMapping("/calculate") 6 public String calculate(HttpServletRequest request) { 7 String first = request.getParameter("first"); 8 String second = request.getParameter("second"); 9 10 int firstInt = Integer.parseInt(first);11 int secondInt = Integer.parseInt(second);12 13 return Integer.toString(firstInt + secondInt);14 }15 }

1 @Controller 2 public class CalcController { 3 4 // [GET] http://host.com/example/calculate?first=NNN&second=MMM 5 @RequestMapping("/calculate") 6 public String calculate(HttpServletRequest request) { 7 String first = request.getParameter("first"); 8 String second = request.getParameter("second"); 9 10 int firstInt = Integer.parseInt(first);11 int secondInt = Integer.parseInt(second);12 13 return Integer.toString(firstInt + secondInt);14 }15 }

Page 41: Spring 3.x - Spring MVC

41

Annotation drivenSelecting method type

Spring MVC

1 @Controller 2 public class CalcController { 3 4 // [POST] http://host.com/example/calculate?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate", method = RequestMethod.POST) 6 public String calculate(HttpServletRequest request) { 7 String first = request.getParameter("first"); 8 String second = request.getParameter("second"); 9 10 int firstInt = Integer.parseInt(first);11 int secondInt = Integer.parseInt(second);12 13 return Integer.toString(firstInt + secondInt);14 }15 }

1 @Controller 2 public class CalcController { 3 4 // [POST] http://host.com/example/calculate?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate", method = RequestMethod.POST) 6 public String calculate(HttpServletRequest request) { 7 String first = request.getParameter("first"); 8 String second = request.getParameter("second"); 9 10 int firstInt = Integer.parseInt(first);11 int secondInt = Integer.parseInt(second);12 13 return Integer.toString(firstInt + secondInt);14 }15 }

Page 42: Spring 3.x - Spring MVC

42

Annotation drivenAccessing request parameters

Spring MVC

1 @Controller 2 public class CalcController { 3 4 // [POST] http://host.com/example/calculate?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate", method = RequestMethod.POST) 6 public String calculate(@RequestParam("first") int first, 7 @RequestParam(“second") int second) { 8 return Integer.toString(first + second); 9 }10 }

1 @Controller 2 public class CalcController { 3 4 // [POST] http://host.com/example/calculate?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate", method = RequestMethod.POST) 6 public String calculate(@RequestParam("first") int first, 7 @RequestParam(“second") int second) { 8 return Integer.toString(first + second); 9 }10 }

Page 43: Spring 3.x - Spring MVC

43

Annotation drivenMultiple handlers per controller

Spring MVC

1 @Controller 2 public class CalcController { 3 4 // [POST] http://host.com/example/calculate/add?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate/add", method = RequestMethod.POST) 6 public String calculate(@RequestParam("first") int first, 7 @RequestParam(“second") int second) { 8 return Integer.toString(first + second); 9 }

4 // [POST] http://host.com/example/calculate/sub?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate/sub", method = RequestMethod.GET) 6 public String calculate(@RequestParam("first") int first, 7 @RequestParam(“second") int second) { 8 return Integer.toString(first - second); 9 }10 }

1 @Controller 2 public class CalcController { 3 4 // [POST] http://host.com/example/calculate/add?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate/add", method = RequestMethod.POST) 6 public String calculate(@RequestParam("first") int first, 7 @RequestParam(“second") int second) { 8 return Integer.toString(first + second); 9 }

4 // [POST] http://host.com/example/calculate/sub?first=NNN&second=MMM 5 @RequestMapping(value = "/calculate/sub", method = RequestMethod.GET) 6 public String calculate(@RequestParam("first") int first, 7 @RequestParam(“second") int second) { 8 return Integer.toString(first - second); 9 }10 }

Page 44: Spring 3.x - Spring MVC

44

Annotation drivenURI template

Spring MVC

1 @Controller 2 public class WeatherController { 3 4 // [GET] http://host.com/weather/972/TelAviv 5 @RequestMapping(value = "/weather/{countryCode}/{cityName}") 6 public ModelAndView getWeather(@PathVariable("countryCode") int countryCode, 7 @PathVariable("cityName") String cityName) { 8 ModelAndView mav = new ModelAndView(); 9 // Fill in model the relevant information.10 // Select a view appropriate for country.11 return mav;12 }13 }

1 @Controller 2 public class WeatherController { 3 4 // [GET] http://host.com/weather/972/TelAviv 5 @RequestMapping(value = "/weather/{countryCode}/{cityName}") 6 public ModelAndView getWeather(@PathVariable("countryCode") int countryCode, 7 @PathVariable("cityName") String cityName) { 8 ModelAndView mav = new ModelAndView(); 9 // Fill in model the relevant information.10 // Select a view appropriate for country.11 return mav;12 }13 }

Page 45: Spring 3.x - Spring MVC

45

Annotation drivenURI template

Spring MVC

1 @Controller 2 public class WeatherController { 3 4 // [GET] http://host.com/weather/972/TelAviv 5 @RequestMapping(value = "/weather/{countryCode}/{cityName}") 6 public ModelAndView getWeather(@PathVariable("countryCode") int countryCode, 7 @PathVariable("cityName") String cityName) { 8 ModelAndView mav = new ModelAndView(); 9 // Fill in model the relevant information.10 // Select a view appropriate for country.11 return mav;12 }13 }

1 @Controller 2 public class WeatherController { 3 4 // [GET] http://host.com/weather/972/TelAviv 5 @RequestMapping(value = "/weather/{countryCode}/{cityName}") 6 public ModelAndView getWeather(@PathVariable("countryCode") int countryCode, 7 @PathVariable("cityName") String cityName) { 8 ModelAndView mav = new ModelAndView(); 9 // Fill in model the relevant information.10 // Select a view appropriate for country.11 return mav;12 }13 }

Page 46: Spring 3.x - Spring MVC

46

Annotation drivenException handling

Spring MVC

1 @Controller 2 public class WeatherController { 3 4 @ExceptionHandler(IllegalArgumentException.class) 5 public String handleException(IllegalArgumentException ex, 6 HttpServletResponse response) { 7 return ex.getMessage(); 8 } 9 }

1 @Controller 2 public class WeatherController { 3 4 @ExceptionHandler(IllegalArgumentException.class) 5 public String handleException(IllegalArgumentException ex, 6 HttpServletResponse response) { 7 return ex.getMessage(); 8 } 9 }

Page 47: Spring 3.x - Spring MVC

47

Annotation drivenFile upload example

Spring MVC

@Controllerpublic class FileUploadController {

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public String handleFormUpload(@RequestParam("name") String filename, @RequestParam("file") MultipartFile file) {

if (success) { return "redirect:uploadSuccess"; } else { return "redirect:uploadFailure"; } }}

@Controllerpublic class FileUploadController {

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public String handleFormUpload(@RequestParam("name") String filename, @RequestParam("file") MultipartFile file) {

if (success) { return "redirect:uploadSuccess"; } else { return "redirect:uploadFailure"; } }}

Page 48: Spring 3.x - Spring MVC

48

Annotation drivenCookies

Spring MVC

@Controllerpublic class FileUploadController {

@RequestMapping(“/portal”) public String enterPortal(@CookieValue(“lastVisited“) Date lastVisited) { }

@RequestMapping(“/console”) public String enterPortal( @CookieValue(value = “lastVisited“, required = “true”) Date lastVisited) { }}

@Controllerpublic class FileUploadController {

@RequestMapping(“/portal”) public String enterPortal(@CookieValue(“lastVisited“) Date lastVisited) { }

@RequestMapping(“/console”) public String enterPortal( @CookieValue(value = “lastVisited“, required = “true”) Date lastVisited) { }}

Page 49: Spring 3.x - Spring MVC

49

Annotation drivenSession attributes

Spring MVC

1 @Controller 2 @SessionAttributes("userid") 3 public class PersonalInformationController { 4 5 @RequestMapping("/loginCheck") 6 public String checkUserLoggedIn(@ModelAttribute("userid") int id) { 7 // ... 8 } 9 }

1 @Controller 2 @SessionAttributes("userid") 3 public class PersonalInformationController { 4 5 @RequestMapping("/loginCheck") 6 public String checkUserLoggedIn(@ModelAttribute("userid") int id) { 7 // ... 8 } 9 }

Page 50: Spring 3.x - Spring MVC

50

Annotation drivenApplication context configuration

Spring MVC

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans> 4 5 <!-- Support for @Autowire --> 6 <context:annotation-config /> 7 8 <!-- Support for @Controller --> 9 <context:component-scan base-package="com.cisco.mvc" />10 11 <!-- Turn @Controller into actual web controllers-->12 <mvc:annotation-driven/>13 14 <mvc:interceptors>15 </mvc:interceptors>16 17 </beans>

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans> 4 5 <!-- Support for @Autowire --> 6 <context:annotation-config /> 7 8 <!-- Support for @Controller --> 9 <context:component-scan base-package="com.cisco.mvc" />10 11 <!-- Turn @Controller into actual web controllers-->12 <mvc:annotation-driven/>13 14 <mvc:interceptors>15 </mvc:interceptors>16 17 </beans>

Page 51: Spring 3.x - Spring MVC

51

Annotation drivenApplication context configuration - continued

Spring MVC

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans> 4 5 <mvc:interceptors> 6 <bean class="com.cisco.mvc.interceptors.SecurityInterceptor"/> 7 </mvc:interceptors> 8 9 <mvc:resources mapping="/static/**" location="/pages/"/>1011 <mvc:view-controller path="/" view-name=“homePage"/>12 13 </beans>

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans> 4 5 <mvc:interceptors> 6 <bean class="com.cisco.mvc.interceptors.SecurityInterceptor"/> 7 </mvc:interceptors> 8 9 <mvc:resources mapping="/static/**" location="/pages/"/>1011 <mvc:view-controller path="/" view-name=“homePage"/>12 13 </beans>

Page 52: Spring 3.x - Spring MVC

52

» Spring MVC provide a clear separation between a model, view and controller

» Provide both XML-based and annotation-based approaches.

» Enriched by Spring application context.» Provide a broad range of pre-configured facilities.» Takes convention over configuration approach.» Uses open-close principle.

Summary

Spring MVC

Page 53: Spring 3.x - Spring MVC

53

» Spring MVC reference guide: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html

SummaryReferences

Spring MVC

Page 54: Spring 3.x - Spring MVC

Q & A