SlideShare una empresa de Scribd logo
1 de 33
Elevate your webapps with Scala &   Lift




                           @Sander_Mak
About
Coding      at



  Writing              Blog @
                 branchandbound.net




   Speaking
What should a
webframework
do?
Webframeworks
                        should...
     Provide templating
     Show dynamic content
     Handle user input
     Abstract from request/response
     cycle?
     Be highly interactive?


Preferably: concise, performant, secure
Webframeworks
                                should...
                                 Provide templating
Lift is view-first
   Templates pure HTML5 or XHTML
Embed and surround to compose
                                default.html with:
                                <lift:bind name=”content” />




signup.html with:
<lift:surround with=”default”
   name=”content”>
   <form>
   ... signup form ...
   </form>
<lift:surround />
Webframeworks
                  should...
                 Show dynamic content


Pure templates: no code in
templates
            Problem?
Webframeworks
                  should...
                 Show dynamic content


Pure templates: no code in
templates
            Problem?
Webframeworks
                 should...
                Show dynamic content




Snippets transform DOM to DOM
 NodeSeq => NodeSeq
Guarantee: well-formedness,
sanitized
Use {request, session, database}
state
Webframeworks
                                    should...
                                   Show dynamic content




                Snippet                           View

class IndexSnippet {                   .. surrounding html ..

    def date(in: NodeSeq): NodeSeq =   <lift:indexSnippet.date>
     Helpers.bind("b", in,               <div>Current date:
      "date" -> new Date())                <b:date>
                                            10:00:00 1/1/2012
}                                          </b:date>
                                         </div>
                                       </lift:indexSnippet.date>
Webframeworks
                                    should...
                                   Show dynamic content

                            ‘Operators’ and implicit conversions:
                                   “date”.->(new Date())
                                     results in a tuple:
                                    (“date”, new Date())



                Snippet                                        View

class IndexSnippet {                              .. surrounding html ..

    def date(in: NodeSeq): NodeSeq =              <lift:indexSnippet.date>
     Helpers.bind("b", in,                          <div>Current date:
      "date" -> new Date())                           <b:date>
                                                       10:00:00 1/1/2012
}                                                     </b:date>
                                                    </div>
                                                  </lift:indexSnippet.date>
Webframeworks
                                  should...
                                 Show dynamic content




        Snippet (CSS binding)                           View

class CssSnippet {                   .. surrounding html ..

                                     <div class="lift:cssSnippet.date">
    def date: NodeSeq => NodeSeq =    Current date:
     "#date" #> currentDate           <span id="date">10:00:00
                                          1/1/2012</span>
}                                    </div>

                                     .. surrounding html ..
Webframeworks
                                  should...
                                 Show dynamic content


                                     Constructs a function
                                     NodeSeq => NodeSeq




        Snippet (CSS binding)                                View

class CssSnippet {                       .. surrounding html ..

                                         <div class="lift:cssSnippet.date">
    def date: NodeSeq => NodeSeq =        Current date:
     "#date" #> currentDate               <span id="date">10:00:00
                                              1/1/2012</span>
}                                        </div>

                                         .. surrounding html ..
Webframeworks
                                  should...
                                 Show dynamic content


                                   Implicit conversion from
                                 String to ToCssBindPromoter




        Snippet (CSS binding)                              View

class CssSnippet {                      .. surrounding html ..

                                        <div class="lift:cssSnippet.date">
    def date: NodeSeq => NodeSeq =       Current date:
     "#date" #> currentDate              <span id="date">10:00:00
                                             1/1/2012</span>
}                                       </div>

                                        .. surrounding html ..
Webframeworks
                                  should...
                                 Show dynamic content


                                      With HTML5 may also be
                                     data-lift=”cssSnippet.date”




        Snippet (CSS binding)                                  View

class CssSnippet {                          .. surrounding html ..

                                            <div class="lift:cssSnippet.date">
    def date: NodeSeq => NodeSeq =           Current date:
     "#date" #> currentDate                  <span id="date">10:00:00
                                                 1/1/2012</span>
}                                           </div>

                                            .. surrounding html ..
Webframeworks
                          should...
                         Show dynamic content




No MVC:                          MenuSnippet
View <=> Snippet
                                  NewsSnippet
Many <=> Many
                                  FormSnippet
Webframeworks
                   should...
                   Handle user input

 Add server-side behavior to DOM
 ... with snippets
 Behavior captured in closures
  ... managed by Lift, executed after
submit
 Plain and Ajax requests unified
         Primarily
         stateful!
Webframeworks
                                   should...
                                   Handle user input


               Snippet                              View
class FormSnippet {

    def nameForm = {                .. surrounding html ..
     var name = ""                  <form method="POST"
     def processForm() =            class="lift:FormSnippet.nameForm">
          println(name)                  <input id="nameField"
                                               type="text"/>
      "#nameField" #>                    <input id="submitButton"
                                               type="submit"/>
       SHtml.text(name, name = _)   </form>
    &
      "#submitButton" #>            .. surrounding html ..
       SHtml.submit("Click",
                processForm)
    }
}
Webframeworks
                                   should...
                                   Handle user input

                                        Method within method:
               Snippet                                  View
                                    references name in outer scope

class FormSnippet {

    def nameForm = {                    .. surrounding html ..
     var name = ""                      <form method="POST"
     def processForm() =                class="lift:FormSnippet.nameForm">
          println(name)                      <input id="nameField"
                                                   type="text"/>
      "#nameField" #>                        <input id="submitButton"
                                                   type="submit"/>
       SHtml.text(name, name = _)       </form>
    &
      "#submitButton" #>                .. surrounding html ..
       SHtml.submit("Click",
                processForm)
    }
}
Webframeworks
                                   should...
                                   Handle user input
                                                  Equivalent to:
                                    (inputName: String) => name = inputName
               Snippet                                       View
                                          Closure in shorthand format
class FormSnippet {

    def nameForm = {                         .. surrounding html ..
     var name = ""                           <form method="POST"
     def processForm() =                     class="lift:FormSnippet.nameForm">
          println(name)                           <input id="nameField"
                                                        type="text"/>
      "#nameField" #>                             <input id="submitButton"
                                                        type="submit"/>
       SHtml.text(name, name = _)            </form>
    &
      "#submitButton" #>                     .. surrounding html ..
       SHtml.submit("Click",
                processForm)
    }
}
Webframeworks
                                   should...
                                   Handle user input

                                          Combine 2 CSS transforms
                                    into single aggregated transformation
               Snippet                                     View
                                          def &(other: CssSel): CssSel

class FormSnippet {

    def nameForm = {                       .. surrounding html ..
     var name = ""                         <form method="POST"
     def processForm() =                   class="lift:FormSnippet.nameForm">
          println(name)                         <input id="nameField"
                                                      type="text"/>
      "#nameField" #>                           <input id="submitButton"
                                                      type="submit"/>
       SHtml.text(name, name = _)          </form>
    &
      "#submitButton" #>                   .. surrounding html ..
       SHtml.submit("Click",
                processForm)
    }
}
Webframeworks
                        should...
                        Handle user input
   SHtml components: powerful but low-
   level
                   abstractions:
LiftScreen             Wizard

 Declarative             Multipage wizards
 forms                   Backbutton
 Validation              support
 Strongly typed          ‘Conversations’
Webframeworks
      should...
Comet
‘Reverse Ajax’ or ‘server push’
Realtime webapps




        How to model
        this?
Comet
... with actors!
   Asynchronous
   Mailbox serializes processing
   Lightweight
     Event-driven execution     Local state

                                   Behavior




                      mailbox
Comet
   ... with actors!
       Asynchronous
       Mailbox serializes processing
       Lightweight
          Event-driven execution         Local state

   Send message to actor:                 Behavior
actor ! MyMessage(“payload”)




                               mailbox
Comet
                                 Chat demo setup
               Actor

                  ChatServer


CometActor     CometActor              CometActor


  ChatClient      ChatClient              ChatClient
                                 ...



    Browser            Browser              Browser
                                 ...
Scala + Lift =




Abstraction
Scala + Lift =
          Abstraction


    Wiring UI:
Functional/reactive
  programming
Scala + Lift =
              Abstraction




Other abstractions:
 Mapper (ORM)
 Record (NoSQL)
 REST Helper (sync/async)
 Javascript & JSON DSL
Lift vs Play
Powertool




            vs




                 Polished product
Who uses Lift?
Wrapping up
Designer friendly, logic free views
Concise; leverages Scala
Comet/Ajax integration second to none
Mature framework with great community


Relatively steep learning curve
Documentation slowly improving
Stateful, but no session replication
Questions




Code @ bit.ly/jeeconf-lift



                  branchandbound.ne

                  @Sander_Mak

Más contenido relacionado

La actualidad más candente

Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5Stephen Chin
 
Developing modular Java applications
Developing modular Java applicationsDeveloping modular Java applications
Developing modular Java applicationsJulien Dubois
 
Microservices and modularity with java
Microservices and modularity with javaMicroservices and modularity with java
Microservices and modularity with javaDPC Consulting Ltd
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf
 
Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5Stephen Chin
 
JavaFX and HTML5 - Like Curds and Rice
JavaFX and HTML5 - Like Curds and RiceJavaFX and HTML5 - Like Curds and Rice
JavaFX and HTML5 - Like Curds and RiceStephen Chin
 
Moving To The Client - JavaFX and HTML5
Moving To The Client - JavaFX and HTML5Moving To The Client - JavaFX and HTML5
Moving To The Client - JavaFX and HTML5Stephen Chin
 
Weaving Through the Mesh: Making Sense of Istio and Overlapping Technologies
Weaving Through the Mesh: Making Sense of Istio and Overlapping TechnologiesWeaving Through the Mesh: Making Sense of Istio and Overlapping Technologies
Weaving Through the Mesh: Making Sense of Istio and Overlapping TechnologiesVMware Tanzu
 
Developing Mobile HTML5 Apps with Grails
Developing Mobile HTML5 Apps with GrailsDeveloping Mobile HTML5 Apps with Grails
Developing Mobile HTML5 Apps with GrailsGR8Conf
 
Moving to the Client - JavaFX and HTML5 (PowerPoint Version)
Moving to the Client - JavaFX and HTML5 (PowerPoint Version)Moving to the Client - JavaFX and HTML5 (PowerPoint Version)
Moving to the Client - JavaFX and HTML5 (PowerPoint Version)Stephen Chin
 
Spring Boot Revisited with KoFu and JaFu
Spring Boot Revisited with KoFu and JaFuSpring Boot Revisited with KoFu and JaFu
Spring Boot Revisited with KoFu and JaFuVMware Tanzu
 
Discuss about java 9 with latest features
Discuss about java 9 with latest featuresDiscuss about java 9 with latest features
Discuss about java 9 with latest featuresNexSoftsys
 
A Tour of the Modern Java Platform
A Tour of the Modern Java PlatformA Tour of the Modern Java Platform
A Tour of the Modern Java PlatformVMware Tanzu
 
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)Robert Scholte
 
GR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting GrailsGR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting GrailsGR8Conf
 

La actualidad más candente (20)

Modular Java
Modular JavaModular Java
Modular Java
 
Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5
 
Developing modular Java applications
Developing modular Java applicationsDeveloping modular Java applications
Developing modular Java applications
 
Microservices and modularity with java
Microservices and modularity with javaMicroservices and modularity with java
Microservices and modularity with java
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug in
 
Karaf ee-apachecon eu-2012
Karaf ee-apachecon eu-2012Karaf ee-apachecon eu-2012
Karaf ee-apachecon eu-2012
 
Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5Moving to the Client - JavaFX and HTML5
Moving to the Client - JavaFX and HTML5
 
JavaFX and HTML5 - Like Curds and Rice
JavaFX and HTML5 - Like Curds and RiceJavaFX and HTML5 - Like Curds and Rice
JavaFX and HTML5 - Like Curds and Rice
 
Moving To The Client - JavaFX and HTML5
Moving To The Client - JavaFX and HTML5Moving To The Client - JavaFX and HTML5
Moving To The Client - JavaFX and HTML5
 
Weaving Through the Mesh: Making Sense of Istio and Overlapping Technologies
Weaving Through the Mesh: Making Sense of Istio and Overlapping TechnologiesWeaving Through the Mesh: Making Sense of Istio and Overlapping Technologies
Weaving Through the Mesh: Making Sense of Istio and Overlapping Technologies
 
Java 9 and Project Jigsaw
Java 9 and Project JigsawJava 9 and Project Jigsaw
Java 9 and Project Jigsaw
 
Developing Mobile HTML5 Apps with Grails
Developing Mobile HTML5 Apps with GrailsDeveloping Mobile HTML5 Apps with Grails
Developing Mobile HTML5 Apps with Grails
 
MySQL Aquarium Paris
MySQL Aquarium ParisMySQL Aquarium Paris
MySQL Aquarium Paris
 
Moving to the Client - JavaFX and HTML5 (PowerPoint Version)
Moving to the Client - JavaFX and HTML5 (PowerPoint Version)Moving to the Client - JavaFX and HTML5 (PowerPoint Version)
Moving to the Client - JavaFX and HTML5 (PowerPoint Version)
 
Spring Boot Revisited with KoFu and JaFu
Spring Boot Revisited with KoFu and JaFuSpring Boot Revisited with KoFu and JaFu
Spring Boot Revisited with KoFu and JaFu
 
Discuss about java 9 with latest features
Discuss about java 9 with latest featuresDiscuss about java 9 with latest features
Discuss about java 9 with latest features
 
A Tour of the Modern Java Platform
A Tour of the Modern Java PlatformA Tour of the Modern Java Platform
A Tour of the Modern Java Platform
 
Java modules using project jigsaw@jdk 9
Java modules using project jigsaw@jdk 9Java modules using project jigsaw@jdk 9
Java modules using project jigsaw@jdk 9
 
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
 
GR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting GrailsGR8Conf 2011: Adopting Grails
GR8Conf 2011: Adopting Grails
 

Destacado

Cross-Build Injection attacks: how safe is your Java build?
Cross-Build Injection attacks: how safe is your Java build?Cross-Build Injection attacks: how safe is your Java build?
Cross-Build Injection attacks: how safe is your Java build?Sander Mak (@Sander_Mak)
 
Hibernate Performance Tuning (JEEConf 2012)
Hibernate Performance Tuning (JEEConf 2012)Hibernate Performance Tuning (JEEConf 2012)
Hibernate Performance Tuning (JEEConf 2012)Sander Mak (@Sander_Mak)
 
Pitfalls of migrating projects to JDK 9
Pitfalls of migrating projects to JDK 9Pitfalls of migrating projects to JDK 9
Pitfalls of migrating projects to JDK 9Pavel Bucek
 
Java 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawJava 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawComsysto Reply GmbH
 
Google Doc Ch5
Google Doc Ch5Google Doc Ch5
Google Doc Ch5Warren Yip
 
From Collaboration To Social Intelligence
From Collaboration To Social IntelligenceFrom Collaboration To Social Intelligence
From Collaboration To Social Intelligencewww.panorama.com
 
Jonas Lodén - Erfarenheter av att ta fram SEAP i Göteborg
Jonas Lodén - Erfarenheter av att ta fram SEAP i GöteborgJonas Lodén - Erfarenheter av att ta fram SEAP i Göteborg
Jonas Lodén - Erfarenheter av att ta fram SEAP i GöteborgKlimatkommunerna
 
以共融的觀點探討銀髮族節能生活型態之概念設計計畫
以共融的觀點探討銀髮族節能生活型態之概念設計計畫以共融的觀點探討銀髮族節能生活型態之概念設計計畫
以共融的觀點探討銀髮族節能生活型態之概念設計計畫開放式概念發表平臺
 
Software as Service
Software as ServiceSoftware as Service
Software as Serviceabhigad
 
Enhance your microsoft bi stack to drive business user adoption slide share
Enhance your microsoft bi stack to drive business user adoption   slide shareEnhance your microsoft bi stack to drive business user adoption   slide share
Enhance your microsoft bi stack to drive business user adoption slide sharewww.panorama.com
 
Element Design Final Presentation3
Element Design Final Presentation3Element Design Final Presentation3
Element Design Final Presentation3guestdf2bf9
 
Integrating Social Media With Traditional Media
Integrating Social Media With Traditional MediaIntegrating Social Media With Traditional Media
Integrating Social Media With Traditional Mediaparkernow
 
Empower Your Users with Advanced Analytics On-the-Fly
Empower Your Users with Advanced Analytics On-the-FlyEmpower Your Users with Advanced Analytics On-the-Fly
Empower Your Users with Advanced Analytics On-the-Flywww.panorama.com
 
Using Innovation Games To Prioritize Technical Debt Pub
Using Innovation Games To Prioritize Technical Debt PubUsing Innovation Games To Prioritize Technical Debt Pub
Using Innovation Games To Prioritize Technical Debt PubEnthiosys Inc
 

Destacado (20)

Cross-Build Injection attacks: how safe is your Java build?
Cross-Build Injection attacks: how safe is your Java build?Cross-Build Injection attacks: how safe is your Java build?
Cross-Build Injection attacks: how safe is your Java build?
 
Modularity in the Cloud
Modularity in the CloudModularity in the Cloud
Modularity in the Cloud
 
Hibernate Performance Tuning (JEEConf 2012)
Hibernate Performance Tuning (JEEConf 2012)Hibernate Performance Tuning (JEEConf 2012)
Hibernate Performance Tuning (JEEConf 2012)
 
Java modularity: life after Java 9
Java modularity: life after Java 9Java modularity: life after Java 9
Java modularity: life after Java 9
 
Pitfalls of migrating projects to JDK 9
Pitfalls of migrating projects to JDK 9Pitfalls of migrating projects to JDK 9
Pitfalls of migrating projects to JDK 9
 
Java 9 Modularity and Project Jigsaw
Java 9 Modularity and Project JigsawJava 9 Modularity and Project Jigsaw
Java 9 Modularity and Project Jigsaw
 
Google Doc Ch5
Google Doc Ch5Google Doc Ch5
Google Doc Ch5
 
From Collaboration To Social Intelligence
From Collaboration To Social IntelligenceFrom Collaboration To Social Intelligence
From Collaboration To Social Intelligence
 
Jonas Lodén - Erfarenheter av att ta fram SEAP i Göteborg
Jonas Lodén - Erfarenheter av att ta fram SEAP i GöteborgJonas Lodén - Erfarenheter av att ta fram SEAP i Göteborg
Jonas Lodén - Erfarenheter av att ta fram SEAP i Göteborg
 
以共融的觀點探討銀髮族節能生活型態之概念設計計畫
以共融的觀點探討銀髮族節能生活型態之概念設計計畫以共融的觀點探討銀髮族節能生活型態之概念設計計畫
以共融的觀點探討銀髮族節能生活型態之概念設計計畫
 
Fotoalbum TCF
Fotoalbum TCFFotoalbum TCF
Fotoalbum TCF
 
Windows XP
Windows XPWindows XP
Windows XP
 
Software as Service
Software as ServiceSoftware as Service
Software as Service
 
Enhance your microsoft bi stack to drive business user adoption slide share
Enhance your microsoft bi stack to drive business user adoption   slide shareEnhance your microsoft bi stack to drive business user adoption   slide share
Enhance your microsoft bi stack to drive business user adoption slide share
 
Zivana's term 4 E-port
Zivana's term 4 E-portZivana's term 4 E-port
Zivana's term 4 E-port
 
Element Design Final Presentation3
Element Design Final Presentation3Element Design Final Presentation3
Element Design Final Presentation3
 
Integrating Social Media With Traditional Media
Integrating Social Media With Traditional MediaIntegrating Social Media With Traditional Media
Integrating Social Media With Traditional Media
 
Water Disaster
Water DisasterWater Disaster
Water Disaster
 
Empower Your Users with Advanced Analytics On-the-Fly
Empower Your Users with Advanced Analytics On-the-FlyEmpower Your Users with Advanced Analytics On-the-Fly
Empower Your Users with Advanced Analytics On-the-Fly
 
Using Innovation Games To Prioritize Technical Debt Pub
Using Innovation Games To Prioritize Technical Debt PubUsing Innovation Games To Prioritize Technical Debt Pub
Using Innovation Games To Prioritize Technical Debt Pub
 

Similar a Scala & Lift (JEEConf 2012)

Overview of The Scala Based Lift Web Framework
Overview of The Scala Based Lift Web FrameworkOverview of The Scala Based Lift Web Framework
Overview of The Scala Based Lift Web FrameworkIndicThreads
 
Scala based Lift Framework
Scala based Lift FrameworkScala based Lift Framework
Scala based Lift Frameworkvhazrati
 
Please Don't Touch the Slow Parts V3
Please Don't Touch the Slow Parts V3Please Don't Touch the Slow Parts V3
Please Don't Touch the Slow Parts V3Federico Galassi
 
Solution to capture webpage screenshot with html2 canvas.js for backend devel...
Solution to capture webpage screenshot with html2 canvas.js for backend devel...Solution to capture webpage screenshot with html2 canvas.js for backend devel...
Solution to capture webpage screenshot with html2 canvas.js for backend devel...eLuminous Technologies Pvt. Ltd.
 
Rp 6 session 2 naresh bhatia
Rp 6  session 2 naresh bhatiaRp 6  session 2 naresh bhatia
Rp 6 session 2 naresh bhatiasapientindia
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components EverywhereIlia Idakiev
 
A brave new web - A talk about Web Components
A brave new web - A talk about Web ComponentsA brave new web - A talk about Web Components
A brave new web - A talk about Web ComponentsMichiel De Mey
 
Soa development using javascript
Soa development using javascriptSoa development using javascript
Soa development using javascriptDsixE Inc
 
Knockoutjs databinding
Knockoutjs databindingKnockoutjs databinding
Knockoutjs databindingBoulos Dib
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVCAcquisio
 
MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!Roberto Messora
 

Similar a Scala & Lift (JEEConf 2012) (20)

Overview Of Lift Framework
Overview Of Lift FrameworkOverview Of Lift Framework
Overview Of Lift Framework
 
Overview of The Scala Based Lift Web Framework
Overview of The Scala Based Lift Web FrameworkOverview of The Scala Based Lift Web Framework
Overview of The Scala Based Lift Web Framework
 
Scala based Lift Framework
Scala based Lift FrameworkScala based Lift Framework
Scala based Lift Framework
 
Rails入门培训
Rails入门培训Rails入门培训
Rails入门培训
 
Please Don't Touch the Slow Parts V3
Please Don't Touch the Slow Parts V3Please Don't Touch the Slow Parts V3
Please Don't Touch the Slow Parts V3
 
Please dont touch-3.5
Please dont touch-3.5Please dont touch-3.5
Please dont touch-3.5
 
Presentation Tier optimizations
Presentation Tier optimizationsPresentation Tier optimizations
Presentation Tier optimizations
 
React JS .NET
React JS .NETReact JS .NET
React JS .NET
 
Solution to capture webpage screenshot with html2 canvas.js for backend devel...
Solution to capture webpage screenshot with html2 canvas.js for backend devel...Solution to capture webpage screenshot with html2 canvas.js for backend devel...
Solution to capture webpage screenshot with html2 canvas.js for backend devel...
 
Knockoutjs
KnockoutjsKnockoutjs
Knockoutjs
 
React js
React jsReact js
React js
 
DirectToWeb 2.0
DirectToWeb 2.0DirectToWeb 2.0
DirectToWeb 2.0
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 
Rp 6 session 2 naresh bhatia
Rp 6  session 2 naresh bhatiaRp 6  session 2 naresh bhatia
Rp 6 session 2 naresh bhatia
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components Everywhere
 
A brave new web - A talk about Web Components
A brave new web - A talk about Web ComponentsA brave new web - A talk about Web Components
A brave new web - A talk about Web Components
 
Soa development using javascript
Soa development using javascriptSoa development using javascript
Soa development using javascript
 
Knockoutjs databinding
Knockoutjs databindingKnockoutjs databinding
Knockoutjs databinding
 
Planbox Backbone MVC
Planbox Backbone MVCPlanbox Backbone MVC
Planbox Backbone MVC
 
MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!MV* presentation frameworks in Javascript: en garde, pret, allez!
MV* presentation frameworks in Javascript: en garde, pret, allez!
 

Más de Sander Mak (@Sander_Mak)

TypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the painTypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the painSander Mak (@Sander_Mak)
 
The Ultimate Dependency Manager Shootout (QCon NY 2014)
The Ultimate Dependency Manager Shootout (QCon NY 2014)The Ultimate Dependency Manager Shootout (QCon NY 2014)
The Ultimate Dependency Manager Shootout (QCon NY 2014)Sander Mak (@Sander_Mak)
 
Java 7: Fork/Join, Invokedynamic and the future
Java 7: Fork/Join, Invokedynamic and the futureJava 7: Fork/Join, Invokedynamic and the future
Java 7: Fork/Join, Invokedynamic and the futureSander Mak (@Sander_Mak)
 
JDK7: Improved support for dynamic languages
JDK7: Improved support for dynamic languagesJDK7: Improved support for dynamic languages
JDK7: Improved support for dynamic languagesSander Mak (@Sander_Mak)
 
Scala: functional programming for the imperative mind
Scala: functional programming for the imperative mindScala: functional programming for the imperative mind
Scala: functional programming for the imperative mindSander Mak (@Sander_Mak)
 

Más de Sander Mak (@Sander_Mak) (20)

Scalable Application Development @ Picnic
Scalable Application Development @ PicnicScalable Application Development @ Picnic
Scalable Application Development @ Picnic
 
Coding Your Way to Java 13
Coding Your Way to Java 13Coding Your Way to Java 13
Coding Your Way to Java 13
 
Coding Your Way to Java 12
Coding Your Way to Java 12Coding Your Way to Java 12
Coding Your Way to Java 12
 
Java Modularity: the Year After
Java Modularity: the Year AfterJava Modularity: the Year After
Java Modularity: the Year After
 
Modules or microservices?
Modules or microservices?Modules or microservices?
Modules or microservices?
 
Migrating to Java 9 Modules
Migrating to Java 9 ModulesMigrating to Java 9 Modules
Migrating to Java 9 Modules
 
Provisioning the IoT
Provisioning the IoTProvisioning the IoT
Provisioning the IoT
 
Event-sourced architectures with Akka
Event-sourced architectures with AkkaEvent-sourced architectures with Akka
Event-sourced architectures with Akka
 
TypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the painTypeScript: coding JavaScript without the pain
TypeScript: coding JavaScript without the pain
 
The Ultimate Dependency Manager Shootout (QCon NY 2014)
The Ultimate Dependency Manager Shootout (QCon NY 2014)The Ultimate Dependency Manager Shootout (QCon NY 2014)
The Ultimate Dependency Manager Shootout (QCon NY 2014)
 
Akka (BeJUG)
Akka (BeJUG)Akka (BeJUG)
Akka (BeJUG)
 
Fork Join (BeJUG 2012)
Fork Join (BeJUG 2012)Fork Join (BeJUG 2012)
Fork Join (BeJUG 2012)
 
Fork/Join for Fun and Profit!
Fork/Join for Fun and Profit!Fork/Join for Fun and Profit!
Fork/Join for Fun and Profit!
 
Kscope11 recap
Kscope11 recapKscope11 recap
Kscope11 recap
 
Java 7: Fork/Join, Invokedynamic and the future
Java 7: Fork/Join, Invokedynamic and the futureJava 7: Fork/Join, Invokedynamic and the future
Java 7: Fork/Join, Invokedynamic and the future
 
Scala and Lift
Scala and LiftScala and Lift
Scala and Lift
 
Elevate your webapps with Scala and Lift
Elevate your webapps with Scala and LiftElevate your webapps with Scala and Lift
Elevate your webapps with Scala and Lift
 
Hibernate performance tuning
Hibernate performance tuningHibernate performance tuning
Hibernate performance tuning
 
JDK7: Improved support for dynamic languages
JDK7: Improved support for dynamic languagesJDK7: Improved support for dynamic languages
JDK7: Improved support for dynamic languages
 
Scala: functional programming for the imperative mind
Scala: functional programming for the imperative mindScala: functional programming for the imperative mind
Scala: functional programming for the imperative mind
 

Último

AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbuapidays
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Último (20)

AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Scala & Lift (JEEConf 2012)

  • 1. Elevate your webapps with Scala & Lift @Sander_Mak
  • 2. About Coding at Writing Blog @ branchandbound.net Speaking
  • 4. Webframeworks should... Provide templating Show dynamic content Handle user input Abstract from request/response cycle? Be highly interactive? Preferably: concise, performant, secure
  • 5. Webframeworks should... Provide templating Lift is view-first Templates pure HTML5 or XHTML Embed and surround to compose default.html with: <lift:bind name=”content” /> signup.html with: <lift:surround with=”default” name=”content”> <form> ... signup form ... </form> <lift:surround />
  • 6. Webframeworks should... Show dynamic content Pure templates: no code in templates Problem?
  • 7. Webframeworks should... Show dynamic content Pure templates: no code in templates Problem?
  • 8. Webframeworks should... Show dynamic content Snippets transform DOM to DOM NodeSeq => NodeSeq Guarantee: well-formedness, sanitized Use {request, session, database} state
  • 9. Webframeworks should... Show dynamic content Snippet View class IndexSnippet { .. surrounding html .. def date(in: NodeSeq): NodeSeq = <lift:indexSnippet.date> Helpers.bind("b", in, <div>Current date: "date" -> new Date()) <b:date> 10:00:00 1/1/2012 } </b:date> </div> </lift:indexSnippet.date>
  • 10. Webframeworks should... Show dynamic content ‘Operators’ and implicit conversions: “date”.->(new Date()) results in a tuple: (“date”, new Date()) Snippet View class IndexSnippet { .. surrounding html .. def date(in: NodeSeq): NodeSeq = <lift:indexSnippet.date> Helpers.bind("b", in, <div>Current date: "date" -> new Date()) <b:date> 10:00:00 1/1/2012 } </b:date> </div> </lift:indexSnippet.date>
  • 11. Webframeworks should... Show dynamic content Snippet (CSS binding) View class CssSnippet { .. surrounding html .. <div class="lift:cssSnippet.date"> def date: NodeSeq => NodeSeq = Current date: "#date" #> currentDate <span id="date">10:00:00 1/1/2012</span> } </div> .. surrounding html ..
  • 12. Webframeworks should... Show dynamic content Constructs a function NodeSeq => NodeSeq Snippet (CSS binding) View class CssSnippet { .. surrounding html .. <div class="lift:cssSnippet.date"> def date: NodeSeq => NodeSeq = Current date: "#date" #> currentDate <span id="date">10:00:00 1/1/2012</span> } </div> .. surrounding html ..
  • 13. Webframeworks should... Show dynamic content Implicit conversion from String to ToCssBindPromoter Snippet (CSS binding) View class CssSnippet { .. surrounding html .. <div class="lift:cssSnippet.date"> def date: NodeSeq => NodeSeq = Current date: "#date" #> currentDate <span id="date">10:00:00 1/1/2012</span> } </div> .. surrounding html ..
  • 14. Webframeworks should... Show dynamic content With HTML5 may also be data-lift=”cssSnippet.date” Snippet (CSS binding) View class CssSnippet { .. surrounding html .. <div class="lift:cssSnippet.date"> def date: NodeSeq => NodeSeq = Current date: "#date" #> currentDate <span id="date">10:00:00 1/1/2012</span> } </div> .. surrounding html ..
  • 15. Webframeworks should... Show dynamic content No MVC: MenuSnippet View <=> Snippet NewsSnippet Many <=> Many FormSnippet
  • 16. Webframeworks should... Handle user input Add server-side behavior to DOM ... with snippets Behavior captured in closures ... managed by Lift, executed after submit Plain and Ajax requests unified Primarily stateful!
  • 17. Webframeworks should... Handle user input Snippet View class FormSnippet { def nameForm = { .. surrounding html .. var name = "" <form method="POST" def processForm() = class="lift:FormSnippet.nameForm"> println(name) <input id="nameField" type="text"/> "#nameField" #> <input id="submitButton" type="submit"/> SHtml.text(name, name = _) </form> & "#submitButton" #> .. surrounding html .. SHtml.submit("Click", processForm) } }
  • 18. Webframeworks should... Handle user input Method within method: Snippet View references name in outer scope class FormSnippet { def nameForm = { .. surrounding html .. var name = "" <form method="POST" def processForm() = class="lift:FormSnippet.nameForm"> println(name) <input id="nameField" type="text"/> "#nameField" #> <input id="submitButton" type="submit"/> SHtml.text(name, name = _) </form> & "#submitButton" #> .. surrounding html .. SHtml.submit("Click", processForm) } }
  • 19. Webframeworks should... Handle user input Equivalent to: (inputName: String) => name = inputName Snippet View Closure in shorthand format class FormSnippet { def nameForm = { .. surrounding html .. var name = "" <form method="POST" def processForm() = class="lift:FormSnippet.nameForm"> println(name) <input id="nameField" type="text"/> "#nameField" #> <input id="submitButton" type="submit"/> SHtml.text(name, name = _) </form> & "#submitButton" #> .. surrounding html .. SHtml.submit("Click", processForm) } }
  • 20. Webframeworks should... Handle user input Combine 2 CSS transforms into single aggregated transformation Snippet View def &(other: CssSel): CssSel class FormSnippet { def nameForm = { .. surrounding html .. var name = "" <form method="POST" def processForm() = class="lift:FormSnippet.nameForm"> println(name) <input id="nameField" type="text"/> "#nameField" #> <input id="submitButton" type="submit"/> SHtml.text(name, name = _) </form> & "#submitButton" #> .. surrounding html .. SHtml.submit("Click", processForm) } }
  • 21. Webframeworks should... Handle user input SHtml components: powerful but low- level abstractions: LiftScreen Wizard Declarative Multipage wizards forms Backbutton Validation support Strongly typed ‘Conversations’
  • 22. Webframeworks should...
  • 23. Comet ‘Reverse Ajax’ or ‘server push’ Realtime webapps How to model this?
  • 24. Comet ... with actors! Asynchronous Mailbox serializes processing Lightweight Event-driven execution Local state Behavior mailbox
  • 25. Comet ... with actors! Asynchronous Mailbox serializes processing Lightweight Event-driven execution Local state Send message to actor: Behavior actor ! MyMessage(“payload”) mailbox
  • 26. Comet Chat demo setup Actor ChatServer CometActor CometActor CometActor ChatClient ChatClient ChatClient ... Browser Browser Browser ...
  • 27. Scala + Lift = Abstraction
  • 28. Scala + Lift = Abstraction Wiring UI: Functional/reactive programming
  • 29. Scala + Lift = Abstraction Other abstractions: Mapper (ORM) Record (NoSQL) REST Helper (sync/async) Javascript & JSON DSL
  • 30. Lift vs Play Powertool vs Polished product
  • 32. Wrapping up Designer friendly, logic free views Concise; leverages Scala Comet/Ajax integration second to none Mature framework with great community Relatively steep learning curve Documentation slowly improving Stateful, but no session replication
  • 33. Questions Code @ bit.ly/jeeconf-lift branchandbound.ne @Sander_Mak

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. Designer-friendly\n\nDemo master layout\n
  6. \n
  7. \n
  8. \n
  9. Show code: Boot class and IndexSnippet. Explain designer-friendly templating based on code. Start with date example, also table to show multiple lines of output\n
  10. Show code: Boot class and IndexSnippet. Explain designer-friendly templating based on code. Start with date example, also table to show multiple lines of output\n
  11. Show code: Boot class and IndexSnippet. Explain designer-friendly templating based on code. Start with date example, also table to show multiple lines of output\n
  12. Show code: Boot class and IndexSnippet. Explain designer-friendly templating based on code. Start with date example, also table to show multiple lines of output\n
  13. Show code: Boot class and IndexSnippet. Explain designer-friendly templating based on code. Start with date example, also table to show multiple lines of output\n
  14. \n
  15. \n
  16. Show NameSnippet, introduce S object (with notices), stateful part\n
  17. Show NameSnippet, introduce S object (with notices), stateful part\n
  18. Show NameSnippet, introduce S object (with notices), stateful part\n
  19. Show NameSnippet, introduce S object (with notices), stateful part\n
  20. Show NameSnippet, introduce S object (with notices), stateful part\n
  21. Show NameSnippet, introduce S object (with notices), stateful part\n
  22. First show Ajax autocomplete\n
  23. \n
  24. you can have millions of actors per JVM\n
  25. you can have millions of actors per JVM\n
  26. \n
  27. \n
  28. \n
  29. Documentation, err msg/dev experience: Play better\nView-first vs MVC with code in templates + Servlet based vs. custom HTTP stack\nLift: security, more freedom (more rope to hang yourself), Play more handholding\nLift doesn&amp;#x2019;t give one true way\n
  30. \n
  31. \n
  32. \n