Transcript

Spring MVCGuy Nir

January 2012

2

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

Agenda

Spring MVC

About 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

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

Architecture and design

7

Spring MVC

Architecture and design

ServletServlet Application Context

Application Context Spring MVCSpring 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

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

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

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

12

Architecture and designSpring MVC approach

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

14

Spring MVC

Architecture and design

DispatcherServlet

DispatcherServlet ControllerController

View renderer

View renderer

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

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

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.}

}

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

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)

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

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

Handler mapping

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

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

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>

Controllers

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

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 }

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 }

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 }

31

Controllers

Spring MVC

<< interface >>Controller

<< interface >>Controller

MyControllerMyController

Handle incoming requests

Handle incoming requests

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 { ... }

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 { ... }

View resolvers

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

36

View resolvers

Spring MVC

View resolverView resolver

XmlViewResolver

ResourceBundleViewResolver

FreeMarkerViewResolver

UrlBasedViewResolver

View: “login”View: “login”

View handlersView handlers

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

Annotation driven

39

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

Annotation driven

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 }

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 }

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 }

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 }

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 }

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 }

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 }

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"; } }}

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) { }}

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 }

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>

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>

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

53

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

SummaryReferences

Spring MVC

Q & A

top related