Resource Handling in Spring MVC 4.1

R
Rossen StoyanchevSoftware Developer at Spring Framework team member, Pivotal senior staff
Resource Handling In Spring MVC 4.1 
Brian Clozel, Rossen Stoyanchev 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
About the presenters 
• Brian Clozel 
• Spring framework committer 
• Sagan maintainer 
• Open source enthusiast 
• Rossen Stoyanchev 
• Spring framework committer 
• Consulting and training for Spring teams 
• Java and web development since 1998 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
About the presentation 
• Web resource handling features in Spring Framework 4.1 
• Provide context and guidance 
• Design choices, questions 
• Sample code 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Resource Handling 
in Spring Framework 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Resource Handling < 4.1 
• Serve static resources from any Spring Resource location 
• classpath, file system, etc. 
• Basic cache header management 
• Expires, Cache-Control, Last-Modified 
• Easy to configure 
• MVC Java config and XML namespace 
• Or just map ResourceHttpRequestHandler 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Remaining Questions 
• Optimize (minify, concatenate, etc.) 
• Transform (sass, less, gzip) 
• Use CDN 
• Effective HTTP caching (versioned URLs) 
• Develop, debug, and refresh (F5) with ease 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Comprehensive strategy 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Framework 4.1 goal 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Request for Fingerprinting URLs 
• http://jira.springsource.org/browse/SPR-10310 
• Based on “asset pipeline” from Ruby on Rails 
• Adapt feature to Spring MVC 
• build on existing resource handling mechanism 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
URL “Fingerprinting” ?! 
• Technique for effective HTTP “cache busting” 
• Version URL with hash computed from file content 
• e.g. “/css/font-awesome.min-7fbe76cdac.css” 
• Add aggressive cache headers, e.g. +1 year 
• Resource is cached in browser (until content changes) 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Full Spring MVC “Asset Pipeline” Proposal 
• Independently a proposal for complete “asset pipeline” 
• via @robertharrop (Spring Framework founder) 
• Initial investigation lead to major fork in the road 
• JavaScript build tasks offer attractive alternative 
• e.g. Grunt 
• huge ecosystem, many plugins of interest 
• works with any backend 
• Runtime vs build-time approach and trade-offs 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Yet another development 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Sagan: http://spring.io 
• Written with Spring 
• by Pivotal Labs (deep RoR knowledge) and Chris Beams 
• launched during SpringOne 2GX keynote 
• Aggressive deadline, some technical debt 
• pay-off due prior to open-sourcing 
• Improve client side 
• with help from @unscriptable and @briancavalier (cujo.js fame) 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Client Source Code Layout 
• Modern client as 1st class citizen in a Java project 
• Server and client side are each entitled to: 
• dependency management 
• modularity 
• tests 
• build artifacts (e.g. minification, concatenation) 
• Use of src/main/webapp is just not adequate any more 
• Common but behind the times 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Sagan Project Structure 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
The sagan-client module 
• Separate module 
• Lets you follow best practices 
• node.js / npm for node dependencies 
• bower: 3rd party dependency management (like Maven for Java) 
• curl, cram: module loading and concatenating 
• gulp: build tasks 
• Gradle integrated 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Working with Sagan Client Sources 
• We’re no longer using src/main/webapp 
• How to keep the same smooth, just-hit-F5, dev experience? 
• Copying files at build time, not the way to go! 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How Sagan Serves Static Resources? 
• Spring profiles (“dev”, “prod”, etc) 
• In dev mode serve directly from source location 
• i.e. 
• where saganPath is initialized from a property 
• In production from classpath (minified, concatenated) 
• JavaScript source maps for debugging in production 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Managing front-end dependencies 
• WebJars: refers to “resources bundled in a jar” 
• Sagan 
• manage client dependencies with npm and bower 
• bundle a single JAR 
• Spring Boot serves from classpath:/static 
• www.webjars.org 
• front-end dependencies as jars from Maven central 
• plus bundle client application sources (“src/main/webapp”) 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Sagan Summary 
• Production Spring application 
• Open source github.com/spring-io/sagan 
• Separate talk about Sagan: 
“Inside spring.io a production Spring reference application” 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Sample Application 
github.com/SpringOne2GX-2014/spring-resource-handling 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Demo 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Demo Summary 
• Bower downloads dependencies 
• e.g. curl 0.8.10, jquery 2.0.3, bootstrap 3.1.1, less 1.7.3 
• Gulp.js plugins 
• cram, uglify, minify-css, bower-src, pngcrush, etc. 
• Optimize .js, .css, images under src/ + copy to dist/ 
• including bower-managed sources 
• Gradle-driven 
• bundle dist under classpath:/static 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
JavaScript Build Tasks (Gulp, Grunt) 
• Tremendous choice 
• Rich ecosystem, continues to evolve 
• Sagan switched from Grunt to Gulp in its relatively short life 
• Best way to remain aligned with client trends 
• Works well with any server (Java, Ruby, etc) 
and client (JS, Dart, ES6, TypeScript) 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How can Spring MVC help? 
• Make it easy to switch between environments 
• work with (un)optimized sources 
• Pluggable resolution of resources 
• optimized, transpiled, gzipped, etc. 
• Insert versions in URLs for “cache busting” 
• Produce HTML5 AppCache manifests 
• Prepare links with CDN domain 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Enter 
Spring Framework 4.1 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Extending ResourceHttpRequestHandler 
• Two new auxiliary strategies forming two chains 
• ResourceResolver 
• ResourceTransformer 
• New component to determine “public” resource URLs 
• ResourceUrlProvider 
• internally delegates to resolver chain 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Built-in Resolvers 
• PathResourceResolver 
• simple path lookup under configured locations 
• VersionResourceResolver 
• resolution with version in URL path 
• GzipResourceResolver 
• lookup with.gz extension when “Accept-Encoding: gzip” 
• CachingResourceResolver 
• caching of resolved resource 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Built-in Transformers 
• CssLinkResourceTransformer 
• update links in CSS file (e.g. insert version) 
• AppCacheManifestTransformer 
• update links in HTML5 AppCache manifest 
• insert comment with content-based hash 
• CachingResourceTransformer 
• caching of transformed resource 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Resource URLs 
• No longer a simple location-relative paths 
• e.g. may need to insert version 
• ResourceResolver expected to 
• resolve resource 
• prepare “public” URL 
• ResourceUrlProvider 
• detects resource handler mappings on startup 
• returns “public” resource URL or null if not a resource URL 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How to render resource URLs in views? 
• ResourceUrlEncodingFilter 
• re-writes resource URLs 
• uses servlet response wrapper (overrides encodeUrl) 
• Works with JSP, FreeMarker, Velocity 
• and wherever response.encodeUrl is in use 
• Alternatively use ResourceUrlProvider directly 
• MVC Java config declares “mvcResourceUrlProvider” bean 
• also exposed as request attribute via interceptor 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How to render resource URLs in resources? 
• Resource can have embedded URLs 
• e.g. @import in CSS file 
• Use resource transformers to update URLs 
• CssLinkResourceTransformer 
• AppCacheManifestTransformer 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
VersionResourceResolver 
• Configured with one or more version strategies 
• mapped by pattern 
• ContentVersionStrategy 
• a.k.a “fingerprinting” URLs 
• FixedVersionStrategy 
• version from property file, current date, Github commit sha, etc. 
• inserted as prefix in the URL path 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Which VersionStrategy? 
• ContentVersionStrategy a good default choice 
• automated version 
• per-resource “cache busting” 
• FixedVersionStrategy still needed 
• with JavaScript module loaders 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Where we draw the line for the built-in support 
• Enable flexible resource resolution 
• Runtime transformation only where absolutely needed 
• e.g. update links inside CSS 
• Support URL versioning as first class feature 
• fingerprinting, fixed version, etc. 
• Work well with JavaScript build plugins 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Can Full “Asset Pipeline” Be Supported? 
• Yes, one example already exists 
• WUIC (http://wuic.github.io/) 
• The foundation is flexible for any approach 
• use any resolvers, transformers 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Demo 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Web configuration in dev 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Web configuration in production 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Handlebars Template and HTML output 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Groovy Template and HTML output 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Creating a Groovy Template Helper 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
HTML5 AppCache MANIFEST 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Questions? 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learn More. Stay Connected 
Start your next app with 
Spring 4 and JDK8! 
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a 
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 
Check out Rossen’s 
“Spring 4 Web applications” 
@springcentral | spring.io/video
1 of 45

Recommended

Spring MVC 4.2: New and Noteworthy by
Spring MVC 4.2: New and NoteworthySpring MVC 4.2: New and Noteworthy
Spring MVC 4.2: New and NoteworthyRossen Stoyanchev
4.5K views64 slides
Intro To Reactive Programming by
Intro To Reactive ProgrammingIntro To Reactive Programming
Intro To Reactive ProgrammingRossen Stoyanchev
1.3K views81 slides
Reactive Web Applications by
Reactive Web ApplicationsReactive Web Applications
Reactive Web ApplicationsRossen Stoyanchev
9K views52 slides
Introduction to Reactive Streams and Reactor 2.5 by
Introduction to Reactive Streams and Reactor 2.5Introduction to Reactive Streams and Reactor 2.5
Introduction to Reactive Streams and Reactor 2.5Stéphane Maldini
1.4K views40 slides
Migrating to Angular 5 for Spring Developers by
Migrating to Angular 5 for Spring DevelopersMigrating to Angular 5 for Spring Developers
Migrating to Angular 5 for Spring DevelopersGunnar Hillert
469 views26 slides
Migrating to Angular 4 for Spring Developers by
Migrating to Angular 4 for Spring Developers Migrating to Angular 4 for Spring Developers
Migrating to Angular 4 for Spring Developers VMware Tanzu
484 views26 slides

More Related Content

What's hot

Building Killer RESTful APIs with NodeJs by
Building Killer RESTful APIs with NodeJsBuilding Killer RESTful APIs with NodeJs
Building Killer RESTful APIs with NodeJsSrdjan Strbanovic
9.6K views45 slides
Mavenizing your Liferay project by
Mavenizing your Liferay projectMavenizing your Liferay project
Mavenizing your Liferay projectmimacom
4.3K views34 slides
Modern Web Applications by
Modern Web ApplicationsModern Web Applications
Modern Web ApplicationsSrdjan Strbanovic
1.4K views29 slides
Simplifying Apache Geode with Spring Data by
Simplifying Apache Geode with Spring DataSimplifying Apache Geode with Spring Data
Simplifying Apache Geode with Spring DataVMware Tanzu
799 views44 slides
Running Spring Boot Applications as GraalVM Native Images by
Running Spring Boot Applications as GraalVM Native ImagesRunning Spring Boot Applications as GraalVM Native Images
Running Spring Boot Applications as GraalVM Native ImagesVMware Tanzu
7.2K views49 slides

What's hot(20)

Building Killer RESTful APIs with NodeJs by Srdjan Strbanovic
Building Killer RESTful APIs with NodeJsBuilding Killer RESTful APIs with NodeJs
Building Killer RESTful APIs with NodeJs
Srdjan Strbanovic9.6K views
Mavenizing your Liferay project by mimacom
Mavenizing your Liferay projectMavenizing your Liferay project
Mavenizing your Liferay project
mimacom4.3K views
Simplifying Apache Geode with Spring Data by VMware Tanzu
Simplifying Apache Geode with Spring DataSimplifying Apache Geode with Spring Data
Simplifying Apache Geode with Spring Data
VMware Tanzu799 views
Running Spring Boot Applications as GraalVM Native Images by VMware Tanzu
Running Spring Boot Applications as GraalVM Native ImagesRunning Spring Boot Applications as GraalVM Native Images
Running Spring Boot Applications as GraalVM Native Images
VMware Tanzu7.2K views
Expect the unexpected: Anticipate and prepare for failures in microservices b... by Bhakti Mehta
Expect the unexpected: Anticipate and prepare for failures in microservices b...Expect the unexpected: Anticipate and prepare for failures in microservices b...
Expect the unexpected: Anticipate and prepare for failures in microservices b...
Bhakti Mehta1.8K views
JavaOne 2015: 12 Factor App by Joe Kutner
JavaOne 2015: 12 Factor AppJavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor App
Joe Kutner3.3K views
JavaOne 2014 BOF4241 What's Next for JSF? by Edward Burns
JavaOne 2014 BOF4241 What's Next for JSF?JavaOne 2014 BOF4241 What's Next for JSF?
JavaOne 2014 BOF4241 What's Next for JSF?
Edward Burns29.8K views
Servlet 4.0 at GeekOut 2015 by Edward Burns
Servlet 4.0 at GeekOut 2015Servlet 4.0 at GeekOut 2015
Servlet 4.0 at GeekOut 2015
Edward Burns19.3K views
WebSockets in Enterprise Applications by Pavel Bucek
WebSockets in Enterprise ApplicationsWebSockets in Enterprise Applications
WebSockets in Enterprise Applications
Pavel Bucek8K views
Peering Inside the Black Box: A Case for Observability by VMware Tanzu
Peering Inside the Black Box: A Case for ObservabilityPeering Inside the Black Box: A Case for Observability
Peering Inside the Black Box: A Case for Observability
VMware Tanzu166 views
Migrating From Applets to Java Desktop Apps in JavaFX by Bruno Borges
Migrating From Applets to Java Desktop Apps in JavaFXMigrating From Applets to Java Desktop Apps in JavaFX
Migrating From Applets to Java Desktop Apps in JavaFX
Bruno Borges5.6K views
Triple E class DevOps with Hudson, Maven, Kokki/Multiconf and PyDev by Werner Keil
Triple E class DevOps with Hudson, Maven, Kokki/Multiconf and PyDevTriple E class DevOps with Hudson, Maven, Kokki/Multiconf and PyDev
Triple E class DevOps with Hudson, Maven, Kokki/Multiconf and PyDev
Werner Keil820 views
Reactive Java EE - Let Me Count the Ways! by Reza Rahman
Reactive Java EE - Let Me Count the Ways!Reactive Java EE - Let Me Count the Ways!
Reactive Java EE - Let Me Count the Ways!
Reza Rahman104.5K views

Viewers also liked

Centralized Application Configuration with Spring and Apache Zookeeper by
Centralized Application Configuration with Spring and Apache ZookeeperCentralized Application Configuration with Spring and Apache Zookeeper
Centralized Application Configuration with Spring and Apache ZookeeperRyan Gardner
8.1K views38 slides
DTI Sales Promotion Permit Application Process by
DTI Sales Promotion Permit Application ProcessDTI Sales Promotion Permit Application Process
DTI Sales Promotion Permit Application ProcessJanette Toral
53.7K views27 slides
Testing Web Apps with Spring Framework 3.2 by
Testing Web Apps with Spring Framework 3.2Testing Web Apps with Spring Framework 3.2
Testing Web Apps with Spring Framework 3.2Rossen Stoyanchev
8K views51 slides
Testing Web Apps with Spring Framework by
Testing Web Apps with Spring FrameworkTesting Web Apps with Spring Framework
Testing Web Apps with Spring FrameworkDmytro Chyzhykov
4.9K views85 slides
Spring 4.x Web Application 살펴보기 by
Spring 4.x Web Application  살펴보기Spring 4.x Web Application  살펴보기
Spring 4.x Web Application 살펴보기Ji Heon Kim
9.2K views50 slides
Spring MVC by
Spring MVCSpring MVC
Spring MVCEmprovise
2.4K views55 slides

Viewers also liked(17)

Centralized Application Configuration with Spring and Apache Zookeeper by Ryan Gardner
Centralized Application Configuration with Spring and Apache ZookeeperCentralized Application Configuration with Spring and Apache Zookeeper
Centralized Application Configuration with Spring and Apache Zookeeper
Ryan Gardner8.1K views
DTI Sales Promotion Permit Application Process by Janette Toral
DTI Sales Promotion Permit Application ProcessDTI Sales Promotion Permit Application Process
DTI Sales Promotion Permit Application Process
Janette Toral53.7K views
Testing Web Apps with Spring Framework by Dmytro Chyzhykov
Testing Web Apps with Spring FrameworkTesting Web Apps with Spring Framework
Testing Web Apps with Spring Framework
Dmytro Chyzhykov4.9K views
Spring 4.x Web Application 살펴보기 by Ji Heon Kim
Spring 4.x Web Application  살펴보기Spring 4.x Web Application  살펴보기
Spring 4.x Web Application 살펴보기
Ji Heon Kim9.2K views
Spring MVC by Emprovise
Spring MVCSpring MVC
Spring MVC
Emprovise2.4K views
Spring framework 3.2 > 4.0 — themes and trends by Arawn Park
Spring framework 3.2 > 4.0 — themes and trendsSpring framework 3.2 > 4.0 — themes and trends
Spring framework 3.2 > 4.0 — themes and trends
Arawn Park8.1K views
spring.io를 통해 배우는 spring 개발사례 by Daehwan Lee
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례
Daehwan Lee9.5K views
Getting Started with Spring Framework by Edureka!
Getting Started with Spring FrameworkGetting Started with Spring Framework
Getting Started with Spring Framework
Edureka!3.7K views
Spring MVC framework by Mohit Gupta
Spring MVC frameworkSpring MVC framework
Spring MVC framework
Mohit Gupta919 views
the Spring 4 update by Joshua Long
the Spring 4 updatethe Spring 4 update
the Spring 4 update
Joshua Long4.3K views
Spring MVC - The Basics by Ilio Catallo
Spring MVC -  The BasicsSpring MVC -  The Basics
Spring MVC - The Basics
Ilio Catallo3.3K views
Spring 3.x - Spring MVC by Guy Nir
Spring 3.x - Spring MVCSpring 3.x - Spring MVC
Spring 3.x - Spring MVC
Guy Nir6.1K views

Similar to Resource Handling in Spring MVC 4.1

Building a Secure App with Google Polymer and Java / Spring by
Building a Secure App with Google Polymer and Java / SpringBuilding a Secure App with Google Polymer and Java / Spring
Building a Secure App with Google Polymer and Java / Springsdeeg
14K views33 slides
12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve... by
12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve...12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve...
12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve...VMware Tanzu
2.2K views36 slides
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve... by
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...cornelia davis
1.6K views51 slides
Building .NET Microservices by
Building .NET MicroservicesBuilding .NET Microservices
Building .NET MicroservicesVMware Tanzu
3.9K views26 slides
What's new in Spring Boot 2.0 by
What's new in Spring Boot 2.0What's new in Spring Boot 2.0
What's new in Spring Boot 2.0VMware Tanzu
1.9K views35 slides
The Beginner’s Guide To Spring Cloud by
The Beginner’s Guide To Spring CloudThe Beginner’s Guide To Spring Cloud
The Beginner’s Guide To Spring CloudVMware Tanzu
2K views17 slides

Similar to Resource Handling in Spring MVC 4.1(20)

Building a Secure App with Google Polymer and Java / Spring by sdeeg
Building a Secure App with Google Polymer and Java / SpringBuilding a Secure App with Google Polymer and Java / Spring
Building a Secure App with Google Polymer and Java / Spring
sdeeg14K views
12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve... by VMware Tanzu
12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve...12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve...
12 Factor, or Cloud Native Apps - What EXACTLY Does that Mean for Spring Deve...
VMware Tanzu2.2K views
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve... by cornelia davis
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...
cornelia davis1.6K views
Building .NET Microservices by VMware Tanzu
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
VMware Tanzu3.9K views
What's new in Spring Boot 2.0 by VMware Tanzu
What's new in Spring Boot 2.0What's new in Spring Boot 2.0
What's new in Spring Boot 2.0
VMware Tanzu1.9K views
The Beginner’s Guide To Spring Cloud by VMware Tanzu
The Beginner’s Guide To Spring CloudThe Beginner’s Guide To Spring Cloud
The Beginner’s Guide To Spring Cloud
VMware Tanzu2K views
Fast 5 Things You Can Do Now to Get Ready for the Cloud by VMware Tanzu
Fast 5 Things You Can Do Now to Get Ready for the CloudFast 5 Things You Can Do Now to Get Ready for the Cloud
Fast 5 Things You Can Do Now to Get Ready for the Cloud
VMware Tanzu246 views
Ratpack - SpringOne2GX 2015 by Daniel Woods
Ratpack - SpringOne2GX 2015Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015
Daniel Woods3.1K views
Deploying Spring Boot apps on Kubernetes by VMware Tanzu
Deploying Spring Boot apps on KubernetesDeploying Spring Boot apps on Kubernetes
Deploying Spring Boot apps on Kubernetes
VMware Tanzu3.1K views
Documenting RESTful APIs with Spring REST Docs by VMware Tanzu
Documenting RESTful APIs with Spring REST Docs Documenting RESTful APIs with Spring REST Docs
Documenting RESTful APIs with Spring REST Docs
VMware Tanzu3K views
Experiences using grails in a Microservice Architecture SpringOne2gx 2014 by Jeff Beck
Experiences using grails in a Microservice Architecture SpringOne2gx 2014Experiences using grails in a Microservice Architecture SpringOne2gx 2014
Experiences using grails in a Microservice Architecture SpringOne2gx 2014
Jeff Beck1.5K views
Cloud Configuration Ecosystem at Intuit by VMware Tanzu
Cloud Configuration Ecosystem at IntuitCloud Configuration Ecosystem at Intuit
Cloud Configuration Ecosystem at Intuit
VMware Tanzu400 views
Consumer Driven Contracts and Your Microservice Architecture by Marcin Grzejszczak
Consumer Driven Contracts and Your Microservice ArchitectureConsumer Driven Contracts and Your Microservice Architecture
Consumer Driven Contracts and Your Microservice Architecture
Marcin Grzejszczak26.3K views
Cloud Native Java with Spring Cloud Services by VMware Tanzu
Cloud Native Java with Spring Cloud ServicesCloud Native Java with Spring Cloud Services
Cloud Native Java with Spring Cloud Services
VMware Tanzu2.1K views
Kafka Summit NYC 2017 - Cloud Native Data Streaming Microservices with Spring... by confluent
Kafka Summit NYC 2017 - Cloud Native Data Streaming Microservices with Spring...Kafka Summit NYC 2017 - Cloud Native Data Streaming Microservices with Spring...
Kafka Summit NYC 2017 - Cloud Native Data Streaming Microservices with Spring...
confluent947 views
riffing on Knative - Scott Andrews by VMware Tanzu
riffing on Knative - Scott Andrewsriffing on Knative - Scott Andrews
riffing on Knative - Scott Andrews
VMware Tanzu368 views
Data Migration at Scale with RabbitMQ and Spring Integration by Alvaro Videla
Data Migration at Scale with RabbitMQ and Spring IntegrationData Migration at Scale with RabbitMQ and Spring Integration
Data Migration at Scale with RabbitMQ and Spring Integration
Alvaro Videla2.4K views
Running Java Applications on Cloud Foundry by VMware Tanzu
Running Java Applications on Cloud FoundryRunning Java Applications on Cloud Foundry
Running Java Applications on Cloud Foundry
VMware Tanzu1.3K views

Recently uploaded

Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or... by
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...ShapeBlue
88 views20 slides
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...ShapeBlue
74 views18 slides
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueShapeBlue
96 views7 slides
Business Analyst Series 2023 - Week 4 Session 7 by
Business Analyst Series 2023 -  Week 4 Session 7Business Analyst Series 2023 -  Week 4 Session 7
Business Analyst Series 2023 - Week 4 Session 7DianaGray10
80 views31 slides
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...ShapeBlue
63 views13 slides
NTGapps NTG LowCode Platform by
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform Mustafa Kuğu
141 views30 slides

Recently uploaded(20)

Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or... by ShapeBlue
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
ShapeBlue88 views
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by ShapeBlue
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
ShapeBlue74 views
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
ShapeBlue96 views
Business Analyst Series 2023 - Week 4 Session 7 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 7Business Analyst Series 2023 -  Week 4 Session 7
Business Analyst Series 2023 - Week 4 Session 7
DianaGray1080 views
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by ShapeBlue
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
ShapeBlue63 views
NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu141 views
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P... by ShapeBlue
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
ShapeBlue82 views
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool by ShapeBlue
Extending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPoolExtending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPool
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool
ShapeBlue40 views
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by Bernd Ruecker
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
Bernd Ruecker50 views
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by ShapeBlue
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
ShapeBlue54 views
DRBD Deep Dive - Philipp Reisner - LINBIT by ShapeBlue
DRBD Deep Dive - Philipp Reisner - LINBITDRBD Deep Dive - Philipp Reisner - LINBIT
DRBD Deep Dive - Philipp Reisner - LINBIT
ShapeBlue62 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue35 views
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by TrustArc
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc77 views
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by Network Automation Forum
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue by ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueWhat’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
ShapeBlue131 views
Webinar : Desperately Seeking Transformation - Part 2: Insights from leading... by The Digital Insurer
Webinar : Desperately Seeking Transformation - Part 2:  Insights from leading...Webinar : Desperately Seeking Transformation - Part 2:  Insights from leading...
Webinar : Desperately Seeking Transformation - Part 2: Insights from leading...
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ... by ShapeBlue
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
ShapeBlue65 views
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely56 views

Resource Handling in Spring MVC 4.1

  • 1. Resource Handling In Spring MVC 4.1 Brian Clozel, Rossen Stoyanchev Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 2. About the presenters • Brian Clozel • Spring framework committer • Sagan maintainer • Open source enthusiast • Rossen Stoyanchev • Spring framework committer • Consulting and training for Spring teams • Java and web development since 1998 Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 3. About the presentation • Web resource handling features in Spring Framework 4.1 • Provide context and guidance • Design choices, questions • Sample code Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 4. Resource Handling in Spring Framework Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 5. Resource Handling < 4.1 • Serve static resources from any Spring Resource location • classpath, file system, etc. • Basic cache header management • Expires, Cache-Control, Last-Modified • Easy to configure • MVC Java config and XML namespace • Or just map ResourceHttpRequestHandler Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 6. Remaining Questions • Optimize (minify, concatenate, etc.) • Transform (sass, less, gzip) • Use CDN • Effective HTTP caching (versioned URLs) • Develop, debug, and refresh (F5) with ease Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 7. Comprehensive strategy Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 8. Spring Framework 4.1 goal Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 9. Request for Fingerprinting URLs • http://jira.springsource.org/browse/SPR-10310 • Based on “asset pipeline” from Ruby on Rails • Adapt feature to Spring MVC • build on existing resource handling mechanism Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 10. URL “Fingerprinting” ?! • Technique for effective HTTP “cache busting” • Version URL with hash computed from file content • e.g. “/css/font-awesome.min-7fbe76cdac.css” • Add aggressive cache headers, e.g. +1 year • Resource is cached in browser (until content changes) Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 11. Full Spring MVC “Asset Pipeline” Proposal • Independently a proposal for complete “asset pipeline” • via @robertharrop (Spring Framework founder) • Initial investigation lead to major fork in the road • JavaScript build tasks offer attractive alternative • e.g. Grunt • huge ecosystem, many plugins of interest • works with any backend • Runtime vs build-time approach and trade-offs Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 12. Yet another development Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 13. Sagan: http://spring.io • Written with Spring • by Pivotal Labs (deep RoR knowledge) and Chris Beams • launched during SpringOne 2GX keynote • Aggressive deadline, some technical debt • pay-off due prior to open-sourcing • Improve client side • with help from @unscriptable and @briancavalier (cujo.js fame) Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 14. Client Source Code Layout • Modern client as 1st class citizen in a Java project • Server and client side are each entitled to: • dependency management • modularity • tests • build artifacts (e.g. minification, concatenation) • Use of src/main/webapp is just not adequate any more • Common but behind the times Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 15. Sagan Project Structure Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 16. The sagan-client module • Separate module • Lets you follow best practices • node.js / npm for node dependencies • bower: 3rd party dependency management (like Maven for Java) • curl, cram: module loading and concatenating • gulp: build tasks • Gradle integrated Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 17. Working with Sagan Client Sources • We’re no longer using src/main/webapp • How to keep the same smooth, just-hit-F5, dev experience? • Copying files at build time, not the way to go! Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 18. How Sagan Serves Static Resources? • Spring profiles (“dev”, “prod”, etc) • In dev mode serve directly from source location • i.e. • where saganPath is initialized from a property • In production from classpath (minified, concatenated) • JavaScript source maps for debugging in production Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 19. Managing front-end dependencies • WebJars: refers to “resources bundled in a jar” • Sagan • manage client dependencies with npm and bower • bundle a single JAR • Spring Boot serves from classpath:/static • www.webjars.org • front-end dependencies as jars from Maven central • plus bundle client application sources (“src/main/webapp”) Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 20. Sagan Summary • Production Spring application • Open source github.com/spring-io/sagan • Separate talk about Sagan: “Inside spring.io a production Spring reference application” Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 21. Sample Application github.com/SpringOne2GX-2014/spring-resource-handling Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 22. Demo Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 23. Demo Summary • Bower downloads dependencies • e.g. curl 0.8.10, jquery 2.0.3, bootstrap 3.1.1, less 1.7.3 • Gulp.js plugins • cram, uglify, minify-css, bower-src, pngcrush, etc. • Optimize .js, .css, images under src/ + copy to dist/ • including bower-managed sources • Gradle-driven • bundle dist under classpath:/static Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 24. JavaScript Build Tasks (Gulp, Grunt) • Tremendous choice • Rich ecosystem, continues to evolve • Sagan switched from Grunt to Gulp in its relatively short life • Best way to remain aligned with client trends • Works well with any server (Java, Ruby, etc) and client (JS, Dart, ES6, TypeScript) Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 25. How can Spring MVC help? • Make it easy to switch between environments • work with (un)optimized sources • Pluggable resolution of resources • optimized, transpiled, gzipped, etc. • Insert versions in URLs for “cache busting” • Produce HTML5 AppCache manifests • Prepare links with CDN domain Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 26. Enter Spring Framework 4.1 Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 27. Extending ResourceHttpRequestHandler • Two new auxiliary strategies forming two chains • ResourceResolver • ResourceTransformer • New component to determine “public” resource URLs • ResourceUrlProvider • internally delegates to resolver chain Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 28. Built-in Resolvers • PathResourceResolver • simple path lookup under configured locations • VersionResourceResolver • resolution with version in URL path • GzipResourceResolver • lookup with.gz extension when “Accept-Encoding: gzip” • CachingResourceResolver • caching of resolved resource Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 29. Built-in Transformers • CssLinkResourceTransformer • update links in CSS file (e.g. insert version) • AppCacheManifestTransformer • update links in HTML5 AppCache manifest • insert comment with content-based hash • CachingResourceTransformer • caching of transformed resource Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 30. Resource URLs • No longer a simple location-relative paths • e.g. may need to insert version • ResourceResolver expected to • resolve resource • prepare “public” URL • ResourceUrlProvider • detects resource handler mappings on startup • returns “public” resource URL or null if not a resource URL Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 31. How to render resource URLs in views? • ResourceUrlEncodingFilter • re-writes resource URLs • uses servlet response wrapper (overrides encodeUrl) • Works with JSP, FreeMarker, Velocity • and wherever response.encodeUrl is in use • Alternatively use ResourceUrlProvider directly • MVC Java config declares “mvcResourceUrlProvider” bean • also exposed as request attribute via interceptor Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 32. How to render resource URLs in resources? • Resource can have embedded URLs • e.g. @import in CSS file • Use resource transformers to update URLs • CssLinkResourceTransformer • AppCacheManifestTransformer Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 33. VersionResourceResolver • Configured with one or more version strategies • mapped by pattern • ContentVersionStrategy • a.k.a “fingerprinting” URLs • FixedVersionStrategy • version from property file, current date, Github commit sha, etc. • inserted as prefix in the URL path Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 34. Which VersionStrategy? • ContentVersionStrategy a good default choice • automated version • per-resource “cache busting” • FixedVersionStrategy still needed • with JavaScript module loaders Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 35. Where we draw the line for the built-in support • Enable flexible resource resolution • Runtime transformation only where absolutely needed • e.g. update links inside CSS • Support URL versioning as first class feature • fingerprinting, fixed version, etc. • Work well with JavaScript build plugins Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 36. Can Full “Asset Pipeline” Be Supported? • Yes, one example already exists • WUIC (http://wuic.github.io/) • The foundation is flexible for any approach • use any resolvers, transformers Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 37. Demo Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 38. Web configuration in dev Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 39. Web configuration in production Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 40. Handlebars Template and HTML output Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 41. Groovy Template and HTML output Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 42. Creating a Groovy Template Helper Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 43. HTML5 AppCache MANIFEST Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 44. Questions? Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  • 45. Learn More. Stay Connected Start your next app with Spring 4 and JDK8! Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Check out Rossen’s “Spring 4 Web applications” @springcentral | spring.io/video