SlideShare a Scribd company logo
1 of 72
Download to read offline
Spring Framework - MVC




                SPRING FRAMEWORK 3.0
Dmitry Noskov   Spring MVC
The Spring WEB stack




              Spring Framework - MVC   Dmitry Noskov
MVC




      Spring Framework - MVC   Dmitry Noskov
Web frameworks
   request-based
       Struts, Spring MVC
   component-based
       JSF, GWT, Wicket
   RIA
       Flex




                             Spring Framework - MVC   Dmitry Noskov
What is Spring MVC?
   web component of Spring Framework
   request based web framework




                      Spring Framework - MVC   Dmitry Noskov
Request processing workflow


                 Spring Framework - MVC   Dmitry Noskov
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>
                                   Spring Framework - MVC   Dmitry Noskov
Application context
<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>



                           Spring Framework - MVC   Dmitry Noskov
Context




          Spring Framework - MVC   Dmitry Noskov
UrlRewrite
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>




                                   Spring Framework - MVC   Dmitry Noskov
Mapping
<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>


                            Spring Framework - MVC   Dmitry Noskov
WebApplicationContextUtils(1)

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


                                Spring Framework - MVC   Dmitry Noskov
WebApplicationContextUtils(2)

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


                                Spring Framework - MVC   Dmitry Noskov
Controller
@Controller
@RequestMapping
@RequestParam
@PathVariable




              Spring Framework - MVC   Dmitry Noskov
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/*")




                              Spring Framework - MVC   Dmitry Noskov
Simple Controller


@Controller
public class WelcomeController {


    @RequestMapping("/welcome")
    public void welcome() {
    }
}




                              Spring Framework - MVC   Dmitry Noskov
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*/
}


                                 Spring Framework - MVC   Dmitry Noskov
Unfriendly URLs

                            direct command




URL: http://localhost:8080/carbase/showcar.do?id=77




                          for each item              not very cacheable and
                                                     search engine friendly




                        Spring Framework - MVC   Dmitry Noskov
REST
   Representation State Transfer
   style of software architecture
   RPC is antipode




   http://en.wikipedia.org/wiki/Representational_State_Transfer

                                 Spring Framework - MVC   Dmitry Noskov
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


                                Spring Framework - MVC   Dmitry Noskov
RESTful mapping
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




                                 Spring Framework - MVC    Dmitry Noskov
RESTful URLs



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




                        Spring Framework - MVC   Dmitry Noskov
Typical actions
   simple list page
   filtered list page
   CRUD:
     create
     read (retrieve)

     update

     delete

   workflow
       submit / approve / etc.
                            Spring Framework - MVC   Dmitry Noskov
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";
    }
}



                                Spring Framework - MVC   Dmitry Noskov
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";
    }
}



                                Spring Framework - MVC   Dmitry Noskov
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();
    }
}



                                Spring Framework - MVC   Dmitry Noskov
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();
    }
}
                                 Spring Framework - MVC   Dmitry Noskov
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;
    }
}



                                  Spring Framework - MVC   Dmitry Noskov
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";
    }
}



                                  Spring Framework - MVC   Dmitry Noskov
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>


                              Spring Framework - MVC   Dmitry Noskov
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

                                 Spring Framework - MVC   Dmitry Noskov
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

                                 Spring Framework - MVC   Dmitry Noskov
Additional annotations
@ModelAttribute
@SessionAttributes
@RequestHeader
@CookieValue
@RequestBody / @ResponseBody


            Spring Framework - MVC   Dmitry Noskov
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();
    }




                                Spring Framework - MVC   Dmitry Noskov
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();
    }
}


                                  Spring Framework - MVC   Dmitry Noskov
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() {}



                                       Spring Framework - MVC   Dmitry Noskov
CookieValue

   get the JSESSIONID of the cookie
    @RequestMapping(value = "/welcome")
    public void welcome(@CookieValue("JSESSIONID") String session){
    }




                              Spring Framework - MVC   Dmitry Noskov
Data Representation




           Spring Framework - MVC   Dmitry Noskov
Approach
   template view
     ViewResolver, View
     HTML, Excel, PDF, etc.



   data view
     HttpMessageConverter
     XML, JSON, etc.




                           Spring Framework - MVC   Dmitry Noskov
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

                                 Spring Framework - MVC   Dmitry Noskov
View
   JSP & JSTL
   Tiles
   Velocity
   FreeMarker
   etc.
   prefix
     redirect:
     forward:


                  Spring Framework - MVC   Dmitry Noskov
ResourceBundleViewResolver
   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"


                                  Spring Framework - MVC   Dmitry Noskov
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"



                                   Spring Framework - MVC   Dmitry Noskov
Tiles(1)
   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>


                                           Spring Framework - MVC    Dmitry Noskov
Tiles(2)
<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>


                                          Spring Framework - MVC   Dmitry Noskov
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


                               Spring Framework - MVC   Dmitry Noskov
ContentNegotiatingViewResolver




           Spring Framework - MVC   Dmitry Noskov
Strategies
   URI
     www.domain.com/cars.html
     www.domain.com/cars.json

   content negotiation
     Accept: text/html…
     Accept: text/xml…

     Accept: application/pdf…




                          Spring Framework - MVC   Dmitry Noskov
Example(1)
<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>



                                        Spring Framework - MVC   Dmitry Noskov
Example(2)
<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>

                                        Spring Framework - MVC   Dmitry Noskov
Additional features
Locales
Themes
File upload
Handling mappings / exceptions




                 Spring Framework - MVC   Dmitry Noskov
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


                                         Spring Framework - MVC   Dmitry Noskov
Themes
   ThemeSource
       ResourceBundleThemeSource
   ThemeResolver
     FixedThemeResolver
     SessionThemeResolver

     CookieThemeResolver




                          Spring Framework - MVC   Dmitry Noskov
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) {
}


                                   Spring Framework - MVC   Dmitry Noskov
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>

                                      Spring Framework - MVC   Dmitry Noskov
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) {}
}


                              Spring Framework - MVC   Dmitry Noskov
Handling Exceptions
   application
       HandlingExeptionResolver
   controller
       @ExceptionHandler(Exception.class)
        public String handleException(Exception e) {
            return ClassUtils.getShortName(e.getClass());
        }

   method
       try {} catch (Exception e) {}


                            Spring Framework - MVC   Dmitry Noskov
Magic tags
<mvc:annotation-driven>
<mvc:interceptors>
<mvc:view-controller>
<mvc:resources>
<mvc:default-servlet-handler>


             Spring Framework - MVC   Dmitry Noskov
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

                           Spring Framework - MVC   Dmitry Noskov
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>


                                Spring Framework - MVC   Dmitry Noskov
mvc:view-controller
   immediately forwards to a view when invoked

    <mvc:view-controller path="/" view-name="index"/>


    <mvc:view-controller path="/resourceNotFound"/>




                              Spring Framework - MVC   Dmitry Noskov
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

                               Spring Framework - MVC   Dmitry Noskov
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/>




                            Spring Framework - MVC   Dmitry Noskov
Ajax




       Spring Framework - MVC   Dmitry Noskov
Getting JSON
   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) {}
    );
}


                                 Spring Framework - MVC   Dmitry Noskov
Post JSON
   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());
}

                                Spring Framework - MVC   Dmitry Noskov
Spring Framework - MVC   Dmitry Noskov
Features
   clear separation of roles
   reusable business code
   flexible model transfer
   customizable binding and validation
   customizable handler mapping and view resolution
   pluggability




                        Spring Framework - MVC   Dmitry Noskov
Spring MVC
   lightweight web framework
   controller is a Spring bean




                         Spring Framework - MVC   Dmitry Noskov
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




                                   Spring Framework - MVC   Dmitry Noskov
Questions




            Spring Framework - MVC   Dmitry Noskov
The end




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

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

More Related Content

What's hot

Introduction to Spring Boot!
Introduction to Spring Boot!Introduction to Spring Boot!
Introduction to Spring Boot!
Jakub Kubrynski
 

What's hot (20)

Spring Boot
Spring BootSpring Boot
Spring Boot
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Spring Boot Tutorial
Spring Boot TutorialSpring Boot Tutorial
Spring Boot Tutorial
 
Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action
 
Spring boot
Spring bootSpring boot
Spring boot
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
 
Spring annotation
Spring annotationSpring annotation
Spring annotation
 
Spring Mvc,Java, Spring
Spring Mvc,Java, SpringSpring Mvc,Java, Spring
Spring Mvc,Java, Spring
 
Spring MVC 3.0 Framework
Spring MVC 3.0 FrameworkSpring MVC 3.0 Framework
Spring MVC 3.0 Framework
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
Introduction to Spring Boot!
Introduction to Spring Boot!Introduction to Spring Boot!
Introduction to Spring Boot!
 
Spring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
Spring I/O 2012: Natural Templating in Spring MVC with ThymeleafSpring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
Spring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
 
Spring Boot and REST API
Spring Boot and REST APISpring Boot and REST API
Spring Boot and REST API
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Java Spring
Java SpringJava Spring
Java Spring
 
Spring introduction
Spring introductionSpring introduction
Spring introduction
 
Spring boot
Spring bootSpring boot
Spring boot
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBoot
 
Java spring framework
Java spring frameworkJava spring framework
Java spring framework
 

Similar to Spring Framework - MVC

Build your web app with asp.net mvc 2 from scratch
Build your web app with asp.net mvc 2 from scratchBuild your web app with asp.net mvc 2 from scratch
Build your web app with asp.net mvc 2 from scratch
Chalermpon Areepong
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
Tuna Tore
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892
Tuna Tore
 

Similar to Spring Framework - MVC (20)

Spring-training-in-bangalore
Spring-training-in-bangaloreSpring-training-in-bangalore
Spring-training-in-bangalore
 
Build your web app with asp.net mvc 2 from scratch
Build your web app with asp.net mvc 2 from scratchBuild your web app with asp.net mvc 2 from scratch
Build your web app with asp.net mvc 2 from scratch
 
Rest web service_with_spring_hateoas
Rest web service_with_spring_hateoasRest web service_with_spring_hateoas
Rest web service_with_spring_hateoas
 
Spring Framework - Web Flow
Spring Framework - Web FlowSpring Framework - Web Flow
Spring Framework - Web Flow
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with Spring
 
Day7
Day7Day7
Day7
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Spring 3.x - Spring MVC - Advanced topics
Spring 3.x - Spring MVC - Advanced topicsSpring 3.x - Spring MVC - Advanced topics
Spring 3.x - Spring MVC - Advanced topics
 
Creating your own framework on top of Symfony2 Components
Creating your own framework on top of Symfony2 ComponentsCreating your own framework on top of Symfony2 Components
Creating your own framework on top of Symfony2 Components
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892
 
The rise of Polymer and Web Components (Kostas Karolemeas) - GreeceJS #17
The rise of Polymer and Web Components (Kostas Karolemeas) - GreeceJS #17The rise of Polymer and Web Components (Kostas Karolemeas) - GreeceJS #17
The rise of Polymer and Web Components (Kostas Karolemeas) - GreeceJS #17
 
Google Polymer Framework
Google Polymer FrameworkGoogle Polymer Framework
Google Polymer Framework
 
Jlook web ui framework
Jlook web ui frameworkJlook web ui framework
Jlook web ui framework
 
ASP.NET MVC introduction
ASP.NET MVC introductionASP.NET MVC introduction
ASP.NET MVC introduction
 
Asp.Net Mvc
Asp.Net MvcAsp.Net Mvc
Asp.Net Mvc
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
 
Workshop 27: Isomorphic web apps with ReactJS
Workshop 27: Isomorphic web apps with ReactJSWorkshop 27: Isomorphic web apps with ReactJS
Workshop 27: Isomorphic web apps with ReactJS
 
Servlet 3.0
Servlet 3.0Servlet 3.0
Servlet 3.0
 
How to replace rails asset pipeline with webpack?
How to replace rails asset pipeline with webpack?How to replace rails asset pipeline with webpack?
How to replace rails asset pipeline with webpack?
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

Spring Framework - MVC

  • 1. Spring Framework - MVC SPRING FRAMEWORK 3.0 Dmitry Noskov Spring MVC
  • 2. The Spring WEB stack Spring Framework - MVC Dmitry Noskov
  • 3. MVC Spring Framework - MVC Dmitry Noskov
  • 4. Web frameworks  request-based  Struts, Spring MVC  component-based  JSF, GWT, Wicket  RIA  Flex Spring Framework - MVC Dmitry Noskov
  • 5. What is Spring MVC?  web component of Spring Framework  request based web framework Spring Framework - MVC Dmitry Noskov
  • 6. Request processing workflow Spring Framework - MVC Dmitry Noskov
  • 7. 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> Spring Framework - MVC Dmitry Noskov
  • 8. Application context <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> Spring Framework - MVC Dmitry Noskov
  • 9. Context Spring Framework - MVC Dmitry Noskov
  • 10. UrlRewrite 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> Spring Framework - MVC Dmitry Noskov
  • 11. Mapping <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> Spring Framework - MVC Dmitry Noskov
  • 12. WebApplicationContextUtils(1) 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); } } Spring Framework - MVC Dmitry Noskov
  • 13. WebApplicationContextUtils(2) 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); } } Spring Framework - MVC Dmitry Noskov
  • 15. 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/*") Spring Framework - MVC Dmitry Noskov
  • 16. Simple Controller @Controller public class WelcomeController { @RequestMapping("/welcome") public void welcome() { } } Spring Framework - MVC Dmitry Noskov
  • 17. 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*/ } Spring Framework - MVC Dmitry Noskov
  • 18. Unfriendly URLs direct command URL: http://localhost:8080/carbase/showcar.do?id=77 for each item not very cacheable and search engine friendly Spring Framework - MVC Dmitry Noskov
  • 19. REST  Representation State Transfer  style of software architecture  RPC is antipode  http://en.wikipedia.org/wiki/Representational_State_Transfer Spring Framework - MVC Dmitry Noskov
  • 20. 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 Spring Framework - MVC Dmitry Noskov
  • 21. RESTful mapping 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 Spring Framework - MVC Dmitry Noskov
  • 22. RESTful URLs URL: http://localhost:8080/carbase/cars/11 Spring Framework - MVC Dmitry Noskov
  • 23. Typical actions  simple list page  filtered list page  CRUD:  create  read (retrieve)  update  delete  workflow  submit / approve / etc. Spring Framework - MVC Dmitry Noskov
  • 24. 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"; } } Spring Framework - MVC Dmitry Noskov
  • 25. 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"; } } Spring Framework - MVC Dmitry Noskov
  • 26. 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(); } } Spring Framework - MVC Dmitry Noskov
  • 27. 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(); } } Spring Framework - MVC Dmitry Noskov
  • 28. 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; } } Spring Framework - MVC Dmitry Noskov
  • 29. 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"; } } Spring Framework - MVC Dmitry Noskov
  • 30. 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> Spring Framework - MVC Dmitry Noskov
  • 31. 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 Spring Framework - MVC Dmitry Noskov
  • 32. 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 Spring Framework - MVC Dmitry Noskov
  • 34. 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(); } Spring Framework - MVC Dmitry Noskov
  • 35. 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(); } } Spring Framework - MVC Dmitry Noskov
  • 36. 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() {} Spring Framework - MVC Dmitry Noskov
  • 37. CookieValue  get the JSESSIONID of the cookie @RequestMapping(value = "/welcome") public void welcome(@CookieValue("JSESSIONID") String session){ } Spring Framework - MVC Dmitry Noskov
  • 38. Data Representation Spring Framework - MVC Dmitry Noskov
  • 39. Approach  template view  ViewResolver, View  HTML, Excel, PDF, etc.  data view  HttpMessageConverter  XML, JSON, etc. Spring Framework - MVC Dmitry Noskov
  • 40. 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 Spring Framework - MVC Dmitry Noskov
  • 41. View  JSP & JSTL  Tiles  Velocity  FreeMarker  etc.  prefix  redirect:  forward: Spring Framework - MVC Dmitry Noskov
  • 42. ResourceBundleViewResolver  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" Spring Framework - MVC Dmitry Noskov
  • 43. 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" Spring Framework - MVC Dmitry Noskov
  • 44. Tiles(1)  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> Spring Framework - MVC Dmitry Noskov
  • 45. Tiles(2) <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> Spring Framework - MVC Dmitry Noskov
  • 46. 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 Spring Framework - MVC Dmitry Noskov
  • 47. ContentNegotiatingViewResolver Spring Framework - MVC Dmitry Noskov
  • 48. Strategies  URI  www.domain.com/cars.html  www.domain.com/cars.json  content negotiation  Accept: text/html…  Accept: text/xml…  Accept: application/pdf… Spring Framework - MVC Dmitry Noskov
  • 49. Example(1) <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> Spring Framework - MVC Dmitry Noskov
  • 50. Example(2) <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> Spring Framework - MVC Dmitry Noskov
  • 51. Additional features Locales Themes File upload Handling mappings / exceptions Spring Framework - MVC Dmitry Noskov
  • 52. 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 Spring Framework - MVC Dmitry Noskov
  • 53. Themes  ThemeSource  ResourceBundleThemeSource  ThemeResolver  FixedThemeResolver  SessionThemeResolver  CookieThemeResolver Spring Framework - MVC Dmitry Noskov
  • 54. 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) { } Spring Framework - MVC Dmitry Noskov
  • 55. 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> Spring Framework - MVC Dmitry Noskov
  • 56. 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) {} } Spring Framework - MVC Dmitry Noskov
  • 57. Handling Exceptions  application  HandlingExeptionResolver  controller  @ExceptionHandler(Exception.class) public String handleException(Exception e) { return ClassUtils.getShortName(e.getClass()); }  method  try {} catch (Exception e) {} Spring Framework - MVC Dmitry Noskov
  • 59. 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 Spring Framework - MVC Dmitry Noskov
  • 60. 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> Spring Framework - MVC Dmitry Noskov
  • 61. mvc:view-controller  immediately forwards to a view when invoked <mvc:view-controller path="/" view-name="index"/> <mvc:view-controller path="/resourceNotFound"/> Spring Framework - MVC Dmitry Noskov
  • 62. 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 Spring Framework - MVC Dmitry Noskov
  • 63. 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/> Spring Framework - MVC Dmitry Noskov
  • 64. Ajax Spring Framework - MVC Dmitry Noskov
  • 65. Getting JSON  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) {} ); } Spring Framework - MVC Dmitry Noskov
  • 66. Post JSON  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()); } Spring Framework - MVC Dmitry Noskov
  • 67. Spring Framework - MVC Dmitry Noskov
  • 68. Features  clear separation of roles  reusable business code  flexible model transfer  customizable binding and validation  customizable handler mapping and view resolution  pluggability Spring Framework - MVC Dmitry Noskov
  • 69. Spring MVC  lightweight web framework  controller is a Spring bean Spring Framework - MVC Dmitry Noskov
  • 70. 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 Spring Framework - MVC Dmitry Noskov
  • 71. Questions Spring Framework - MVC Dmitry Noskov
  • 72. The end http://www.linkedin.com/in/noskovd http://www.slideshare.net/analizator/presentations