spring framework - mvc
DESCRIPTION
Introduction to Spring MVC.TRANSCRIPT
![Page 1: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/1.jpg)
SPRING FRAMEWORK 3.0
Spring MVC Dmitry Noskov
Spring Framework - MVC
![Page 2: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/2.jpg)
The Spring WEB stack
Dmitry Noskov Spring Framework - MVC
![Page 3: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/3.jpg)
MVC
Dmitry Noskov Spring Framework - MVC
![Page 4: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/4.jpg)
Web frameworks
Dmitry Noskov Spring Framework - MVC
request-based
Struts, Spring MVC
component-based
JSF, GWT, Wicket
RIA
Flex
![Page 5: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/5.jpg)
What is Spring MVC?
Dmitry Noskov Spring Framework - MVC
web component of Spring Framework
request based web framework
![Page 6: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/6.jpg)
Request processing workflow
Dmitry Noskov Spring Framework - MVC
![Page 7: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/7.jpg)
Front controller
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/web-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
Dmitry Noskov Spring Framework - MVC
![Page 8: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/8.jpg)
Application context
Dmitry Noskov Spring Framework - MVC
<web-app version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
![Page 9: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/9.jpg)
Context
Dmitry Noskov Spring Framework - MVC
![Page 10: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/10.jpg)
UrlRewrite
Dmitry Noskov Spring Framework - MVC
http://www.tuckey.org/urlrewrite/
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
![Page 11: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/11.jpg)
Mapping
Dmitry Noskov Spring Framework - MVC
<urlrewrite default-match-type="wildcard">
<rule>
<from>/</from>
<to>/app/welcome</to>
</rule>
<rule>
<from>/**</from>
<to>/app/$1</to>
</rule>
<outbound-rule>
<from>/app/**</from>
<to>/$1</to>
</outbound-rule>
</urlrewrite>
![Page 12: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/12.jpg)
WebApplicationContextUtils(1)
Dmitry Noskov Spring Framework - MVC
public class ExchangerServlet extends HttpServlet {
private AccountService accountService;
@Override
public void init() throws ServletException {
ServletContext sc = super.getServletContext();
ApplicationContext context =
WebApplicationContextUtils.getWebApplicationContext(sc);
accountService = context.getBean(AccountService.class);
}
}
![Page 13: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/13.jpg)
WebApplicationContextUtils(2)
Dmitry Noskov Spring Framework - MVC
public class ExchangerFilter implements Filter {
private AccountService accountService;
@Override
public void init(FilterConfig config) throws ServletException {
ServletContext sc = config.getServletContext();
ApplicationContext context =
WebApplicationContextUtils.getWebApplicationContext(sc);
accountService = context.getBean(AccountService.class);
}
}
![Page 14: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/14.jpg)
@Controller
@RequestMapping
@RequestParam
@PathVariable
Controller
Dmitry Noskov Spring Framework - MVC
![Page 15: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/15.jpg)
Mapping requests
by path @RequestMapping("/welcome")
by HTTP method @RequestMapping(value = "/welcome", method=RequestMethod.GET)
by presence / value of query parameter @RequestMapping(params = {"find=ByMake", "form" })
by presence / value of request header @RequestMapping(value = "/welcome", headers="accept=text/*")
Dmitry Noskov Spring Framework - MVC
![Page 16: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/16.jpg)
Simple Controller
@Controller
public class WelcomeController {
@RequestMapping("/welcome")
public void welcome() {
}
}
Dmitry Noskov Spring Framework - MVC
![Page 17: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/17.jpg)
Use case controller
@Controller
public class CarController {
@RequestMapping("/showcar.do")
public String show(@RequestParam("id") id, Model model) {
model.addAttribute("car", Car.findCar(id));
return "jsp/cars/car.jsp";
}
@RequestMapping("/carlist.do")
public String list(Model model) { /** such business logic*/}
/** such method handlers*/
}
Dmitry Noskov Spring Framework - MVC
![Page 18: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/18.jpg)
Unfriendly URLs
Dmitry Noskov Spring Framework - MVC
for each item
URL: http://localhost:8080/carbase/showcar.do?id=77
direct command
not very cacheable and
search engine friendly
![Page 19: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/19.jpg)
REST
Representation State Transfer
style of software architecture
RPC is antipode
http://en.wikipedia.org/wiki/Representational_State_Transfer
Dmitry Noskov Spring Framework - MVC
![Page 20: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/20.jpg)
Http methods
get
post
when the resource URL is unknown (create item)
put
when the resource URL is known (update item)
delete
post vs put http://stackoverflow.com/questions/630453/put-vs-post-in-rest
Dmitry Noskov Spring Framework - MVC
![Page 21: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/21.jpg)
RESTful mapping
Dmitry Noskov Spring Framework - MVC
Resource GET PUT POST DELETE
http://domain.com/cars obtain list of item update create X
http://domain.com/cars/7 obtain item X X delete
http://domain.com/cars?form create empty form X X X
http://domain.com/cars/7?form pre-populated form X X X
![Page 22: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/22.jpg)
RESTful URLs
Dmitry Noskov Spring Framework - MVC
URL: http://localhost:8080/carbase/cars/11
![Page 23: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/23.jpg)
Typical actions
simple list page
filtered list page
CRUD:
create
read (retrieve)
update
delete
workflow
submit / approve / etc.
Dmitry Noskov Spring Framework - MVC
![Page 24: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/24.jpg)
List page
URL: http://localhost:8080/carbase/cars
@Controller
@RequestMapping("/cars")
public class CarController {
@RequestMapping(method = RequestMethod.GET)
public String list(Model model) {
model.addAttribute("cars", Car.findAllCars());
return "cars/list";
}
}
Dmitry Noskov Spring Framework - MVC
![Page 25: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/25.jpg)
Detailed page
URL: http://localhost:8080/carbase/cars/11
@Controller
@RequestMapping("/cars")
public class CarController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String show(@PathVariable("id") Long id, Model model) {
model.addAttribute("car", Car.findCar(id));
return "cars/show";
}
}
Dmitry Noskov Spring Framework - MVC
![Page 26: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/26.jpg)
Create
URL: http://localhost:8080/carbase/cars
@Controller
@RequestMapping("/cars")
public class CarController {
@RequestMapping(method = RequestMethod.POST)
public String create(Car car) {
car.persist();
return "redirect:/cars/" + car.getId();
}
}
Dmitry Noskov Spring Framework - MVC
![Page 27: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/27.jpg)
Update
URL: http://localhost:8080/carbase/cars/
@Controller
@RequestMapping("/cars")
public class CarController {
@RequestMapping(method = RequestMethod.PUT)
public String update(@Valid Car car, BindingResult result) {
/** Spring Validator*/
//result.hasErrors();
car.merge();
return "redirect:/cars/" + car.getId();
}
}
Dmitry Noskov Spring Framework - MVC
![Page 28: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/28.jpg)
Delete
URL: http://localhost:8080/carbase/cars/11
@Controller
@RequestMapping("/cars")
public class CarController {
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Long id) {
Car.findCar(id).remove();
return "redirect:/cars;
}
}
Dmitry Noskov Spring Framework - MVC
![Page 29: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/29.jpg)
Filtered page
URL: http://localhost:8080/carbase/cars
@Controller
@RequestMapping("/cars")
public class CarController {
@RequestMapping(params="find=ByMake", method=RequestMethod.GET)
public String findByMake(@RequestParam("make")Make make, Model m) {
m.addAttribute("cars", Car.findCarsByMake(make).getResultList());
return "cars/list";
}
}
Dmitry Noskov Spring Framework - MVC
![Page 30: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/30.jpg)
Delete and put through post
Spring tag <form:form action="/carbase/cars" method="PUT">
html <form id="car" action="/carbase/cars" method="post">
<input type="hidden" name="_method" value="PUT"/>
server side <filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>
org.springframework.web.filter.HiddenHttpMethodFilter
</filter-class>
</filter>
Dmitry Noskov Spring Framework - MVC
![Page 31: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/31.jpg)
Handler arguments
HttpSession / HttpServletRequest / etc.
Spring’s WebRequest / NativeWebRequest
path variable
java.io.InputStream / java.io.OutputStream
request’s param / header / body / cookies
command objects
http://static.springsource.org/spring/docs/3.0.x/spring-framework-
reference/html/mvc.html#mvc-ann-requestmapping-arguments
Dmitry Noskov Spring Framework - MVC
![Page 32: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/32.jpg)
Return types
ModelAndView
Model / Map / ModelMap
View
String / void
@ResponseBody / @ModelAttribute
http://static.springsource.org/spring/docs/3.0.x/spring-framework-
reference/html/mvc.html#mvc-ann-requestmapping-arguments
Dmitry Noskov Spring Framework - MVC
![Page 33: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/33.jpg)
@ModelAttribute
@SessionAttributes
@RequestHeader
@CookieValue
@RequestBody / @ResponseBody
Additional annotations
Dmitry Noskov Spring Framework - MVC
![Page 34: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/34.jpg)
ModelAttribute
maps a model attribute to the specific parameter @RequestMapping(method = RequestMethod.POST)
public String create(@ModelAttribute("car") Car car) {}
provide reference data for the model @ModelAttribute("makes")
public Collection<Make> populateMakes() {
return Make.findAllMakes();
}
Dmitry Noskov Spring Framework - MVC
![Page 35: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/35.jpg)
SessionAttributes
list the names or types of model attributes which should
be stored in the session @Controller
@SessionAttributes("car")//@SessionAttributes(value={}, types={})
public class CarController {
public String updateForm(@PathVariable("id") Long id, Model model) {
m.addAttribute("car", Car.findCar(id));
}
public String update(Car request, SessionStatus status) {
status.setComplete();
}
}
Dmitry Noskov Spring Framework - MVC
![Page 36: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/36.jpg)
RequestHeader
typical request header host = localhost:8080
user-agent = Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729; .NET4.0E)
accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language = en-us,en;q=0.5
obtain request header @RequestMapping("/welcome")
public void welcome(@RequestHeader("user-agent") String agent) {}
narrow mappings @RequestMapping(value = "/welcome", headers="accept=text/*")
public void welcome() {}
Dmitry Noskov Spring Framework - MVC
![Page 37: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/37.jpg)
CookieValue
get the JSESSIONID of the cookie @RequestMapping(value = "/welcome")
public void welcome(@CookieValue("JSESSIONID") String session){
}
Dmitry Noskov Spring Framework - MVC
![Page 38: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/38.jpg)
Data Representation
Dmitry Noskov Spring Framework - MVC
![Page 39: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/39.jpg)
Approach
template view
ViewResolver, View
HTML, Excel, PDF, etc.
data view
HttpMessageConverter
XML, JSON, etc.
Dmitry Noskov Spring Framework - MVC
![Page 40: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/40.jpg)
View resolver
XmlViewResolver
ResourceBundleViewResolver
UrlBasedViewResolver
InternalResourceViewResolver
BeanNameViewResolver
ContentNegotiatingViewResolver
http://static.springsource.org/spring/docs/3.0.x/spring-framework-
reference/html/mvc.html#mvc-viewresolver-resolver
Dmitry Noskov Spring Framework - MVC
![Page 41: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/41.jpg)
View
JSP & JSTL
Tiles
Velocity
FreeMarker
etc.
prefix
redirect:
forward:
Dmitry Noskov Spring Framework - MVC
![Page 42: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/42.jpg)
ResourceBundleViewResolver
Dmitry Noskov Spring Framework - MVC
configuration <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="view"/>
</bean>
view.properties welcome.(class)=org.springframework.web.servlet.view.JstlView
welcome.url=/WEB-INF/jsp/welcome.jsp
cars.(class)=org.springframework.web.servlet.view.JstlView
cars.url=/WEB-INF/jsp/cars.jsp
controller @Controller return "cars"
![Page 43: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/43.jpg)
UrlBasedViewResolver
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
use case If @Controller return "cars/show"
view class will process "/WEB-INF/jsp/cars/show.jsp"
Dmitry Noskov Spring Framework - MVC
![Page 44: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/44.jpg)
Tiles(1)
Dmitry Noskov Spring Framework - MVC
configuration <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
</bean>
<bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/layouts/layouts.xml</value>
<value>/WEB-INF/**/views.xml</value>
</list>
</property>
</bean>
views.xml <definition extends="default" name="cars/show"></definition>
![Page 45: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/45.jpg)
Tiles(2)
Dmitry Noskov Spring Framework - MVC
<bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/layouts/layouts.xml</value>
<value>/WEB-INF/**/views.xml</value>
</list>
</property>
<property name="preparerFactoryClass">
<value>
org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory
</value>
</property>
</bean>
![Page 46: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/46.jpg)
HttpMessageConverter
reads the request body and writes the response
converters mapped to content types
http://static.springsource.org/spring/docs/3.0.x/spring-framework-
reference/html/remoting.html#rest-message-conversion
registered by default if jar present in classpath
Jackson, JAXB, Atom, RSS
Dmitry Noskov Spring Framework - MVC
![Page 47: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/47.jpg)
ContentNegotiatingViewResolver
Dmitry Noskov Spring Framework - MVC
![Page 48: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/48.jpg)
Strategies
Dmitry Noskov Spring Framework - MVC
URI
www.domain.com/cars.html
www.domain.com/cars.json
content negotiation
Accept: text/html…
Accept: text/xml…
Accept: application/pdf…
![Page 49: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/49.jpg)
Example(1)
Dmitry Noskov Spring Framework - MVC
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="atom" value="application/atom+xml"/>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</list>
</property>
<property name="defaultViews">
<list><bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/></list>
</property>
</bean>
![Page 50: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/50.jpg)
Example(2)
Dmitry Noskov Spring Framework - MVC
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultViews">
<list><bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/></list>
</property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
![Page 51: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/51.jpg)
Locales
Themes
File upload
Handling mappings / exceptions
Additional features
Dmitry Noskov Spring Framework - MVC
![Page 52: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/52.jpg)
Locales
LocaleResolver
AcceptHeaderLocaleResolver
CookieLocaleResolver
SessionLocaleResolver
LocaleChangeInterceptor <bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
http://localhost:8080/carbase/?lang=ru
Dmitry Noskov Spring Framework - MVC
![Page 53: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/53.jpg)
Themes
ThemeSource
ResourceBundleThemeSource
ThemeResolver
FixedThemeResolver
SessionThemeResolver
CookieThemeResolver
Dmitry Noskov Spring Framework - MVC
![Page 54: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/54.jpg)
File upload
MultipartResolver <bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties; the maximum file size in bytes -->
<property name="maxUploadSize" value="100000"/>
</bean>
MultipartFile @RequestMapping(method = RequestMethod.POST)
public String upload (@RequestParam("file") MultipartFile file) {
}
Dmitry Noskov Spring Framework - MVC
![Page 55: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/55.jpg)
Handling mappings
interceptors
default handler
order
lazy init handlers
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<bean class="myInterceptor"/>
</property>
</bean>
Dmitry Noskov Spring Framework - MVC
![Page 56: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/56.jpg)
Handler interceptors
public interface HandlerInterceptor {
/** Called before HandlerAdapter invokes the handler.
* @return true if the execution chain should proceed */
boolean preHandle(Request, Response, Handler) {}
/** Called after HandlerAdapter actually invoked the handler,
* but before the DispatcherServlet renders the view.*/
void postHandle(Request, Response, Handler, ModelAndView) {}
/** Callback after rendering the view. */
void afterCompletion(Request, Response, Handler, Exception) {}
}
Dmitry Noskov Spring Framework - MVC
![Page 57: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/57.jpg)
Handling Exceptions
application
HandlingExeptionResolver
controller @ExceptionHandler(Exception.class)
public String handleException(Exception e) {
return ClassUtils.getShortName(e.getClass());
}
method try {} catch (Exception e) {}
Dmitry Noskov Spring Framework - MVC
![Page 58: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/58.jpg)
<mvc:annotation-driven>
<mvc:interceptors>
<mvc:view-controller>
<mvc:resources>
<mvc:default-servlet-handler>
Magic tags
Dmitry Noskov Spring Framework - MVC
![Page 59: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/59.jpg)
mvc:annotation-driven
registers necessary beans
support formatting
Number fields using the @NumberFormat
Date, Calendar, Long fields using the @DateTimeFormat
support for reading and writing
XML, if JAXB is present in classpath
JSON, if Jackson is present in classpath
support validating with @Valid
Dmitry Noskov Spring Framework - MVC
![Page 60: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/60.jpg)
mvc:interceptors
<!-- register "global" interceptor beans to apply to all
registered HandlerMappings -->
<mvc:interceptors>
<!–- applied to all URL paths -->
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
<!–- applied to a specific URL path -->
<mvc:interceptor>
<mvc:mapping path="/secure/*"/>
<bean class="org.example.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
Dmitry Noskov Spring Framework - MVC
![Page 61: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/61.jpg)
mvc:view-controller
immediately forwards to a view when invoked
<mvc:view-controller path="/" view-name="index"/>
<mvc:view-controller path="/resourceNotFound"/>
Dmitry Noskov Spring Framework - MVC
![Page 62: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/62.jpg)
mvc:resources
<!-- Handles HTTP GET requests for /resources/** by efficiently
serving up static resources -->
<mvc:resources location="/, classpath:/META-INF/web-resources/"
mapping="/resources/**"/>
http://static.springsource.org/spring/docs/3.0.x/spring-framework-
reference/html/mvc.html#mvc-static-resources
Dmitry Noskov Spring Framework - MVC
![Page 63: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/63.jpg)
mvc:default-servlet-handler
<!-- Allows for mapping the DispatcherServlet to "/" by
forwarding static resource requests to the container's default
Servlet -->
<mvc:default-servlet-handler/>
Dmitry Noskov Spring Framework - MVC
![Page 64: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/64.jpg)
Ajax
Dmitry Noskov Spring Framework - MVC
![Page 65: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/65.jpg)
Getting JSON
Dmitry Noskov Spring Framework - MVC
server @RequestMapping(value="/availability", method=RequestMethod.GET)
public @ResponseBody AvailabilityStatus
getAvailability(@RequestParam String name) {
return AvailabilityStatus.AVAILABLE;
}
client function checkAvailability() {
$.getJSON("account/availability", {name: $('#name').val()},
function(availability) {}
);
}
![Page 66: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/66.jpg)
Post JSON
Dmitry Noskov Spring Framework - MVC
client $("#account").submit(function() {
var account = $(this).serializeObject();
$.postJSON("account", account, function(data) {
$("#assignedId").val(data.id);
});
return false;
});
server @RequestMapping(method=RequestMethod.POST)
public @ResponseBody Map<String, ? extends Object>
create(@RequestBody Account account) {
return Collections.singletonMap("id", account.getId());
}
![Page 67: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/67.jpg)
Dmitry Noskov Spring Framework - MVC
![Page 68: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/68.jpg)
Features
clear separation of roles
reusable business code
flexible model transfer
customizable binding and validation
customizable handler mapping and view resolution
pluggability
Dmitry Noskov Spring Framework - MVC
![Page 69: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/69.jpg)
Spring MVC
Dmitry Noskov Spring Framework - MVC
lightweight web framework
controller is a Spring bean
![Page 70: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/70.jpg)
Information
reference
http://www.springsource.org/documentation
samples
https://src.springsource.org/svn/spring-samples/
blog
http://blog.springsource.com/category/web/
forum
http://forum.springsource.org/forumdisplay.php?f=25
Dmitry Noskov Spring Framework - MVC
![Page 71: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/71.jpg)
Questions
Dmitry Noskov Spring Framework - MVC
![Page 72: Spring Framework - MVC](https://reader033.vdocuments.site/reader033/viewer/2022050722/54b3bf1d4a7959780a8b45b1/html5/thumbnails/72.jpg)
The end
http://www.linkedin.com/in/noskovd
http://www.slideshare.net/analizator/presentations