Single-page Applications (SPA) are all the rage these days and with them there is an avalanche of new tools, libraries and frameworks we need to know. But what does this mean for us as Spring developers? In this session we will give you an overview of the current landscape and illustrate the choices the Spring XD team has made for its user interface. What do I use to write SPA applications? How do I integrate them into existing Spring-based backends? How do I build them? Can I integrate them into my existing Gradle or Maven build processes in order to achieve complete build automation? How do I integrate realtime messaging using Spring's SockJS/WebSocket support? In this talk we will answer these and many more questions. We will cover frameworks such as AngularJS, Bootstrap, RequireJS; tools like Bower, Grunt, Gulp; and also talk about testing using Karma and Protractor.
Creating Modular Test-Driven SPAs with Spring and AngularJS
1. Creating Modular Test Driven SPAs with
Spring And AngularJS
By Gunnar Hillert - @ghillert
Š 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
2. Goals
⢠AngularJS Introduction
⢠Build and Deployment
⢠Integration with Spring
⢠Modularization
⢠Testing
⢠UI Considerations
2
3. Me
⢠(Java) Web developer since 2005
⢠Struts 1+2, Spring MVC, GWT, Flex
⢠Spring Integration + XD committer
⢠AngularJS since Jan 2014
⢠Co-organize
3
5. AngularJS Introduction
Š 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
6. Audience - What do you use*?
⢠AngularJS
⢠Backbone
⢠JQuery
⢠Are you using any other SPA Framework? Ember.js
⢠Spring MVC
⢠Spring Boot
6
60%
20%
80%
1 user
80%
20%
* Recorded from memory
7. What are SPAs?
7
A single-page application (SPA), also known as single-page
interface (SPI), is a web application or web site that
fits on a single web page with the goal of providing a more
fluid user experience akin to a desktop application.
Wikipedia
14. Model
⢠Angular is very flexible about your model
⢠Ultimately expressed via the $scope
⢠$scope = Glue between Controller and View
⢠$scope mimics DOM (Hierarchical, one $rootScope)
14
15. Model
⢠Killer Feature: Data-Binding
⢠Model === single-source-of-truth
⢠View reflects model changes automatically
⢠$watch, $apply
15
16. View
⢠HTML is your templating Engine
⢠Minimize logic as much as possible
⢠Consider Custom Directives
16
18. Controller
⢠Used to "setup" your $scope (values)
⢠Add behavior to your $scope (functions)
⢠Don't do UI work using controllers!!
⢠Use directives and filters instead
18
34. Strategies - Java Tooling
⢠Wro4j
⢠Jawr
⢠Spring 4.1
⢠Flexible resolution and transformation of
static web resources
⢠See Blog Post
⢠WebJars
34
36. Make Maven and Gradle Grunt
⢠Plugins exist for Gradle and Maven
⢠Spring XD uses Gradle integration
⢠botanic-ng uses Maven integration
⢠Spring Boot plus Maven Frontend Plugin
36
37. Integration with Spring (Boot)
Š 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
38. Hello World fits into Tweet
38
@Controller
class ThisWillActuallyRun
{
@RequestMapping("/")
@ResponseBody
String home() {
"Hello World!"
}
}
39. Rapid Prototyping
⢠Spring Scripts (Samples)
⢠Starter POMs
⢠Ăber-Jars support (can create WARs also)
⢠Maven + Gradle Plugins
⢠AutoConfiguration support
39
40. Main is BACK
40
@EnableAutoConfiguration @ComponentScan @EnableScheduling
public class MainApp extends RepositoryRestMvcConfiguration {
@Override
protected void configureRepositoryRestConfiguration(
RepositoryRestConfiguration config) {
config.exposeIdsFor(Image.class, Garden.class, Plant.class);
config.setBaseUri(URI.create("/api"));
}
public static void main(String[] args) {
final ConfigurableApplicationContext context =
SpringApplication.run(MainApp.class, args);
...
}
@Bean
MultipartConfigElement multipartConfigElement() { ... } ...
}
41. Security
41
⢠Best strategy in regards to plugging in Spring Security?
⢠Authentication and Authorization
⢠How does it affect Testing
⢠Consider Spring Session
⢠org.springframework.session.web.http.HttpSessionStrategy
⢠HeaderHttpSessionStrategy (x-auth-token)
⢠CookieHttpSessionStrategy
46. AngularJS Modules
⢠Compartmentalize sections of your application
⢠Does not deal with script loading
⢠https://docs.angularjs.org/guide/module
46
angular.module('myModule', []).
config(function(injectables) { // provider-injector
// This is an example of config block.
}).
run(function(injectables) { // instance-injector
// Like a Main method
});
50. File Upload
⢠angular-file-upload (nervgh)
⢠angular-file-upload (danialfarid)
⢠File Reader
⢠Traditional Post
50
51. Š 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Testing
52. Testing
⢠E2E testing with Protractor
⢠Unit Testing using Karma and Jasmine
⢠Consider using SauceLabs
52
53. UI Considerations
Š 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
54. UI Consideration
⢠Bootstrap (It is the baseline)
⢠Keep your CSS maintainable with Less and Sass
⢠Check your production results with YSlow and PageSpeed
⢠Load your site from different corners of the planet using
http://www.webpagetest.org/
54
55. Š 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Resources
57. Videos and More
⢠Angular JS Website - Tutorial, Docs
⢠Angular JS Youtube Channel
⢠ng-conf has almost 30 session videos
⢠Shaping up with Angular JS (Videos + Course)
⢠Dan Wahlin - Videos and Bog
⢠AngularJS Fundamentals In 60-ish Minutes
⢠https://egghead.io/
⢠Ben Nadel Blog
⢠Year of Moo
57
58. Thank You!
58
Source Code + Preso:
https://github.com/ghillert/botanic-ng
Related Talks
Spring 4 Web Applications (R. Stoyanchev)
Deep dive into Spring WebSockets (S. Almar)
Spring Boot for the Web Tier (D. Syer/P. Webb)
Resource Handling in Spring MVC 4.1 (B. Clozel/R. Stoyanchev)
Introducing RaveJS (J. Hann)
Great single page apps need great backends (Adib Saikali)