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