+ All Categories
Home > Technology > Spring Framework - MVC

Spring Framework - MVC

Date post: 12-Jan-2015
Category:
Upload: dmitry-noskov
View: 6,967 times
Download: 6 times
Share this document with a friend
Description:
Introduction to Spring MVC.
Popular Tags:
72
SPRING FRAMEWORK 3.0 Spring MVC Dmitry Noskov Spring Framework - MVC
Transcript
Page 1: Spring Framework - MVC

SPRING FRAMEWORK 3.0

Spring MVC Dmitry Noskov

Spring Framework - MVC

Page 2: Spring Framework - MVC

The Spring WEB stack

Dmitry Noskov Spring Framework - MVC

Page 3: Spring Framework - MVC

MVC

Dmitry Noskov Spring Framework - MVC

Page 4: Spring Framework - MVC

Web frameworks

Dmitry Noskov Spring Framework - MVC

request-based

Struts, Spring MVC

component-based

JSF, GWT, Wicket

RIA

Flex

Page 5: Spring Framework - MVC

What is Spring MVC?

Dmitry Noskov Spring Framework - MVC

web component of Spring Framework

request based web framework

Page 6: Spring Framework - MVC

Request processing workflow

Dmitry Noskov Spring Framework - MVC

Page 7: Spring Framework - MVC

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

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

Context

Dmitry Noskov Spring Framework - MVC

Page 10: Spring Framework - MVC

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

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

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

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

@Controller

@RequestMapping

@RequestParam

@PathVariable

Controller

Dmitry Noskov Spring Framework - MVC

Page 15: Spring Framework - MVC

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

Simple Controller

@Controller

public class WelcomeController {

@RequestMapping("/welcome")

public void welcome() {

}

}

Dmitry Noskov Spring Framework - MVC

Page 17: Spring Framework - MVC

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

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

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 21: Spring Framework - MVC

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

RESTful URLs

Dmitry Noskov Spring Framework - MVC

URL: http://localhost:8080/carbase/cars/11

Page 23: Spring Framework - MVC

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

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

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

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

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

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

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

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 33: Spring Framework - MVC

@ModelAttribute

@SessionAttributes

@RequestHeader

@CookieValue

@RequestBody / @ResponseBody

Additional annotations

Dmitry Noskov Spring Framework - MVC

Page 34: Spring Framework - MVC

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

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

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

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

Data Representation

Dmitry Noskov Spring Framework - MVC

Page 39: Spring Framework - MVC

Approach

template view

ViewResolver, View

HTML, Excel, PDF, etc.

data view

HttpMessageConverter

XML, JSON, etc.

Dmitry Noskov Spring Framework - MVC

Page 41: Spring Framework - MVC

View

JSP & JSTL

Tiles

Velocity

FreeMarker

etc.

prefix

redirect:

forward:

Dmitry Noskov Spring Framework - MVC

Page 42: Spring Framework - MVC

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

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

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

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 47: Spring Framework - MVC

ContentNegotiatingViewResolver

Dmitry Noskov Spring Framework - MVC

Page 48: Spring Framework - MVC

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

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

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

Locales

Themes

File upload

Handling mappings / exceptions

Additional features

Dmitry Noskov Spring Framework - MVC

Page 52: Spring Framework - MVC

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

Themes

ThemeSource

ResourceBundleThemeSource

ThemeResolver

FixedThemeResolver

SessionThemeResolver

CookieThemeResolver

Dmitry Noskov Spring Framework - MVC

Page 54: Spring Framework - MVC

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

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

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

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

<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

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

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

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 63: Spring Framework - MVC

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

Ajax

Dmitry Noskov Spring Framework - MVC

Page 65: Spring Framework - MVC

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

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

Dmitry Noskov Spring Framework - MVC

Page 68: Spring Framework - MVC

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

Spring MVC

Dmitry Noskov Spring Framework - MVC

lightweight web framework

controller is a Spring bean

Page 70: Spring Framework - MVC

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

Questions

Dmitry Noskov Spring Framework - MVC

Page 72: Spring Framework - MVC

The end

http://www.linkedin.com/in/noskovd

http://www.slideshare.net/analizator/presentations


Recommended