Us • Dave Briccetti • Veteran software developer • Teacher in love with programming • Indrajit Raychaudhuri • Active Lift committer • Hacker trying to do programming
Project • Open Source (Apache 2.0 License) • Ready on a JVM near you • Full Java EE compliance • Works in all modern servlet containers • Batteries included (user replaceable)
Lift • Great support for Comet and AJAX • Great REST Support • Parallel Rendering of Snippets • Lazy Rendering of Snippets serve { case "api" :: "user" :: AsLong(id) :: _ XmlGet _ => <b>ID:{id}</b> case "api" :: "user" :: AsLong(id) :: _ JsonGet _ => JInt(id) }
Lift • Great support for Comet and AJAX • Great REST Support • Parallel Rendering of Snippets • Lazy Rendering of Snippets // HTML <div class="lift:FetchTicker?parallel=true"> Ticker server #1: <span class="ticker">The Ticker</span> </div> // Snippet object FetchTicker { def render = { Thread.sleep(500 millis) // The call ".ticker" #> Thread.currentThread.getName // The result } }
Lift • Great support for Comet and AJAX • Great REST Support • Parallel Rendering of Snippets • Lazy Rendering of Snippets // HTML <div class="lift:LazyLoad"> <span class="lift:LongTime"> I started this computation at <span id="start">start</span> and it completed at <span id="end">end</span>. </span> </div> // Snippet object LongTime { def render = { val start = now Thread.sleep(randomLong(15 seconds)) "#start" #> start.toString & "#end" #> now.toString } }
• Fast path for handling REST/Ajax/Comet • No additional layers (e.g. bolt-on security) • Foursquare and UK Guardian serve millions of pages a day with Lift