5. Agenda Overview of Lift Differentiators and rationale Lift’s architecture Some awesome features A few words from our users
6. What is Lift? Framework for building highly interactiveweb applications 4 years old, founded by David Pollak Heavily leverages Scala language features Takes the best ideas from other frameworks Makes real-time web applications accessible
7. Yet another framework? Developers needn't be plumbers Unifies the best of other framework concepts Granular sessions and security a la Seaside Convention over configuration a la Rails Designer friendly templates a la Wicket Advanced features like comet work OOTB Tough to be truly real-time with existing tech
8. Why Scala for Lift? New breed of JVM language Real-time means events; synergy with Actors Promotes better coding Great libraries Yields more maintainable applications Fewer defects because of immutability & type system Better distribution and parallelism
10. Enterprise Ready ~75m users at the end of 2009 ~6m new users month on month 50m+ tweets daily Services 3x as much traffic with Scala
11. Enterprise Ready ~3m users ~150m “check-ins” All “S.LI.M” stack 14k LOC rewritten in 90 days Service 3x as much traffic compared to LAMP
12. Key Differentiators Unparalleled out of the box security No single vulnerability from the OWASP Top Ten Unique “view first” architecture The best comet support available today All contributions are “rights assigned” Safe for enterprise Assured open source HTTP provider agnostic
17. Lift’s “View First” Model It’s not MVC Your typical page has more than a single piece of dynamic content Code in the view usually means some “seep” of business logic: thus, NO code in the view Designer friendly dynamic content markup Only well-formed XHTML; no string replacement – e.g. {{myvar}}
19. Snippets A “snippet” in Lift represents a collection of rendering logic One snippet can be called on nnumber of pages, n number of times A snippet is a normal Scala class or object Its not magic, its just well designed Essentially NodeSeq => NodeSeq function
21. Statefulvs Stateless So called “share nothing” architecture is flawed. The state is just pushed elsewhere (RDBMS, Cookie) Twitter “fail whale” part of pop culture because “share nothing” didn’t scale Session affinity IS workable for large scale production applications (e.g. foursquare)
22. Security Developers must to work hard to introduce vulnerabilities in their applications Page elements have session-specific opaque GUIDs to reference server components (impossible to do CSRF) AJAX and Comet functions also use similar GUIDs so that sensitive IDs etc are not exposed Persistence is safe from SQL injection
23. Security “Four stars to @foursquare - 1st site in a while I have taken a good look at that didn't have a single security issue (that I could find)” RasmusLerdorf, Inventor of PHP
24. AJAX It’s super simple Just define the desired () => JsCmd callback It’s super secure Randomly maps opaque GUIDs to AJAX urls It abstracts underlying Javascript libraries Currently supports JQuery, YUI and ExtJS Calling JS just becomes a Scala function
26. Comet SpecilizedLiftActor sub-type: CometActor Its just an actor… thing ! Message(whatever) Receiving messages pushes to the browser No magic beans Utilizes long-polling Soon to be auto-detecting web sockets! Multiple comet actors delta updates over a managed browser connections.
29. SiteMap Declarative rules for page access Enforced long before the page content is processed or rendered – it’s very fast. Can generate site menus complete with complex rules based on application state Unified access control model Allows highly componentized functionality
30. Persistence: Mapper ActiveRecord style ORM Good for average size projects Supports most common RDBMS MySQL, PostGRE, MSSQL, Oracle etc OOTB support with other Lift components Generate CRUD interfaces via CRUDify
31. Persistence: Record Completely store agnostic Mongo DB Couch DB Squeryl Keeps the meaning with the bytes Integrates seamlessly with other Lift components such as Wizard Automatic REST
32. Persistence: Record valuser = from(users)(u => where(u.email === email) select(u)) class User extends Record[User] with KeyedRecord[User]{ def meta = User valcountry = new CountryField(this) // rest of definition } object User extends User with MetaRecord[User]
33. Wizard Single and multi-screen page flows Declarative logic Inclusive of validation Automatic persistence via Mapper or Record Fully customizable throughout Making CRUD screens is only one line of code Fully testable divorced from HTTP
34. Wizard object AskAboutIceCreamextends LiftScreen { valflavor = field("What's your favorite Ice cream flavor","", trim, valMinLen(2, "Name too short"), valMaxLen(40, "That's a long name")) def finish(){ S.notice("I like "+flavor.is+" too!") } }
35. REST Services Can be completely stateless Uses a simple DSL …or get close to the metal with full dispatching Lift has awesome support for JSON: Slick DSL for construction / parsing ~300 times faster than Scala JSON parser Faster deserilization than Java Native, first-class XML support in Scala
39. “Lift is the only new framework in the last four years to offer fresh and innovative approaches to web development. It's not just some incremental improvement over the status quo, it redefines the state of the art.” Michael Galpin, eBay
40. “Lift is the kind of web framework that enables you as a developer to concentrate on the big picture. Strong, expressive typing and higher-level features like the built-in Comet support allow you to focus on innovating instead of doing the plumbing.” David LaPalomento, Novell
41. “Foursquare switched over to Scala & Lift last year and we've been thrilled with the results. The ease of developing complex interactive AJAX web pages enabled a very rapid port from our previous platform” Harry Heymann, FourSquare
42. Summary Lift makes the real-time web simple Lift is the culmination of many great ideas and proven methodologies Lift has a new take on web development Lift is effortlessly secure Lift has awesome comet support Lift is already proven in the field