SlideShare a Scribd company logo
Extending Spring MVC with
                            Spring Mobile and JavaScript
                              Roy Clarkson, Spring Mobile/Android Project Lead
                                   Craig Walls, Spring Social Project Lead
                                  Twitter/Github: @royclarkson, @habuma


© 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
The Changing Face of the Web




4
The Changing Face of the Web




4
The Changing Face of the Web




4
The Changing Face of the Web




4
The Changing Face of the Web




4
The Changing Face of the Web




4
The Changing Face of the Web




4
The Changing Face of the Web




4
Targeting the Diverse Internet Client

        Your applications, anytime, anywhere, on any device

             Each platform has different physical capabilities

                  Same application/different experience

Experience customized to suit the capabilities/limits of the target platform




4
The Solution: Separate Web Sites per Platform


     Create a unique (aesthetically and functionally) site for...
                          Desktop browsers
      Handhelds (iPhone, various Android phones, iPod Touch)
               Tablets (iPad, various Android tablets)

                 Now you have a new problem
           Code duplication across platform-specific sites




4
Addendum to Previous Solution

                         Spring Mobile
                    Extension to Spring MVC
            Directs requests to platform-specific sites

                     Lumbar (and Thorax)
            From Walmart Labs (yes, that Walmart)
             Build tool for JavaScript client projects
           Identify collateral common to all platforms
           And collateral specific to certain platforms
                     Builds site-per-platform
           Thorax: Opinionated Backbone framework
4
Targeting the Right Platform
                                   with Spring Mobile



© 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Spring Mobile
• Provides support for developing mobile web applications
• Extension to Spring MVC, for server-side support
• Compliments client-side mobile frameworks




 7
Features
• Device Detection
• Site Preference Management
• Site Switcher




 8
Device Detection
• Differentiate requests from various devices
• Introspects HTTP requests to determine the device that
  originated the request
• Provides a DeviceResolver abstraction and interceptor
• LiteDeviceResolver implementation




 9
Device Resolver
 <annotation-driven>

     <argument-resolvers>

         <beans:bean class="org.springframework.mobile.device
             .DeviceWebArgumentResolver" />

     </argument-resolvers>

 </annotation-driven>

 <interceptors>

 !   <beans:bean class="org.springframework.mobile.device
         .DeviceResolverHandlerInterceptor" />
 !
 </interceptors>

10
Device Injection

 @Controller
 public class HomeController {

     @RequestMapping("/")
     public void home(Device device) {
         if (device.isMobile()) {
             // Hello mobile user!
         } else {
             // Hello desktop user!
         }
     }

 }




11
Device Detection Demo




12
Site Preference Management
• Allows the user to indicate whether he or she prefers the
  mobile site or the normal site
• Remembers the user’s preference for their session
• StandardSitePreferenceHandler implementation




 13
Site Preference Resolver


 <annotation-driven>

 !   <argument-resolvers>

 !   !   <beans:bean class="org.springframework.mobile.device.site
            .SitePreferenceWebArgumentResolver" />

 !   </argument-resolvers>

 </annotation-driven>




14
SitePreference Injection

 @Controller
 public class HomeController {

     @RequestMapping("/")
 !   public String home(SitePreference sitePreference, Model model) {
 !   !    if (sitePreference == SitePreference.MOBILE) {
 !   !    !   return "home-mobile";
 !   !    } else {
 !   !    !   return "home";
 !   !    }
 !   }

 }



15
Site Preference Demo




16
Site Switcher
• Some applications may wish to host their "mobile site" at a
  different domain from their "normal site"
• SiteSwitcherHandlerInterceptor can be used to redirect
  mobile users to a dedicated mobile site
• Supported SiteSwitchers
      – mDot
      – dotMobi
      – urlPath


 17
“mDot” Site Switcher


 <interceptors>
 !
     <beans:bean class="org.springframework.mobile.device.switcher
         .SiteSwitcherHandlerInterceptor" factory-method="mDot">

         <beans:constructor-arg value="testdomain.com" />

     </beans:bean>
 !   !
 </interceptors>




18
“dotMobi” Site Switcher


 <interceptors>
 !
     <beans:bean class="org.springframework.mobile.device.switcher
         .SiteSwitcherHandlerInterceptor" factory-method="dotMobi">

         <beans:constructor-arg value="testdomain.com" />

     </beans:bean>
 !   !
 </interceptors>




19
“urlPath” Site Switcher

 <interceptors>
 !
     <beans:bean class="org.springframework.mobile.device.switcher
         .SiteSwitcherHandlerInterceptor" factory-method="urlPath">

         <beans:constructor-arg value="/m" />
         <beans:constructor-arg value="/showcase" />

     </beans:bean>
 !   !
 </interceptors>




20
Site Switcher Demo




21
Building Platform-Targeted Sites
                          with Lumbar (and Thorax)



© 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Introducing Thorax

                Opinionated Backbone Framework
                  Project structure and scaffolding
                    On-demand module loading
                   Model/collection view binding
                 Inheritable view and DOM events
                        Data loading helpers
                   Form serialization/population
                           Form validation

Based on Backbone, Underscore, Zepto, Handlebars, Stylus, and Lumbar

4
Introducing Lumbar



                    JavaScript Build Tool
                Works from a general codebase
                    With a list of platforms
         Generates modular, platform-specific applications
                 Works best with Backbone/Thorax
                      Pluggable architecture




4
Getting and Installing Thorax and Lumbar

                        Prerequisites
                        Node and npm

                         Quick Start*
              % npm install -g lumbar thorax@1.2.1
              % thorax create MyProject
              % cd MyProject
              % lumbar build lumbar.json public
              % npm start

                                                     * Adapted from Thorax website
4
Elements of a Lumbar Build File (lumbar.json)


               Application: Defines the root module

       Platforms: Target platforms (e.g., iPhone, Android, etc)

    Packages: Macro-level definition of what goes into a platform

                Modules: Logical groupings of code

        Templates: Client-side templates (e.g. Handlebars)

          Styles: Stylesheets to be compiled (e.g. Stylus)


4
A Peek Inside lumbar.json




    {
        "application": {
           "name": "Application",
           "module": "base"
        },
        "platforms": [ "android", "iphone", "ipad", "web" ],
        "packages": { ... }
        "modules": { ... },
        "templates": { ... },
        "styles": { ... }
    }




4
A Peek Inside lumbar.json

    {
        "application": {...},
        "platforms": [ ... ],
        "packages": {
           "web": {
              "platforms": [ "web" ],
              "combine": false
           },
           "native-hello-world": {
              "platforms": [ "android", "iphone", "ipad" ],
              "modules": [ "base", "hello_world" ],
              "combine": true
           }
        },
        "modules": { ... },
        "templates": { ... },
        "styles": { ... }
    }


4
A Peek Inside lumbar.json
    { "application": {...}, "platforms": [ ... ], "packages": { ... },
      "modules": {
         "base": {
           "scripts": [
              {"src": "js/lib/zepto.js", "global": true},
              {"src": "js/lib/underscore.js", "global": true},
              ...
           ],
           "styles": [
              "styles/base.styl",
              {"src": "styles/iphone.styl", "platform": "iphone"},
              ...
           ],
           "static": [
              {"src": "static/#{platform}/index.html", "dest": "index.html"}
           ]
          }, "hello_world" : { ... }
      },
      "templates": { ... },   "styles": { ... }   }


4
A Peek Inside lumbar.json




    {
        "application": { ... },
        "platforms": [ ... ],
        "packages": { ... }
        "modules": { ... },
        "templates": {
           "js/views/hello_world/index.js": [
             "templates/hello_world/index.handlebars"
           ]
        },
        "styles": { ... }
    }




4
A Peek Inside lumbar.json

    {
        "application": { ... },
        "platforms": [ "android", "iphone", "ipad", "web" ],
        "packages": { ... }
        "modules": { ... },
        "templates": { ... },
        "styles": {
          "pixelDensity": {
             "android": [ 1, 1.5 ],
             "iphone": [ 1, 2 ],
             "ipad" : [ 1, 2 ],
             "web": [ 1, 2 ]
          },
          "includes": [
             "nib",
             "styles/include/global.styl"
          ]
        }
    }

4
Building with Lumbar
                                    .
                                    !""   android
                                    #     !"" index.html
                                    #     !"" native-hello-world.css
                                    #     !"" native-hello-world.js
                                    #     $"" native-hello-world@1.5x.css
      At command-line               !""   index.html
                                    !""   ipad
% lumbar build lumbar.json public   #  
                                    #  
                                          !"" index.html
                                          !"" native-hello-world.css
                                    #     !"" native-hello-world.js
                                    #     $"" native-hello-world@2x.css
                                    !""   iphone
         What you get               #     !"" index.html
                                    #     !"" native-hello-world.css
                                    #     !"" native-hello-world.js
                                    #     $"" native-hello-world@2x.css
                                    $""   web
                                          !"" base.css
                                          !"" base.js
                                          !"" base@2x.css
                                          !"" hello_world.css
                                          !"" hello_world.js
                                          !"" hello_world@2x.css
                                          $"" index.html


4
Demo: Thorax Client
Conclusion




© 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Summary

         The web is consumed by many different kinds of clients

       Each client platform has unique capabilities and limitations

              Web applications should target each platform

                 Same application / different experience

Lumbar can build platform-specific applications from a general codebase

Spring Mobile can detect the platform and direct to a platform-specific site


4
Q&A




© 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.

More Related Content

PDF
Mobile Web Development with HTML5
PDF
Native Android Development with Spring
PDF
Spring Projects Infrastructure
PPT
Making the Mobile Web Native with PhoneGap
PDF
Native Android Development Practices
PPTX
Hybrid Mobile Development with Apache Cordova and Java EE 7 (JavaOne 2014)
PPTX
App forum2015 London - Building RhoMobile Applications with Ionic
PDF
Intro to PhoneGap
Mobile Web Development with HTML5
Native Android Development with Spring
Spring Projects Infrastructure
Making the Mobile Web Native with PhoneGap
Native Android Development Practices
Hybrid Mobile Development with Apache Cordova and Java EE 7 (JavaOne 2014)
App forum2015 London - Building RhoMobile Applications with Ionic
Intro to PhoneGap

What's hot (20)

PPTX
Intro to Ionic for Building Hybrid Mobile Applications
PDF
Ionic - Revolutionizing Hybrid Mobile Application Development
PPTX
Developing Hybrid Applications with IONIC
PDF
Ionic framework one day training
PPTX
Wikipedia Mobile App with PhoneGap
PPTX
Selendroid - Selenium for Android
PDF
Ionic Framework: Let's build amazing apps. No Excuses!
PPTX
Introduction to Apache Cordova (Phonegap)
PDF
Hybrid app development with ionic
PPTX
Ionic Mobile Applications - Hybrid Mobile Applications Without Compromises
PDF
Lesson 1. Create project Sunshine
PDF
Cross-platform development frameworks
PPT
Ionic Framework
PPTX
Angularjs Tutorial for Beginners
PPTX
IONIC - Hybrid Mobile App Development
PPTX
Appcelerator Titanium Intro
KEY
jQuery Conference Boston 2011 CouchApps
PDF
Being Epic: Best Practices for Android Development
PDF
Apache cordova
PDF
Samsung Devcon - State of HTML5 - Chris Heilmann
Intro to Ionic for Building Hybrid Mobile Applications
Ionic - Revolutionizing Hybrid Mobile Application Development
Developing Hybrid Applications with IONIC
Ionic framework one day training
Wikipedia Mobile App with PhoneGap
Selendroid - Selenium for Android
Ionic Framework: Let's build amazing apps. No Excuses!
Introduction to Apache Cordova (Phonegap)
Hybrid app development with ionic
Ionic Mobile Applications - Hybrid Mobile Applications Without Compromises
Lesson 1. Create project Sunshine
Cross-platform development frameworks
Ionic Framework
Angularjs Tutorial for Beginners
IONIC - Hybrid Mobile App Development
Appcelerator Titanium Intro
jQuery Conference Boston 2011 CouchApps
Being Epic: Best Practices for Android Development
Apache cordova
Samsung Devcon - State of HTML5 - Chris Heilmann
Ad

Similar to Extending Spring MVC with Spring Mobile and JavaScript (20)

PDF
[2015/2016] Apache Cordova
PDF
Drupal 8 and iOS - an Open Source App
PDF
Apache Cordova 4.x
PPTX
Universal Applications with Universal JavaScript
PDF
Apache Cordova
PPTX
Native - Hybrid - Web Mobile Architectures
PDF
Advanced programing in phonegap
PDF
Introduction phonegap
PDF
Angular mobile angular_u
PPTX
Webdevcon Keynote hh-2012-09-18
PDF
Mobile Vue.js – From PWA to Native
PPTX
PDF
Dojo mobile web5-2013
PDF
2.28.17 Introducing DSpace 7 Webinar Slides
PDF
Building Effective and Rapid Applications with IBM MobileFirst Platform
KEY
Titanium appcelerator best practices
PDF
HTML5 Can't Do That
PPTX
Ionic Framework - get up and running to build hybrid mobile apps
PDF
Fixing the mobile web - Internet World Romania
PPTX
Building a Simple Mobile-optimized Web App Using the jQuery Mobile Framework
[2015/2016] Apache Cordova
Drupal 8 and iOS - an Open Source App
Apache Cordova 4.x
Universal Applications with Universal JavaScript
Apache Cordova
Native - Hybrid - Web Mobile Architectures
Advanced programing in phonegap
Introduction phonegap
Angular mobile angular_u
Webdevcon Keynote hh-2012-09-18
Mobile Vue.js – From PWA to Native
Dojo mobile web5-2013
2.28.17 Introducing DSpace 7 Webinar Slides
Building Effective and Rapid Applications with IBM MobileFirst Platform
Titanium appcelerator best practices
HTML5 Can't Do That
Ionic Framework - get up and running to build hybrid mobile apps
Fixing the mobile web - Internet World Romania
Building a Simple Mobile-optimized Web App Using the jQuery Mobile Framework
Ad

Recently uploaded (20)

PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
KodekX | Application Modernization Development
PDF
Electronic commerce courselecture one. Pdf
PPTX
A Presentation on Artificial Intelligence
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Modernizing your data center with Dell and AMD
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Big Data Technologies - Introduction.pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Encapsulation theory and applications.pdf
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Cloud computing and distributed systems.
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
KodekX | Application Modernization Development
Electronic commerce courselecture one. Pdf
A Presentation on Artificial Intelligence
The AUB Centre for AI in Media Proposal.docx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Modernizing your data center with Dell and AMD
Unlocking AI with Model Context Protocol (MCP)
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Big Data Technologies - Introduction.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Encapsulation theory and applications.pdf
Machine learning based COVID-19 study performance prediction
Cloud computing and distributed systems.
Reach Out and Touch Someone: Haptics and Empathic Computing
NewMind AI Weekly Chronicles - August'25 Week I
Mobile App Security Testing_ A Comprehensive Guide.pdf

Extending Spring MVC with Spring Mobile and JavaScript

  • 1. Extending Spring MVC with Spring Mobile and JavaScript Roy Clarkson, Spring Mobile/Android Project Lead Craig Walls, Spring Social Project Lead Twitter/Github: @royclarkson, @habuma © 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
  • 2. The Changing Face of the Web 4
  • 3. The Changing Face of the Web 4
  • 4. The Changing Face of the Web 4
  • 5. The Changing Face of the Web 4
  • 6. The Changing Face of the Web 4
  • 7. The Changing Face of the Web 4
  • 8. The Changing Face of the Web 4
  • 9. The Changing Face of the Web 4
  • 10. Targeting the Diverse Internet Client Your applications, anytime, anywhere, on any device Each platform has different physical capabilities Same application/different experience Experience customized to suit the capabilities/limits of the target platform 4
  • 11. The Solution: Separate Web Sites per Platform Create a unique (aesthetically and functionally) site for... Desktop browsers Handhelds (iPhone, various Android phones, iPod Touch) Tablets (iPad, various Android tablets) Now you have a new problem Code duplication across platform-specific sites 4
  • 12. Addendum to Previous Solution Spring Mobile Extension to Spring MVC Directs requests to platform-specific sites Lumbar (and Thorax) From Walmart Labs (yes, that Walmart) Build tool for JavaScript client projects Identify collateral common to all platforms And collateral specific to certain platforms Builds site-per-platform Thorax: Opinionated Backbone framework 4
  • 13. Targeting the Right Platform with Spring Mobile © 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
  • 14. Spring Mobile • Provides support for developing mobile web applications • Extension to Spring MVC, for server-side support • Compliments client-side mobile frameworks 7
  • 15. Features • Device Detection • Site Preference Management • Site Switcher 8
  • 16. Device Detection • Differentiate requests from various devices • Introspects HTTP requests to determine the device that originated the request • Provides a DeviceResolver abstraction and interceptor • LiteDeviceResolver implementation 9
  • 17. Device Resolver <annotation-driven> <argument-resolvers> <beans:bean class="org.springframework.mobile.device .DeviceWebArgumentResolver" /> </argument-resolvers> </annotation-driven> <interceptors> ! <beans:bean class="org.springframework.mobile.device .DeviceResolverHandlerInterceptor" /> ! </interceptors> 10
  • 18. Device Injection @Controller public class HomeController { @RequestMapping("/") public void home(Device device) { if (device.isMobile()) { // Hello mobile user! } else { // Hello desktop user! } } } 11
  • 20. Site Preference Management • Allows the user to indicate whether he or she prefers the mobile site or the normal site • Remembers the user’s preference for their session • StandardSitePreferenceHandler implementation 13
  • 21. Site Preference Resolver <annotation-driven> ! <argument-resolvers> ! ! <beans:bean class="org.springframework.mobile.device.site .SitePreferenceWebArgumentResolver" /> ! </argument-resolvers> </annotation-driven> 14
  • 22. SitePreference Injection @Controller public class HomeController { @RequestMapping("/") ! public String home(SitePreference sitePreference, Model model) { ! ! if (sitePreference == SitePreference.MOBILE) { ! ! ! return "home-mobile"; ! ! } else { ! ! ! return "home"; ! ! } ! } } 15
  • 24. Site Switcher • Some applications may wish to host their "mobile site" at a different domain from their "normal site" • SiteSwitcherHandlerInterceptor can be used to redirect mobile users to a dedicated mobile site • Supported SiteSwitchers – mDot – dotMobi – urlPath 17
  • 25. “mDot” Site Switcher <interceptors> ! <beans:bean class="org.springframework.mobile.device.switcher .SiteSwitcherHandlerInterceptor" factory-method="mDot"> <beans:constructor-arg value="testdomain.com" /> </beans:bean> ! ! </interceptors> 18
  • 26. “dotMobi” Site Switcher <interceptors> ! <beans:bean class="org.springframework.mobile.device.switcher .SiteSwitcherHandlerInterceptor" factory-method="dotMobi"> <beans:constructor-arg value="testdomain.com" /> </beans:bean> ! ! </interceptors> 19
  • 27. “urlPath” Site Switcher <interceptors> ! <beans:bean class="org.springframework.mobile.device.switcher .SiteSwitcherHandlerInterceptor" factory-method="urlPath"> <beans:constructor-arg value="/m" /> <beans:constructor-arg value="/showcase" /> </beans:bean> ! ! </interceptors> 20
  • 29. Building Platform-Targeted Sites with Lumbar (and Thorax) © 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
  • 30. Introducing Thorax Opinionated Backbone Framework Project structure and scaffolding On-demand module loading Model/collection view binding Inheritable view and DOM events Data loading helpers Form serialization/population Form validation Based on Backbone, Underscore, Zepto, Handlebars, Stylus, and Lumbar 4
  • 31. Introducing Lumbar JavaScript Build Tool Works from a general codebase With a list of platforms Generates modular, platform-specific applications Works best with Backbone/Thorax Pluggable architecture 4
  • 32. Getting and Installing Thorax and Lumbar Prerequisites Node and npm Quick Start* % npm install -g lumbar thorax@1.2.1 % thorax create MyProject % cd MyProject % lumbar build lumbar.json public % npm start * Adapted from Thorax website 4
  • 33. Elements of a Lumbar Build File (lumbar.json) Application: Defines the root module Platforms: Target platforms (e.g., iPhone, Android, etc) Packages: Macro-level definition of what goes into a platform Modules: Logical groupings of code Templates: Client-side templates (e.g. Handlebars) Styles: Stylesheets to be compiled (e.g. Stylus) 4
  • 34. A Peek Inside lumbar.json { "application": { "name": "Application", "module": "base" }, "platforms": [ "android", "iphone", "ipad", "web" ], "packages": { ... } "modules": { ... }, "templates": { ... }, "styles": { ... } } 4
  • 35. A Peek Inside lumbar.json { "application": {...}, "platforms": [ ... ], "packages": { "web": { "platforms": [ "web" ], "combine": false }, "native-hello-world": { "platforms": [ "android", "iphone", "ipad" ], "modules": [ "base", "hello_world" ], "combine": true } }, "modules": { ... }, "templates": { ... }, "styles": { ... } } 4
  • 36. A Peek Inside lumbar.json { "application": {...}, "platforms": [ ... ], "packages": { ... }, "modules": { "base": { "scripts": [ {"src": "js/lib/zepto.js", "global": true}, {"src": "js/lib/underscore.js", "global": true}, ... ], "styles": [ "styles/base.styl", {"src": "styles/iphone.styl", "platform": "iphone"}, ... ], "static": [ {"src": "static/#{platform}/index.html", "dest": "index.html"} ] }, "hello_world" : { ... } }, "templates": { ... }, "styles": { ... } } 4
  • 37. A Peek Inside lumbar.json { "application": { ... }, "platforms": [ ... ], "packages": { ... } "modules": { ... }, "templates": { "js/views/hello_world/index.js": [ "templates/hello_world/index.handlebars" ] }, "styles": { ... } } 4
  • 38. A Peek Inside lumbar.json { "application": { ... }, "platforms": [ "android", "iphone", "ipad", "web" ], "packages": { ... } "modules": { ... }, "templates": { ... }, "styles": { "pixelDensity": { "android": [ 1, 1.5 ], "iphone": [ 1, 2 ], "ipad" : [ 1, 2 ], "web": [ 1, 2 ] }, "includes": [ "nib", "styles/include/global.styl" ] } } 4
  • 39. Building with Lumbar . !"" android #   !"" index.html #   !"" native-hello-world.css #   !"" native-hello-world.js #   $"" native-hello-world@1.5x.css At command-line !"" index.html !"" ipad % lumbar build lumbar.json public #   #   !"" index.html !"" native-hello-world.css #   !"" native-hello-world.js #   $"" native-hello-world@2x.css !"" iphone What you get #   !"" index.html #   !"" native-hello-world.css #   !"" native-hello-world.js #   $"" native-hello-world@2x.css $"" web !"" base.css !"" base.js !"" base@2x.css !"" hello_world.css !"" hello_world.js !"" hello_world@2x.css $"" index.html 4
  • 41. Conclusion © 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.
  • 42. Summary The web is consumed by many different kinds of clients Each client platform has unique capabilities and limitations Web applications should target each platform Same application / different experience Lumbar can build platform-specific applications from a general codebase Spring Mobile can detect the platform and direct to a platform-specific site 4
  • 43. Q&A © 2012 SpringOne 2GX. All rights reserved. Do not distribute without permission.