Vaadin 

+

XTEND





BRUNO DEVIĆ





Vaadin is a framework for desktop-like Web Apps


SERVER BASED RIA FRAMEWORK

USES GWT AS RENDERING ENGINE

PURE JAVA, NO JAVASCRIPT, NO CONFIGURATION

RICH WIDGETSET







HELLO WORLD

import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;

public class HelloWorld extends UI {
    @Override
    protected void init(VaadinRequest request) {
        VerticalLayout content = new VerticalLayout();
        content.addComponent(new Label("Hello World!"));                                         setContent(content);
    }
}





Thin CLIENT
MVC + JSP


CLIENT SIDE RIA
MVC + EXTJS


SERVER SIDE RIA
VAADIN


EXPERIENCE
  • NOT AS SCALABLE - SESSION SIZE, REQUESTS
  • NO OFFLINE MODE
  • LOOK & FEEL - WIDGETS, LAYOUT OPTIONS, DOM SIZE
  • NEW CODE STRUCTURE - MVP, EVENT BUS

    SIMPLER

    • 100% JAVA
    • Strongly typed - LESS BUGS, DEBUGGING
    • Object oriented - COMPONENTS

    OPEN SOURCE
    • FREE APACHE LICENSE
    • OK DOCUMENTATION - BOOK OF VAADIN, SAMPLER, TRAC     
    LESS OVERHEAD

    • code stays on server
    • no UI SERVICES LAYER
    • FAST DEVELOPMENT - JREBEL

    SERVER SIDE

    • ANY JVM LANGUAGE - GROOVY, SCALADIN
    • ALL JAVA TOOLS AND LIBRARIES - ADDON FOR SPRING, ACTIVITI DEMO
    • SERVLET, PORTLET :) (LIFERAY), OSGi



    VAADIN
    PRO / CONS


    XTEND IS A FLEXIBLE AND EXPRESSIVE DIALECT OF JAVA, WHICH COMPILES INTO READABLE JAVA 5 COMPATIBLE SOURCE CODE

    YOU CAN USE ANY EXISTING JAVA LIBRARY SEAMLESSLY

    THE COMPILED OUTPUT IS READABLE AND TENDS TO RUN AS FAST AS THE EQUIVALENT HANDWRITTEN JAVA CODE


    COFFEESCRIPT FOR JAVA


    JAVA'S TYPE SYSTEM AND LIBRARY

    JAVA'S IDE SUPPORT

    Xtend and Java are

    100% interoperable

    ANDROID AND GWT SUPPORT

    JAVA

     clearBtn.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event)  {
      	  List<Todo> result = new ArrayList<Todo>();
      	  for(Todo  t : getTodos()) {
      		  if(!t.isDone()) {
      			  result.add(t);
      		  }
      	  }
      	  setTodos(result);
        }
    }
    

    XTEND

    clearBtn.addClickHandler [ todos = todos.filter[!done].toList ]
    


    EXTENSION METHODS ENHANCE CLOSED TYPES WITH NEW FUNCTIONALITY

    "hello".toFirstUpper() // calls StringExtensions.toFirstUpper("hello")

    LAMBDA EXPRESSIONS CONCISE SYNTAX FOR ANONYMOUS FUNCTION LITERALS

    Collections::sort(someStrings) [ a, b | a.length - b.length ]

    ACTIVE ANNOTATIONS ANNOTATION PROCESSING ON STEROIDS

    class MyClass {
       @Lazy String myField = expensiveComputation()
    }

    TYPE INFERENCE YOU RARELY NEED TO WRITE DOWN TYPE SIGNATURES ANYMORE

    def getResult() {
        val results = #{"a" -> 1 ,"b" -> 2}
        results.get("a")
    }

    PROPERTIES SHORTHANDS FOR ACCESSING AND DENING GETTERS AND SETTER

    myObj.myProperty // myObj.getMyProperty() (when myObj.myProperty is not visible)

    NO STATEMENTS EVERYTHING IS AN EXPRESSION

    val data = try {
       fileContentsToString(’data.txt’)
    } catch (IOException e) {
       "dummy data"
    }

    TEMPLATE EXPRESSIONS WITH INTELLIGENT WHITE SPACE HANDLING

    def someHTML(List<Paragraph> paragraphs) ’’’
    <html>
      <body>
       «FOR p : paragraphs»
         «IF p.headLine != null»
           <h1>«p.headline»</h1>
         «ENDIF»
         <p>
           «p.text»
         </p>
       «ENDFOR»
      </body>
    </html>

    DEMO


    DECLARATIVE UI / DSL / BUILDER API

    CODE GENERATION



     Q & A 




    Vaadin +XTEND

    By Bruno Dević

    Vaadin +XTEND

    • 706