SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Tendances

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
 

Tendances (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
 

En vedette

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
 

En vedette (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
 

Similaire à 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
 

Similaire à 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!
 

Plus 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)
 

Plus 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
 

Dernier

Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
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
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
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
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 

Dernier (20)

Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
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...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
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
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 

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

Notes de l'éditeur

  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